在開發專案時可能會有多人同時commit和push的狀況,很容易有conflict,這時候就需要使用分支來避免conflict。
branch是git中很重要的概念,透過branch可以分流處理不同的問題,也可以進行多人協作,非常方便。
branch可以想像成是原分支的複製版,會繼承目前的commit和前面所有的commit。在新的分支上進行開發的話,不會影響到原本的分支,也不會影響到其他分支。
上圖中可以看到,有main和dev兩個分支,main的commit有C0、C1;dev則是有C0~C4的commit。
要建立分支,可以使用git branch <分支名稱>
來建立。
如果要切換分支,可以使用git checkout <branch>
或git switch <branch>
,圖片上的「」符號代表現在所在分支。
checkout就像是移動標記的指令,透過checkout指令可以移動到想要的位置。此外,checkout同時也有復原的作用。
比較新的git將checkout的功能分開成兩個指令:switch
(移動)和restore
(回復),基本上新舊做法都能使用。
如果要在新建分支的同時切換分支,可以使用git switch -c <branch>
(c for create)或git checkout -b <branch>
。
如果想要將兩條不同分支的內容合併以方便版本管理的話,可以使用git merge <branch>
和git rebase <branch>
的方法。
如上圖,merge
會送出一個特殊的commit,同時繼承自兩條分支的最後一個commit,因此,merge後的main分支可以追溯兩條不同分支的commit。
相對於merge,rebase有點像是把別條分支的commit剪下貼上過來,使用git rebase <目的地分支> <要移動的分支>
(若是要移動目前所在分支,可以不用打後面的部分),可以移動分支。
如上圖,將new-f分支剪下貼上到main分支,new-f分支變成在main的後面,C2也移動過去變成C2'。
若須要更新main分支到new-f的位置,可以用merge或rebase,讓main快速移動到目前所在位置。
git checkout -b <branch名稱>
:建立新branch並切換過去。git branch
:可以看到所有branch。git branch -a
:可以看到remote上所有的branch。
git rebase <要移到哪個分支>
:將branch的進度接回最新進度。git rebase --continue
: 解決衝突後繼續rebase。git branch -d <branch>
: 刪除本地branch。git merge <branch>
: 把目前branch整併回另一個分支。
最後附上圖片中的網站: Learn Git Branch,一個圖像化、可以實作的git學習網站,非常好用!