记录git merge由于fast forward引发的commit不干净
问题
- 在一次需求开发完成后提交pr到master,意外发现本来只有30多次的提交变成了,如图
- 在提交记录中找了却找不到有相关的
merge
的commit
信息 - 查看后发现多出来的提交是来源于
develop
分支,但是在个人分支上却始终找不到有合并develop
的记录,后面发现是在vscode
拉代码的时候将develop
分支pull进了个人分支
原因
- 由于项目刚开始迭代不久,没有其他开发分支往
develop
更新内容,开发分支并没有多余的其他代码 - 由于
develop
合并过master
,拥有了master
的全部提交记录,且个人分支是基于master
切出来的,导致develop
和个人分支的最新提交是共同祖先 - 在这种情况下由于
merge
过程中无冲突,git
默认fast forward
(快速模式),导致个人分支不会产生新的提交
解决办法
- 由于不存在相关
merge
的commit
信息,所以无法根据commit_id
来回滚 - 只能从
master
拉一个新的分支出来,把个人分支的提交通过git cherry-pick
复制过来,可以将代码变更和提交记录一起复制过来
具体操作
git cherry-pick <commit_id>
- 可以一次提交多个
commit_id
,git cherry-pick <commit_id> <commit_id>
如何避免?
- 当然是在操作
git
的时候脑袋清醒啦,少失误避免这种低级错误就不会有问题(ps大家吃瓜脸都红了) - 从根源上我们可以使用
git merge --no-ff
通过禁止fast forward
(快进模式),强制每次merge
都会产生提交,这样下次直接通过回滚revert
,不用一个个将提交历史复制过来