分支的管理
查詢分支的信息,注意結果中帶星號的是當前分支,也就是說HEAD指向的分支
$ git branch
* master
testing
查看每個分支的最後一次提交
$ git branch -v
* master 4416a2c [ahead 6] fix conflict
testing 7957b99 changed by testing branch
查看已經合併的分支
$ git branch --merged
* master
testing
查看未合併的分支,因為所有分支都合併過了, 所以這個查詢結果是空的
$ git branch --no-merged
如果想刪除沒有合併的分支, 使用branch -d會出現錯誤。強制刪除可以使用branch -D命令
遠程分支
在克隆了一個遠程倉庫或者從遠程倉庫拉取最新版本後,git會在本地為用戶建立一個和遠程一樣的分支,並且也會在本地保存遠程分支的狀態。這樣,如果再本地分支修改後,想要回到剛剛克隆下來時的版本,git可以參照本地保存的遠程分支的狀態返回那時的版本。
遠程分支被他人改動後,如果想把最新的版本取到本地,可以使用fetch命令。
$ git fetch origin
之前介紹過,fetch命令是不會自動把遠程的文件合併到本地文件的。也就是說同名的本地文件和遠程文件內容不一致,它是不會把遠程文件合併到本地文件的。
推送
把本地更改好並且提交的文件推送到遠程倉庫中,可以使用push命令。push命令的一般形式是git push (remote) (branch),這裡的(remote)其實是在克隆遠程倉庫時,git默認為這個遠端倉庫取名為origin。如下面的示例。
$ git push origin master
Enumerating objects: 13, done.
Counting objects: 100% (13/13), done.
Delta compression using up to 4 threads
Compressing objects: 100% (8/8), done.
Writing objects: 100% (12/12), 1.05 KiB | 53.00 KiB/s, done.
Total 12 (delta 3), reused 0 (delta 0)
remote: Resolving deltas: 100% (3/3), done.
To https://github.com/Kutilion/GitTestProject.git
6e2fa09..4416a2c master -> master
如果示例的命令變為git push origin master:testing,則表明將本地master分支推送到遠程分支testing上。區別只是遠程和本地的分支名字不一樣。
跟蹤分支
上邊提到,拉去遠程分支後,會在本地保存遠程分支的狀態,其實是在本地創建了一個跟蹤分支,用於跟蹤遠程分支。本地的分支通過跟蹤分支來與遠程分支進行交互。使用如下命令可以讓本地分支跟蹤遠程分支
$ git checkout --track origin/serverfix
Branch serverfix set up to track remote branch serverfix from origin.
Switched to a new branch 'serverfix'
希望本地分支的名字和遠程分支不一樣,但是還希望本地分支跟蹤遠程分支可以用
$ git checkout -b sf origin/serverfix
Branch sf set up to track remote branch serverfix from origin.
Switched to a new branch 'sf'
可以看到,本地分支sf,跟蹤了遠程服務器origin上的serverfix分支。
查看所有分支的跟蹤信息可以用branch -vv
$ git branch -vv
* master 4416a2c [origin/master] fix conflict
testing 7957b99 changed by testing branch
可以看到,master跟蹤了origin/master分支。這裡有可能出現[origin/master: ahead 3, behind 1]這樣的結果, 說明本地分支有三個提交沒有推送到遠程分支, 遠端有一個提交沒有反應到本地。
拉取
當 git fetch 命令從服務器上抓取本地沒有的數據時,它並不會修改工作目錄中的內容。 它只會獲取數據然後讓你自己合併。
然而, git pull 命令在大多數情況下它的含義是一個 git fetch 緊接著一個git merge 命令。 git pull 都會查找當前分支所跟蹤的服務器與分支,從服務器上抓取數據然後嘗試合併入那個遠程分支。
pull有時候回產生一些讓人困惑的結果, 所以最好還是使用fetch和merge來明確指定拉去和合並。
刪除遠程分支
如下的命令會刪除遠程分支,但是個人更推薦直接到遠程分支服務器上去可視化刪除,更加安全可控。
git push origin --delete master
閱讀更多 一個經驗用十年的碼農 的文章