在开发专案时可能会有多人同时commit和push的状况,很容易有conflict,这时候就需要使用分支来避免conflict。
branch是git中很重要的概念,透过branch可以分流处理不同的问题,也可以进行多人协作,非常方便。
branch可以想像成是原分支的複製版,会继承目前的commit和前面所有的commit。在新的分支上进行开发的话,不会影响到原本的分支,也不会影响到其他分支。
上图中可以看到,有main和dev两个分支,main的commit有C0、C1;dev则是有C0~C4的commit。
建立branch
要建立分支,可以使用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
如上图,merge
会送出一个特殊的commit,同时继承自两条分支的最后一个commit,因此,merge后的main分支可以追溯两条不同分支的commit。
rebase
相对于merge,rebase有点像是把别条分支的commit剪下贴上过来,使用git rebase <目的地分支> <要移动的分支>
(若是要移动目前所在分支,可以不用打后面的部分),可以移动分支。
如上图,将new-f分支剪下贴上到main分支,new-f分支变成在main的后面,C2也移动过去变成C2'。
若须要更新main分支到new-f的位置,可以用merge或rebase,让main快速移动到目前所在位置。
branch常用指令
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学习网站,非常好用!