一個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](http://www.kernel.org/pub/software/scm/git/docs/git-merge.html):
~~~
$ 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](http://www.kernel.org/pub/software/scm/git/docs/git-commit.html)都會失敗:
~~~
$ git commit
file.txt: needs merge
~~~
如果執行?[git status](http://www.kernel.org/pub/software/scm/git/docs/git-status.html)?會顯示這些文件沒有合并(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),只是將當前分支指向合并進來的分支。
- 1. 介紹
- 歡迎使用Git
- GIT對象模型
- Git目錄 與 工作目錄
- Git索引
- 2. 第一步
- 安裝Git
- 安裝與初始化
- 3. 基本用法
- 獲得一個Git倉庫
- 正常的工作流程
- 分支與合并@基礎
- 查看歷史 -Git日志
- 比較提交 - Git Diff
- 分布式的工作流程
- Git標簽
- 4. 中級技能
- 忽略某些文件
- rebase
- 交互式rebase
- 交互式添加
- 儲藏
- Git樹名
- 追蹤分支
- 使用Git Grep進行搜索
- Git的撤消操作 - 重置, 簽出 和 撤消
- 維護Git
- 建立一個公共倉庫
- 建立一個私有倉庫
- 5. 高級技能
- 創建新的空分支
- 修改你的歷史
- 高級分支與合并
- 查找問題的利器 - Git Bisect
- 查找問題的利器 - Git Blame
- Git和Email
- 定制Git
- Git Hooks
- 找回丟失的對象
- 子模塊
- 6. Git生態體系
- Git 與之 Windows
- 使用Git進行系統部署
- 與 Subversion 集成
- 從其他代碼管理工具遷移到Git
- 圖形化的Git
- Git倉庫托管
- Git的其它用法
- Git的腳本支持
- Git 與編輯器
- 7. 原理解析
- Git是如何存儲對象的
- 查看Git對象
- Git引用
- Git索引
- 打包文件
- 更底層的Git
- 傳輸協議
- 術語表