本文为学习笔记,并非原创。原文链接,原文发表于2020-11-15
本篇文章写得真的不错,建议全文阅读。这里只记我不熟悉的地方。
commit节点、HEAD和分支
每次commit都会生成一个节点,节点内容是本次及本次之前所有提交的内容。
不管HEAD还是分支,都是对一个commit节点的引用。因为只是引用,所以它们非常轻量。引用+节点是git构成分布式的关键。
HEAD是一个引用,它可以指向任意一个节点。其指向的节点始终为当前工作目录,换句话说就是当前工作目录(也就是你看到的代码)就是HEAD指向的节点
分支也可以视为一个引用,分支指向一个节点时,该节点的内容就是分支的内容。
分支可以存在多个,而HEAD只有一个。
合并
merge
git merge 分支名/节点哈希值 //将指定分支或节点的内容合并至HEAD
如果要合并的内容完全领先于当前分支,如下图中在ft-2
上执行git merge ft-1
,则会触发fast-foward(快速合并),此时两个分支指向统一节点。
但实际情况中,往往遇到的是下图中的情况。这种就不能直接合并了,在ft-2
上执行git merge ft-1
,会将节点C3
、C4
直接合并后生成一个C5
节点,最后将ft-2
指向C5
。
注意:如果
C3
和C4
修改了同一个文件的同一行,这个时候合并会出错,git并不知道以谁为准,需要自己手动合并代码。
rebase
git rebase 分支名/节点哈希值
rebase
看起来不会产生新的节点,但实际上是将节点复制为一个新的节点,如下图:
上图左边的ft-1
分支上执行git merge master
后,会将C4
节点复制一份到C3
后面,也就是C4'
。C4'
与C4
相对应,但是哈希值并不一样。
rebase
相比于merge
,提交历史更加线性、干净,使并行的开发流程看起来像串行,更符合我们的直觉。
merge和rebase的优缺点
merge优缺点
- 优点:每个节点都是严格按照时间排列。当合并发生冲突时,只需要解决两个分支所指向的节点的冲突即可。
- 缺点:合并两个分支时,大概率会生成新的节点并分叉,久而久之提交历史会变成乱麻。
rebase优缺点
-
优点:会使提交历史看起来线性、干净
-
缺点:虽然提交看起来是线性的,但不是真的按时间顺序。当合并发生冲突时,有几个节点rebase到当前分支,就有可能要处理几次冲突。
cherry-pick
假设当前分支是master
,执行了git cherry-pick C3(哈希值),C4(哈希值)
命令后会直接将C3
、C4
节点抓过来放在后面,对应C3'
和C4'
Comments
comments powered by Disqus