Git 是一個很好用的程式碼版本管理工具,不管是前端,後端工程師,都應該要學會 Git 。
安裝 Git
- Ubuntu: sudo apt-get install git
- CentOS, RedHat : sudo yum install git
GitHub設定
接著去 GitHub 申請帳號,並 create Repository ,然後按照網站給的教學來設定吧!!
- git config --global user.name "Your Name"
- git config --global user.email xxx@mail.com
- 建立 private/public key : 就是建立一對密碼,把 private 存到自已電腦的 /home/name/.ssh/id_rsa , 另外一個 public key 存到 github。
- 建立key方式 : ssh-keygen -t rsa -C "xxxm"
- 測試進線 ssh -T git@github.com : 若收到訊息「Hi xxxx! You've successfully authenticated, but GitHub does not provide shell access.」這樣就算成功囉。
- 接著回到你要管理的程式目錄
- git init : 初始化 git,git 會自動建立資料夾 .git/ ,之後的檔案是否有更新,都會從這邊去比對。
再來還是跟著網站說明,上傳一個 README 檔案
- touch README :建立 README
- git add README : 將 README 增入至 git
- git commit -m 'first commit' : commit 至 local git
- git remote add origin git@github.com:xxxx/MyProgram.git 指定我要 commit 到 github server 路徑,以及設定一個 Local branch -> origin
- git push -u origin master : commit local branch origin 到遠端的 master
- 最後回到 GitHub 網站點一下 continue 就完工囉
clone 一份全新的 branch 回來
- git clone https://github.com/puritys/MyProgram.git
如何取消尚未 commit 的 code
在 GIT 中要取消修改,不像 svn 這麼簡單,以前用 svn 都會直接 rm 刪除檔案,然後再重新執行 svn update ,但是在 git 中,如果你直接用 rm 刪除檔案, git 會認定你不要這個檔案了,然後就會出現 deleted file 的狀態。
取消方式是,先用 git status 來檢查有那個檔案被修改過。
- # On branch master
- # Changes not staged for commit:
- # (use "git add <file>..." to update what will be committed)
- # (use "git checkout -- <file>..." to discard changes in working directory)
- #
- # modified: xxx.php
再來使用 git checkout 取消這次的修改,注意指令中間要多加 -- 的符號,如果你要回復到特定的版號,那麼就要補上 vesrion 。
git checkout -- xxx.php
git checkout (version) xxx.php
如果要取消全部的檔案,可以使用下面這句語法,將全部的修改取消掉。
git checkout $(git ls-files --modified)
回復 commit 的 code
先輸入 git log 看看目前 commit 的進度,然後選擇你要回復的 log id ,最後使用 git revert 將程式回復。
- git revert 508bbac0f9f92b971xxxf852c1bb7191d7a62722
如果你已經將 code , add 並 commit 到 local repository ,這時你可以用 git reset 的方式,將程式還原。
- git reset --hard 3d5575f8e4c97ddab8ad5d540fee4664c04db75d
碰到 git auto merged files 有 conflict 時,如果不想處理 conflict,也可以直接用 reset 的方式還原,但要注意你剛剛所修改的程式就不見囉。
GIT merge error “commit is not possible because you have unmerged files”
Merge 其他人的 commit code 回來測試
Github 有一個不錯的功能,就是每個人都能 Fork 一份最新的 code 回去修改,比如現在有 A ,B 兩個人,各有一個 Code Branch , 當 A 修改了一部分 Code 之後, B 可以直接將 A 修改的部分拉回來自已的 Branch 做 Merge,然後等到 B 也測試完畢,再 commit 到 master branch, Merge 的方式是使用 Pull。
- git pull git@github.com:A/project.git master
其它指令
- git remote update : 更新本地端的檔案
- git remote rm origin : 刪除本地端 branch origin
- git diff : 將新改的檔案與本地端的 branch 做 diff
- git diff origin/master: 與 github 上的 code 做 diff
- git branch : 查看目前有多少個 branch
Git Sub Module
Git 還有一個 Sub Module 的功能,這是指一個 Git Project 中用到了第三方的 Git Source Code ,我們可不想把第三方的程式上傳到我們的 Git Project,這時你可以使用,submodule 的方式,將第三方程式碼下載回來。
增加一個 Sub Module
- git submodule add git@github.com:user/third-party-project.git ./lib/third-party
Git clone 時,連Sub Module 也一併下載
- git clone --recursive git://github.com/user/myProject.git
更新 Sub Module
- git submodule update --init --recursive
Git conflict
Please, commit your changes or stash them before you can merge. git
- git stash
- git pull
- git stash pop
diff 本機已 commit 的程式和 git server 上的程式。
- git diff HEAD origin/master
- git log -p -3 (查詢 commit log)
Pull Remote Branch
我 Local 端的 code = git@github.com:myname/source.git (master)
- git pull git@github.com:group/source.git branchName
branch 操作
- 刪除遠端 branch : git push origin --delete dev
- 刪除本地端 branch : git branch -d xxbranch
- 切換 branch: git checkout xxxbranch
清除 git .log
當 git 越用越久,git log 的資料會越來越大,最後造成 git clone 的時間會很長,這時可以用以下指令清除沒用的 log
- git reflog expire --expire=now --all
- git gc --aggressive --prune=now
- git push origin master --force
如何自已當一個 git server
git 的程式,本身就內建可以當一個 git server ,所以你不用額外安裝其它的程式。
首先我們在 server 上先建立一個新的 repository。
- cd /repository/
- git init --bare new_repo
接著回到開發目錄,隨便寫一個 README 檔,然後用類似在 github 上的指令,將檔案 push 到我們自已的伺服器。
- cd /xxx/xx/new_repo
- touch README
- git init
- git add README
- git commit -m "initial commit"
- git remote add origin account@host:/repository/new_repo
- git push origin master
做完之後,再檢查 /repository/new_repo 是不是多了一個 README 的檔案呢。