git merge 和 git merge --no-ff 的区别
git merge 和 git merge --no-ff 的区别
![](https://img2023.cnblogs.com/blog/1891336/202304/1891336-20230425144227211-1866353870.png)
fast-forward(默认)
- Git 合并两个分支时,如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移,叫做“快进”(fast-forward)
- 不过这种情况如果删除分支,则会丢失 merge 分支信息
--squash
- 把一些不必要
commit
进行压缩
feature 在开发的时候写的commit很乱,合并的时候不希望把这些历史commit带过来,于是使用
–squash
进行合并,此时文件已经同合并后一样了,但不移动HEAD,不提交需要进行一次额外的commit来“总结”一下,然后完成最终的合并
--no-ff
-
关闭
fast-forward
模式,在提交的时候,会创建一个merge的commit信息,然后合并到master分支 -
merge的不同行为
- 向后看,其实最终都会将代码合并到master分支,而区别仅仅只是分支上的简洁清晰的问题
- 向前看,也就是使用
reset
时会发现,不同的行为就带来了不同的影响
使用 merge --no-ff 的效果
-
此时
git reset HEAD^ --hard
整个分支将回退到Merge branch 'zhou' into dev
使用 merge fast-forward(默认) 的效果
-
此时
git reset HEAD^ --hard
整个分支将回退到add read2
修正 fast-forword 的提交线想要得到效果
![](https://img2023.cnblogs.com/blog/1891336/202304/1891336-20230425150659421-1041689874.png)
git log
找到要回退到的提交点(dev)
![](https://img2023.cnblogs.com/blog/1891336/202304/1891336-20230425150713669-1431053778.png)
git reset --hard ...
回退本地的dev版本git push origin dev --force
强制回退远程的dev版本git merge luo --no-ff
git push origin dev