為什麼需要 branch?
在開發網站的新功能時,有時會需要中途去修一下 bug。如果用一條線的方式開發網站,就會出現「卡在一半的新功能和修好 bug」的不完整網頁。而開啟不同分支去處理不同功能,便可以避免此種狀況。在各自的 branch 完成功能後再 merge 回主要檔案才是完整的檔案。分支的方法也可應用在團隊分工上。
Git branch 相關指令
git branch -v
: 查看目前有哪些分支,並且可以看現在位在哪條分支上。
git branch <branch-name>
:新開分支。
git branch -d <branch-name>
:刪除分支。
git checkout <branch-name>
:切換分支。
git merge <branch-name>
:把分支合併進目前所在的分支。
以上面的示意圖為例,M+A 其實就是位在 master
上,輸入 git merge <ann>
將 A 合併進 M 裡。
git branch -m <new-branch-name>
:想改分支的名稱(需要先切換到要改名稱的分支上)。
git checkout <remote-branch>
:抓遠端的分支。
如果 merge 遇到衝突時該怎麼辦?
總是會有那麼一個不小心,互相改到對方的檔案,造成 merge 時產生衝突。這時也別緊張,Git 很聰明,不會讓你巡遍兩個檔案內容玩大家來找碴。在 merge 發生衝突時,就會跳出警告,而且還會告訴你該怎麼做:fix conflicts and then commit the result.
上圖為打算 merge feature1 進 master,但是 index.html 內容有衝突。
此時可以選擇直接在 git-bash 上 vim index.html
修改:
或是使用慣用的編輯器修改:
兩者都會出現 <<<<<HEAD(目前的分支內容) 和 >>>>>feature1(準備併近來的分支內容),中間會用 ===== 的符號分割開,藉此顯示兩者有衝突的地方跟內容。比較後手動修成正確的版本存檔後,再 commit 就大功告成了。
如果 merge 遇到衝突時該怎麼辦?
而 |||||||| <版本號> 和 ===== 的版本號和之間則為開分支出去的那次 commit 的版本號及內容。可以說是 master 和 feature1 共同的祖先。
在 Git 官網上有詳細介紹(圖片截自上述 Git 官網):
典型的合併會用到的三個快照:要併入的分支、要被併入的分支、兩個分支的共同祖先。