分支
在开发中我们会有许多版本,像是开发版、测试版,测试功能都正常,才会合併到上线版。
分支就像是影分身术的概念,而我们会透过
git
的指令,来取需要分身的部分。
新增分支:git branch 分支名称查看分支:git branch
HEAD
表示目前在哪里,预设是指向master
切换分支:git checkout 分支名称删除分支:git branch -d 分支名称 、-D 是强制删除还原上个版本:git reset HEAD^
HEAD
代表目前位置HEAD^
代表 HEAD 往前一个版本,HEAD^^
代表 HEAD 往前二个版本HEAD~1
代表 HEAD 往前一个版本,HEAD~4
代表 HEAD 往前四个版本
分支合併
Merge
在使用 merge
合併分支的时候,git
预设会以 fast-forward
的模式进行,那什么是 fast-forward
和 no-fast-forward
呢?
fast-forward
git merge 分支名称
Gif 来源:CS Visualized
no-fast-forward
git merge 分支名称 --no-ff
Gif 来源:CS Visualized
可以很清楚的看到同样都是 merge
,使用 no-fast-forward
的模式,会长出小耳朵,可以让成员在日后很清楚辨识不同的 Commit
历程,但小耳朵过多会造成混乱,所以会需要 fast-forward 用来 merge
些较不重要的 Commit
,像是零碎的 bug fix
,保持 Commit
的乾净。
重要的合併用
git merge 分支名称 --no-ff
不重要的合併用git merge 分支名称
冲突
当同时修改同一个档案的同一行code,就会发生冲突,
因为 git
无法知道哪个才是正确的内容,
这时就需要双方沟通,看要用谁的code。
假设我们在 cat
分支修改了 index.html
的内容如下:
然后在 dog
分支刚好也修改了 index.html
,内容如下:
这时候进行合併,发现因为第 9 行重複,所以产生了冲突,
此时状态,已被放置至暂存区。
选要用哪个内容,在跑过一次 Commit
流程,就解决冲突了。
Rebase
从字面上来看,「rebase」是「re」加上「base」,翻成中文大概是「重新定义分支的参考基準」的意思。
合併版本
Gif 来源:CS Visualized
修改历史 commit 纪录
Gif 来源:CS Visualized
使用 Rebase 来合併分支
优点:很自由可以自己决定历史顺序
缺点:有时候恍神失智,忘了自己 Rebase
到哪,
不小心弄坏了还不知道怎么 reset
回来 (¬_¬),
发生冲突时会停在一半,对不熟悉 Rebase
的人来说是个困扰
使用时机
通常在还没有推(Push
)出去但感觉得有点乱(或太琐碎)的 Commit
,可以先使用 Rebase
分支来整理完再推出去。但如同前面提到的,Rebase
等于是修改历史,修改已经推出去的历史可能会对其它人带来困扰,所以对于已经推出去的内容,非必要的话请尽量不要使用 Rebase
。
技术总结:
创立
branch
用git branch 分支名称
切换HEAD
位置git ckeckout 位置
合併到主要版本用git merge 分支名称 --no-ff
整理commit
点 可以用git rebase
和git merge
参考文章
为你自己学 Git
练习 Git
小游戏
Learn Git Branching