鍍金池/ 教程/ Java/ 創(chuàng)建與合并分支
操作標簽
多人協(xié)作
解決沖突
Git 的誕生
工作區(qū)和暫存區(qū)
搭建 Git 服務(wù)器
Bug 分支
配置別名
從遠程庫克隆
分支
添加遠程庫
分支管理策略
撤銷修改
安裝 Git
管理修改
生成 SSH key
GitHub
倉庫狀態(tài)
忽略特殊文件
刪除文件
Feature 分支
創(chuàng)建與合并分支
創(chuàng)建版本庫
創(chuàng)建標簽
版本回退
集中式 vs 分布式

創(chuàng)建與合并分支

在版本回退里,你已經(jīng)知道,每次提交,Git 都把它們串成一條時間線,這條時間線就是一個分支。截止到目前,只有一條時間線,在 Git 里,這個分支叫主分支,即 master 分支。HEAD 嚴格來說不是指向提交,而是指向 master,master 才是指向提交的,所以,HEAD指向的就是當前分支。

一開始的時候,master 分支是一條線,Git 用 master 指向最新的提交,再用 HEAD 指向 master,就能確定當前分支,以及當前分支的提交點:

http://wiki.jikexueyuan.com/project/git-tutorial/images/branch.png" alt="" />

每次提交,master 分支都會向前移動一步,這樣,隨著你不斷提交,master 分支的線也越來越長:

http://wiki.jikexueyuan.com/project/git-tutorial/images/master-branch-forward.gif" alt="" />

當我們創(chuàng)建新的分支,例如 dev 時,Git 新建了一個指針叫 dev,指向 master 相同的提交,再把 HEAD 指向 dev,就表示當前分支在 dev 上:

http://wiki.jikexueyuan.com/project/git-tutorial/images/branch1.png" alt="" />

你看,Git 創(chuàng)建一個分支很快,因為除了增加一個 dev 指針,改改 HEAD 的指向,工作區(qū)的文件都沒有任何變化!

不過,從現(xiàn)在開始,對工作區(qū)的修改和提交就是針對 dev 分支了,比如新提交一次后,dev 指針往前移動一步,而 master 指針不變:

http://wiki.jikexueyuan.com/project/git-tutorial/images/branch2.png" alt="" />

假如我們在 dev 上的工作完成了,就可以把 dev 合并到 master 上。Git 怎么合并呢?最簡單的方法,就是直接把 master 指向 dev 的當前提交,就完成了合并:

http://wiki.jikexueyuan.com/project/git-tutorial/images/branch3.png" alt="" />

所以 Git 合并分支也很快!就改改指針,工作區(qū)內(nèi)容也不變!

合并完分支后,甚至可以刪除 dev 分支。刪除 dev 分支就是把 dev 指針給刪掉,刪掉后,我們就剩下了一條 master 分支:

http://wiki.jikexueyuan.com/project/git-tutorial/images/branch4.png" alt="" />

真是太神奇了,你看得出來有些提交是通過分支完成的嗎?

http://wiki.jikexueyuan.com/project/git-tutorial/images/master-and-dev-ff.gif" alt="" />

下面開始實戰(zhàn)。

首先,我們創(chuàng)建 dev 分支,然后切換到 dev 分支:

$ git checkout -b dev
Switched to a new branch 'dev'

git checkout命令加上-b參數(shù)表示創(chuàng)建并切換,相當于以下兩條命令:

$ git branch dev
$ git checkout dev
Switched to branch 'dev'

然后,用git branch命令查看當前分支:

$ git branch
* dev
  master

git branch命令會列出所有分支,當前分支前面會標一個*號。

然后,我們就可以在 dev 分支上正常提交,比如對 readme.txt 做個修改,加上一行:

Creating a new branch is quick.

然后提交:

$ git add readme.txt 
$ git commit -m "branch test"
[dev fec145a] branch test
 1 file changed, 1 insertion(+)

現(xiàn)在,dev 分支的工作完成,我們就可以切換回 master 分支:

$ git checkout master
Switched to branch 'master'

切換回 master 分支后,再查看一個 readme.txt 文件,剛才添加的內(nèi)容不見了!因為那個提交是在 dev 分支上,而 master 分支此刻的提交點并沒有變:

http://wiki.jikexueyuan.com/project/git-tutorial/images/branch5.png" alt="" />

現(xiàn)在,我們把 dev 分支的工作成果合并到 master 分支上:

$ git merge dev
Updating d17efd8..fec145a
Fast-forward
 readme.txt |    1 +
 1 file changed, 1 insertion(+)

git merge命令用于合并指定分支到當前分支。合并后,再查看 readme.txt 的內(nèi)容,就可以看到,和 dev 分支的最新提交是完全一樣的。

注意到上面的Fast-forward信息,Git 告訴我們,這次合并是“快進模式”,也就是直接把 master 指向 dev 的當前提交,所以合并速度非???。

當然,也不是每次合并都能 Fast-forward,我們后面會將其他方式的合并。

合并完成后,就可以放心地刪除 dev 分支了:

$ git branch -d dev
Deleted branch dev (was fec145a).

刪除后,查看 branch,就只剩下 master 分支了:

$ git branch
* master

因為創(chuàng)建、合并和刪除分支非???,所以 Git 鼓勵你使用分支完成某個任務(wù),合并后再刪掉分支,這和直接在 master 分支上工作效果是一樣的,但過程更安全。

http://wiki.jikexueyuan.com/project/git-tutorial/images/create-dev-merge-delete.gif" alt="" />

小結(jié)

Git 鼓勵大量使用分支:

查看分支:git branch

創(chuàng)建分支:git branch

切換分支:git checkout

創(chuàng)建+切換分支:git checkout -b

合并某分支到當前分支:git merge

刪除分支:git branch -d