# 记录git merge由于fast forward引发的commit不干净

# 问题

  • 在一次需求开发完成后提交pr到master,意外发现本来只有30多次的提交变成了,如图
  • 在提交记录中找了却找不到有相关的mergecommit信息
  • 查看后发现多出来的提交是来源于develop分支,但是在个人分支上却始终找不到有合并develop的记录,后面发现是在vscode拉代码的时候将develop分支pull进了个人分支

# 原因

  • 由于项目刚开始迭代不久,没有其他开发分支往develop更新内容,开发分支并没有多余的其他代码
  • 由于develop合并过master,拥有了master的全部提交记录,且个人分支是基于master切出来的,导致develop和个人分支的最新提交是共同祖先
  • 在这种情况下由于merge过程中无冲突,git默认fast forward(快速模式),导致个人分支不会产生新的提交

# 解决办法

  • 由于不存在相关mergecommit信息,所以无法根据commit_id来回滚
  • 只能从master拉一个新的分支出来,把个人分支的提交通过git cherry-pick复制过来,可以将代码变更和提交记录一起复制过来

# 具体操作

  • git cherry-pick <commit_id>
  • 可以一次提交多个commit_idgit cherry-pick <commit_id> <commit_id>

# 如何避免?

  • 当然是在操作git的时候脑袋清醒啦,少失误避免这种低级错误就不会有问题(ps大家吃瓜脸都红了)
  • 从根源上我们可以使用git merge --no-ff通过禁止fast forward(快进模式),强制每次merge都会产生提交,这样下次直接通过回滚revert,不用一个个将提交历史复制过来
Last Updated: 9/8/2023, 8:22:31 AM