记录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,不用一个个将提交历史复制过来