git:rebase和merge

157 阅读2分钟

在工作中,最常用用到的git命令包括git merge和git reabse。 最烦出现的问题就是冲突问题。
这篇文章来分析这2个命令,看看解决冲突是什么的效果。

git merge

假设有2个分支,dev1和dev2,它们都是从master的同一个commit节点(sha1值为f523d1e)创建出来的分支

这两个分支都分别提提交了2次记录。

dev1的log: dev1.png

dev2的log:

dev2.png

此时,在dev2分支的目录下,合并dev1分支:
git merge dev1
会出现冲突,这时手动编辑冲突的文件,然后git add <冲突的文件>git commit -m "fix merge conflict"
就可以解决冲突了。 解决后冲突的commit链:

截屏2021-12-18 下午8.09.58.png

总结:merge是吧被合并的分支(这里指dev1)的commit记录放到冲突开始的commit节点(这里指f523d1e节点)之后,然后再把自己的commit记录放在被合并的分支的最后一个commit节点之后。然后解决冲突的操作会被当作一个commit节点。
使用git diff fdaaada去查看解决冲突的commit节点,会发现是空白一片。


git rebase

rebase的作用有很多,我常用的命令有:
git fetch origin master && git rebase origin/master (把当前开发分支更新到最新的master分支上)
git rebase -i origin/master(合并commit记录)
具体详细的内容可参考:参考链接

这里来分析一下rebase如果出现冲突是什么效果。 此时的master分支:

截屏2021-12-18 下午8.21.20.png

此时的dev1分支:(在master分支的f523d1e节点上提交了2次) dev1.png

然后master分支也开始提交了自己的commit:

截屏2021-12-18 下午8.26.05.png

然后,现在尝试dev1分支上,rebase master分支: git rebase master
然后出现冲突,编辑完冲突的文件后:git rebase --continue 这时的dev1分支:

截屏2021-12-18 下午8.34.44.png 可以看出来,rebase出现冲突,不会专门为解决冲突创建一个commit记录。


解决冲突的区别

在冲突的文件里,会有冲突的标示:

<<<<<<< HEAD
=======
>>>>>>> 

但是在merge和rebase的冲突里面,这些标示之间的内容是有不同的。
在merge的冲突里,<<<和===之间的内容是当前分支冲突的内容,而 ===和>>>之间的内容是被合并分支冲突的内容。
在rebase的冲突里,<<<和===之间的内容是被rebase分支冲突的内容,而 ===和>>>之间的内容是当前分支冲突的内容。