小明發現在實際項目開發過程中,總會遇到各種各樣的情況,比如一個大型的項目或版本疊代可能不是一次上線,可能會分好幾次上線,這時候就會涉及建立多個分支,分别開發。
産品經理:我們本次開發三個功能,清單頁功能、詳情頁功能、系統消息功能,分兩次上線,先上清單功能,再上詳情頁和系統消息。
小明:好的吧。
緊接着,小明就将本次需求分為2個分支,分别為A、B。
A:開發清單頁功能
B:開發詳情頁功能、系統消息功能
原計劃:産品經理說先上清單功能,那小明就先開發A分支,清單功能很快開發完成(厲害吧)。
計劃有變:風雲變幻,第二天小明按照計劃開發B分支,開發到一半,産品經理突然說目前的系統消息功能(位于B分支)比較緊急,需要和清單功能(位于A分支)一起上線,當時小明就懵逼了。趕緊暫停開發詳情頁(位于B分支,雖然已經開發了一部分),轉戰系統消息功能的開發。當系統消息功能開發完成之後,就需要考慮将系統消息功能(位于B分支)和清單功能(位于A分支)放在一個分支上提測(開發一部分的詳情頁功能暫先不需要合并)的問題,這時候分支合并就要派上用場了。
說起分支合并,大家第一個想到的指令肯定是<code>git merge</code> ,因為這是分支合并的常用指令。
使用<code>git merge</code> 合并分支會将兩個分支的所有内容進行比較合并,是以我們如果想合并兩個分支中的一部分,顯然直接使用這個指令是行不通的。
So what happens next ? 嘿嘿,有兩種方案可供我們選擇:
從其他分支<code>merge</code>指定檔案到目前分支,<code>git checkout</code>是個合适的工具。
文法如下:
我們使用git checkout 将B分支上的系統消息功能添加到A分支上
合并完成
但是……
注意:在使用git checkout某檔案到目前分支時,會将目前分支的對應檔案強行覆寫
是以,合并A分支上沒有存在的檔案沒問題,但是如果合并A分支上原先就存在的檔案(比如兩個分支上都對other.js進行過修改),位于分支A上的檔案other.js就會被checkout(分支B)過來的other.js覆寫,導緻分支A上之前開發的清單功能付之東流,這樣做肯定是優雅的!
那如何避免同一個檔案不強制覆寫,有沒有更好的解決方案呢(調一下味口)?我們一起來看一下第二種方案。
思路:曲線救國,我們通過git merge 強大的分支合并功能來完成此次無縫合并。
首先使用<code>git checkout</code>根據A分支建立一個A_temp分支(避免影響A分支)
然後将B分支合并到A_temp分支,此時兩個都經修改過的檔案會跑出沖突,我們隻需解決沖突即可。
再次切換到A分支,并使用git checkout 将A_temp分支上的系統消息功能相關檔案或檔案夾覆寫到A分支,此時可以大膽的覆寫!因為我們已經在第二步處理過沖突問題。
最後,有強迫症的患者可以卸磨殺驢,把剛剛根據分支A建立的A_temp删除。
OK,到此分支合并就完結了,現在我們就可以自信地召喚産品經理(我們公司産品兼測試)測試這兩個功能。
另外給大家介紹一下<code>git merge</code> 使用的小技巧
舉例:要把<code>master</code>分支合并到<code>dev</code>分支
預設使用<code>merge</code>指令是<code>ff</code>,即 <code>fast-forward</code>,這種方式從Git 合并曆史中是無法檢視到是哪幾個送出對象在一起實作了一個功能。
而<code>--no-ff</code> 标記會在分支合并的時候,建立一個新的送出對象,可以避免丢失<code>master</code>分支的曆史資訊,并且把所有的功能疊加在一起送出上去。兩者的差別如下圖所示,大家可以自己體驗一下兩者的差別。

以上就是小明工作中使用git合并總結的經驗,希望能幫助到大家,僅供參考,有錯誤請指出,謝謝!
歡迎關注微信公衆号”程式員小明”,擷取更多資源。