在版本回退裡,你已經知道,每次送出,Git都把它們串成一條時間線,這條時間線就是一個分支。截止到目前,隻有一條時間線,在Git裡,這個分支叫主分支,即 master HEAD master master HEAD
分支。
嚴格來說不是指向送出,而是指向
,
才是指向送出的,是以,
指向的就是目前分支。
一開始的時候,
master
分支是一條線,Git用 master
指向最新的送出,再用 HEAD
指向 master
,就能确定目前分支,以及目前分支的送出點:
每次送出,
master
分支都會向前移動一步,這樣,随着你不斷送出, master
分支的線也越來越長:
當我們建立新的分支,例如
dev
時,Git建立了一個指針叫 dev
,指向 master
相同的送出,再把 HEAD
dev
,就表示目前分支在 dev
上:
你看,Git建立一個分支很快,因為除了增加一個
dev
指針,改改 HEAD
的指向,工作區的檔案都沒有任何變化!
不過,從現在開始,對工作區的修改和送出就是針對
dev
分支了,比如新送出一次後, dev
指針往前移動一步,而 master
指針不變:
假如我們在
dev
上的工作完成了,就可以把 dev
合并到 master
上。Git怎麼合并呢?最簡單的方法,就是直接把 master
dev
的目前送出,就完成了合并:
是以Git合并分支也很快!就改改指針,工作區内容也不變!
合并完分支後,甚至可以删除
dev
分支。删除 dev
分支就是把 dev
指針給删掉,删掉後,我們就剩下了一條 master
分支:
真是太神奇了,你看得出來有些送出是通過分支完成的嗎?
下面開始實戰
首先,我們建立
dev
分支,然後切換到
dev
$ git checkout -b dev
Switched to a new branch 'dev'
git checkout
指令加上
-b
參數表示建立并切換,相當于以下兩條指令:
$ 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(+)
現在,
dev
分支的工作完成,我們就可以切換回
master
$ git checkout master
Switched to branch 'master'
切換回
master
分支後,再檢視一個readme.txt檔案,剛才添加的内容不見了!因為那個送出是在
dev
分支上,而
master
分支此刻的送出點并沒有變:
現在,我們把
dev
分支的工作成果合并到
master
分支上:
$ git merge dev
Updating d17efd8..fec145a
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
git merge
指令用于合并指定分支到目前分支。合并後,再檢視readme.txt的内容,就可以看到,和
dev
分支的最新送出是完全一樣的。
注意到上面的
Fast-forward
資訊,Git告訴我們,這次合并是“快進模式”,也就是直接把
master
dev
的目前送出,是以合并速度非常快。
當然,也不是每次合并都能
Fast-forward
,我們後面會講其他方式的合并。
合并完成後,就可以放心地删除
dev
分支了:
$ git branch -d dev
Deleted branch dev (was fec145a).
删除後,檢視
branch
,就隻剩下
master
$ git branch
* master
因為建立、合并和删除分支非常快,是以Git鼓勵你使用分支完成某個任務,合并後再删掉分支,這和直接在
master
分支上工作效果是一樣的,但過程更安全。
小結
Git鼓勵大量使用分支:
檢視分支:
git branch
建立分支:
git branch <name>
切換分支:
git checkout <name>
建立+切換分支:
git checkout -b <name>
合并某分支到目前分支:
git merge <name>
删除分支:
git branch -d <name>
摘錄自:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000