前言
上一節我們重點分析過Git的工作區、暫存區以及主分支區,主分支區其實就相當於我們的正式版,正式版版本有什麼特性呢?
很穩定對吧!因此在實際開發中,我們肯定是不能直接將我們修改的內容Commit到主分支上去的吧?大家試想一下,假設我們玩DOTA正式服,遊戲已經開始了,正當你Penta Kill的時候,後臺在維護DOTA的程序猿一股腦的把剛剛寫完修改好的程序直接提交到主分支,結果還是個有Bug的程序,導致你直接掉線?鬱悶吧!
因此,當我們還在開發的時候,是不能直接提交代碼到主分支master上,而是提交到開發分支dev,那麼本節咱們就來學習如何創建分支,在不同分支上切換以及分支的合併。
創建與合併分支
在版本回退裏,你已經知道,每次提交,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分支:
原理弄清楚了,咱們就來看看如何用代碼來實現上面的功能吧!
在此之前,給大家整理了分支管理的相關命令,大家可以先熟悉一下再往下看。
指令 | 解釋 |
---|---|
git checkout -b dev | 創建dev 分支並切換到dev分支 |
git branch dev | 創建dev分支 |
git checkout dev | 切換到dev分支 |
git merge dev | 合併分支 |
git branch -d dev | 刪除分支的命令 |
第一步:創建dev分支,然後切換到dev分支:
使用$ git checkout -b dev
指令創建並切換到dev開發分支,這個操作等同於git branch dev (創建dev分支)
以及git checkout dev (切換到dev分支)
這兩個步驟
Marco@Marco-Laptop MINGW64 /d/git/repository (master)
$ git checkout -b dev #創建並切換到dev開發分支
Switched to a new branch 'dev'
第二步:用git branch命令查看當前分支:
可以看出來我們的dev分支已經創建成功了!
Marco@Marco-Laptop MINGW64 /d/git/repository (dev)
$ git branch
* dev #開發分支
master #主分支
git branch
命令會列出所有分支,當前分支前面會標一個*號。
然後,我們就可以在dev分支上正常提交,比如對tuofeilun.txt
做個修改,加上一行
第三步:修改txt文件並提交到dev分支:
Marco@Marco-Laptop MINGW64 /d/git/repository (dev)
$ cat tuofeilun.txt #修改文件並查看文件的內容
歌名:《陀飛輪》
填詞:黃偉文
譜曲:Vincent Chow
歌曲原唱:陳奕迅
過去十八歲 沒戴錶 不過有時間
夠我 沒有後顧 野性貪玩
霎眼廿七歲 時日無多方不敢偷懶
宏願縱未了 奮鬥總不太晚 然後突然今秋
望望身邊 應該有 已盡有...
我想去看Eason的演唱會!!!!
Eason真的太帥啦!!!
Marco@Marco-Laptop MINGW64 /d/git/repository (dev)
$ git add tuofeilun.txt #添加文件到暫存倉庫
Marco@Marco-Laptop MINGW64 /d/git/repository (dev)
$ git commit -m "在dev上修改tuofeilun.txt" #提交文件到dev分支
[dev 020a90a] 在dev上修改tuofeilun.txt
1 file changed, 2 insertions(+), 1 deletion(-)
第四步:切換到master上查看:
使用指令$ git checkout master
進行切換
Marco@Marco-Laptop MINGW64 /d/git/repository (dev)
$ git checkout master #切換到master分支
Switched to branch 'master'
切換之後咱們,再查看tuofeilun.txt
文件,發現剛纔添加的內容不見了!
因爲那個提交是在dev分支上,而master分支此刻的提交點並沒有變,此時master上的HEAD指針依然停留在未修改之前,這和VMware中的快照有點類似。
第五步:合併dev分支
現在,我們把dev分支的工作成果合併到master分支上之後,我們再來看看master裏面的內容是否改變
Marco@Marco-Laptop MINGW64 /d/git/repository (master)
$ git merge dev #在master上合併dev分支
Updating 84af54b..020a90a
Fast-forward
tuofeilun.txt | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
很明顯,master分支裏面的內容已經改變了對吧?git merge
命令就是用於合併指定分支到當前分支。因此合併後,我們再查看之前文件的的內容,就可以看到,和dev分支的最新提交是完全一樣的。
第六步:創建dev分支,然後切換到dev分支:
細心的朋友可能會注意到當我們執行git merge dev
命令後,會出現Fast-forward
信息,這表示這次合併是“快進模式”,也就是直接把master指向dev的當前提交,所以合併速度非常快。
合併完成後,就可以放心地使用git branch -d dev
刪除dev分支了啦!刪除之前記得切換到master分支哦!
Marco@Marco-Laptop MINGW64 /d/git/repository (master)
$ git branch -d dev #刪除dev分支
Deleted branch dev (was 020a90a).
解決合併分支的衝突問題
萬事萬物被強行合併之後都會有互斥的現象發生,當然我們這裏的分支合併也不例外,爲什麼這麼說呢?
我們還是接着上面的栗子來講吧!
我這邊先創建並切換到dev分支,並master分支上修改文件的內容
Marco@Marco-Laptop MINGW64 /d/git/repository (dev)
$ cat tuofeilun.txt
歌名:《陀飛輪》
填詞:黃偉文
譜曲:Vincent Chow
歌曲原唱:陳奕迅
過去十八歲 沒戴錶 不過有時間
夠我 沒有後顧 野性貪玩
霎眼廿七歲 時日無多方不敢偷懶
宏願縱未了 奮鬥總不太晚 然後突然今秋
望望身邊 應該有 已盡有...
dev marco --- 留言:我喜歡Eason的《傾城》
然後,依次add到暫存區,然後commit到master分支上
Marco@Marco-Laptop MINGW64 /d/git/repository (dev)
$ git add tuofeilun.txt
Marco@Marco-Laptop MINGW64 /d/git/repository (dev)
$ git commit -m "在dev上修改tuofeilun.txt文件"
[dev 92d432f] 在dev上修改tuofeilun.txt文件
1 file changed, 2 insertions(+), 1 deletion(-)
接着切換到master分支並修改文件的內容
並依次add到暫存區,然後commit到master分支上
此時dev上commit的文件內容和master上的文件內容是不一致的,並且內容存在 “衝突” ,我們來看看會有什麼效果!
Marco@Marco-Laptop MINGW64 /d/git/repository (master)
$ git merge dev #合併分支
Auto-merging tuofeilun.txt
CONFLICT (content): Merge conflict in tuofeilun.txt
Automatic merge failed; fix conflicts and then commit the result.
CONFLICT (content): Merge conflict in tuofeilun.txt
顯示合併時有衝突產生?
如果出現這種情況就必須手動去更新裏面的內容,然後再次commit提交,Git用<<<<<<<
,=======
,>>>>>>>
標記出不同分支的內容,大家注意看後面藍色括號裏的內容,剛開始合併出現衝突的時候,括號裏的內容是(master|MERGING)
,再重新提交到master分支區之後,才變回(master)
證明合併已經完成了!
小結
當Git無法自動合併分支時,就必須首先解決衝突。解決衝突後,再提交,合併完成。解決衝突就是把Git合併失敗的文件手動編輯爲我們希望的內容,再提交。用git log --graph
命令可以看到分支合併圖。