Git合并dev到main后此前被revert的两个提交未同步,如何处理?
问题根因
你之前将dev合并到main后,在main分支执行对应两个提交的revert操作时,git会将这两个revert生成的提交纳入main的提交历史,默认标记「这两个提交的改动已经被主动弃用」。后续再次合并dev分支时,git检测到那两个原始提交已经存在于main的提交链路中,就不会重复应用它们的改动,因此你看不到对应的变更。
解决方案
方案1:在main分支反向撤销之前的revert操作(最安全,优先推荐)
该方案不会修改任何分支的历史提交,适合多人协作的公共仓库场景:
- 先切换到本地main分支并同步最新远程代码:
git checkout main && git pull origin main - 查找之前在main分支执行revert时生成的两个revert提交的哈希值,可通过
git log --oneline检索,通常这类提交的描述前缀为Revert "原提交描述",记为哈希值哈希1、哈希2 - 反向撤销这两个revert提交,即可把之前被删掉的改动再加回来:
git revert 哈希1 哈希2
执行时如果有冲突,解决冲突后执行git revert --continue即可 - 把本地修改推送到远程main分支:
git push origin main
方案2:在dev分支重新生成对应提交
如果不想在main分支新增revert相关的提交记录,可选择在dev分支重新生成这两个改动的新提交,后续合并时会正常带入main:
- 切换到本地dev分支并同步最新远程代码:
git checkout dev && git pull origin dev - 查找最早那两个被revert的原始提交的哈希值,记为
原哈希1、原哈希2 - 把这两个提交的改动重新复制为dev上的新提交:
git cherry-pick 原哈希1 原哈希2
执行时如果有冲突,解决冲突后执行git cherry-pick --continue即可 - 把dev的改动推送到远程后,正常走dev合并到main的流程即可,改动会正常生效
注意事项
- 如果那两个原始提交的改动已经被dev后续的提交覆盖或修改,优先选方案2,cherry-pick时可同步调整代码适配当前dev的逻辑
- 公共仓库场景下不要随意修改已经推送到远程的main、dev等公共分支的历史提交,避免其他协作人员拉代码时出现冲突
内容的提问来源于stack exchange,提问作者Sri Chatala
相关产品推荐
相关产品推荐

