Marco's Java【Git入門(三) 之 Git分支管理(創建與合併分支)】

前言

上一節我們重點分析過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命令可以看到分支合併圖。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章