作为几年的开发者,会用merge但是不很清楚和rebase的区别,有点尴尬,今天查了一下资料,大概了解了一下,现在详细讲解一下这两者用法以及区别。

master merge
分支2 和master
现在在master分支上执行
Git merge 2
Yong:git_02 Yong$ git merge 2
Auto-merging 1.txt
CONFLICT (content): Merge conflict in 1.txt
Automatic merge failed; fix conflicts and then commit the result.
Yong:git_02 Yong$
报错了,因为我们修改的是同一个文件的相同位置,所以会冲突。
我们修改好这个冲突文件,冲突文件是:

下图是打开文件冲突内容:

上边是
HEAD
分支的内容,=====
下边是2分支的内容,项目中根据实际情况作出取舍。修改成:

修改完之后进行提交:
Yong:git_02 Yong$ git add .
Yong:git_02 Yong$ git commit -a -m 'fix conflict'
[master b02486a] fix conflict
Yong:git_02 Yong$
提交后分支记录为:

然后我们切换成
checkout 2
查看内容,
对,没看错,分支2还是原来的内容。那小伙伴该有什么疑问呢?刚才我们合并产生冲突了,而且冲突已经修复了,修复之后的内容是
5
,那么为什么branch 2
内容没变呢?因为我们是在master
上merge
的,分支2合并到了master,master上有master和分支2的内容,但是分支2的代码没变。我们在看一下 master
的内容:
所以我们多人合作开发的时候,产生冲突了,然后又用merge合并了分支,把冲突改好了最后也提交了,下一个任务来的时候,还是基于自己的老分支开发,等任务结束的时候,合并分支发现?怎么冲突还在?解决这个问题的 话,每次新的任务都从稳定的
dev
new 一个分支出来,在新的分支开发任务,这样子,每次切出来的分支都是一个新的分支,而且是有同事提交的代码的。不会之前的冲突,下次提交的时候也冲突第二次。
或者旧的任务完成了,分支2 要git pull origin master
,保持自己分支是最新的内容。
那么我们现在将分支2的内容改成
1234
5
然后在master
分支上
git merge 2
冲突了:

打开冲突看一下,原来第一次合并冲突在分支2中的内容并没有修改,然后新增了一行5,导致旧版本
1234
和5
都冲突了。
master rebase


修改成:

然后执行:
git rebase --continue
第二次冲突:

冲突修改完成了,结果如图:

解决完冲突:

然后我们在分支branch2
上修改文件:
旧版:

旧版和新版对比:
所有节点在一条线上,说明合并到了一个分支上,重合的节点内容是一致的。branch2
上的内容还是旧版内容,开发新的任务需要从新pull或者 从dev
新切除分支来解决内容不同步问题。
然后从branch2
作出修改:
然后在其中branch2
分支上 修改,提交,生成一个新的节点,从master上出来的。

然后在
rebase
的基础上进行merge
操作,差异很明显。

$ git log --graph --pretty=oneline --abbrev-commit
* d6ce4b2 (HEAD -> master) merge from 2
|\
| * 9e7c360 (2) 1.txt add line
* | 206cfd1 add6
* | e67db5a 1_m
|/
* 91052c8 4
* a8331c2 3
* 680986b 2
* e6a896f 1.txt
其实rebae就是按照时间线的前后顺序进行合并,a分支和b分支,
a rebase b
,b的最后一个节点分别和a节点进行对比和合并。a和b合并成一条线。
a merge b
只是a分支和b分支最后一个提交节点进行对比合并,中间的节点不进行对比和合并。所以合并结果是2条线。
参考资料:
网友评论