一個Git倉庫可以維護很多開發分支。現在我們來創建一個新的叫”experimental”的分支:
$ git branch experimental
如果你運行下面這條命令:
$ git branch
你會得到當前倉庫中存在的所有分支列表:
experimental
* master
“experimental” 分支是你剛才創建的,“master”分支是Git系統默認創建的主分支。星號(“*”)標識了你當工作在哪個分支下,輸入:
$ git checkout experimental
切換到”experimental”分支,先編輯里面的一個文件,再提交(commit)改動,最后切換回 “master”分支。
(edit file) $ git commit -a $ git checkout master
你現在可以看一下你原來在“experimental”分支下所作的修改還在不在;因為你現在切換回了“master”分支,所以原來那些修改就不存在了。
你現在可以在“master”分支下再作一些不同的修改:
(edit file)
$ git commit -a
這時,兩個分支就有了各自不同的修改(diverged);我們可以通過下面的命令來合並“experimental”和“master”兩個分支:
$ git merge experimental
如果這個兩個分支間的修改沒有沖突(conflict), 那么合並就完成了。如有有沖突,輸入下面的命令就可以查看當前有哪些文件產生了沖突:
$ git diff
當你編輯了有沖突的文件,解決了沖突后就可以提交了:
$ git commit -a
提交(commit)了合並的內容后就可查看一下:
$ gitk
執行了gitk后會有一個很漂亮的圖形的顯示項目的歷史。
這時你就可以刪除掉你的 “experimental” 分支了(如果願意):
$ git branch -d experimental
git branch -d只能刪除那些已經被當前分支的合並的分支. 如果你要強制刪除某個分支的話就用git branch –D;下面假設你要強制刪除一個叫”crazy-idea”的分支:
$ git branch -D crazy-idea
分支是很輕量級且容易的,這樣就很容易來嘗試它。
如何合並
你可以用下面的命令來合並兩個分離的分支:git merge:
$ git merge branchname
這個命令把分支"branchname"合並到了當前分支里面。如有沖突(沖突--同一個文件在遠程分支和本地分支里按不同的方式被修改了);那么命令的執行輸出就像下面一樣
$ git merge next 100% (4/4) done Auto-merged file.txt CONFLICT (content): Merge conflict in file.txt Automatic merge failed; fix conflicts and then commit the result.
在有問題的文件上會有沖突標記,在你手動解決完沖突后就可以把此文件添 加到索引(index)中去,用git commit命令來提交,就像平時修改了一個文件 一樣。
如果你用gitk來查看commit的結果,你會看到它有兩個父分支:一個指向當前 的分支,另外一個指向剛才合並進來的分支。
解決合並中的沖突
如果執行自動合並沒有成功的話,git會在索引和工作樹里設置一個特殊的狀態, 提示你如何解決合並中出現的沖突。
有沖突(conflicts)的文件會保存在索引中,除非你解決了問題了並且更新了索引,否則執行 git commit都會失敗:
$ git commit
file.txt: needs merge
如果執行 git status 會顯示這些文件沒有合並(unmerged),這些有沖突的文件里面會添加像下面的沖突標識符:
<<<<<<< HEAD:file.txt Hello world ======= Goodbye >>>>>>> 77976da35a11db4580b80ae27e8d65caf5208086:file.txt
你所需要的做是就是編輯解決沖突,(接着把沖突標識符刪掉),再執行下面的命令:
$ git add file.txt
$ git commit
注意:提交注釋里已經有一些關於合並的信息了,通常是用這些默認信息,但是你可以添加一些你想要的注釋。
上面這些就是你要做一個簡單合並所要知道的,但是git提供更多的一些信息來 幫助解決沖突。
撒銷一個合並
如果你覺得你合並后的狀態是一團亂麻,想把當前的修改都放棄,你可以用下面的命令回到合並之前的狀態:
$ git reset --hard HEAD
或者你已經把合並后的代碼提交,但還是想把它們撒銷:
$ git reset --hard ORIG_HEAD
但是剛才這條命令在某些情況會很危險,如果你把一個已經被另一個分支合並的分支給刪了,那么 以后在合並相關的分支時會出錯。
快速向前合並
還有一種需要特殊對待的情況,在前面沒有提到。通常,一個合並會產生一個合並提交(commit), 把兩個父分支里的每一行內容都合並進來。
但是,如果當前的分支和另一個分支沒有內容上的差異,就是說當前分支的每一個提交(commit)都已經存在另一個分支里了,git 就會執行一個“快速向前"(fast forward)操作;git 不創建任何新的提交(commit),只是將當前分支指向合並進來的分支。
