撤销多个特定的Git提交

17

问题:一个分支中有好的提交和不想要的提交交错在一起。

尝试解决方案:

git revert hash5 hash8 hash9 hash23

我最初认为这将应用所有指定的提交,然后让我解决任何冲突。

现在我认为发生的事情是:

  • git应用提交哈希5,在此过程中引入了大量冲突。
  • 我尝试合并并编辑代码,以使其看起来像我想要的,为更多的冲突设置了舞台(见下一点)
  • git应用提交哈希8,与合并中所做的编辑冲突
  • 我尝试合并...等等

问题:如何让git在向我呈现任何可能的冲突之前连续应用所有还原操作?

1个回答

12

检查一下

首先要注意,git revert会按照你输入的哈希值列表的顺序撤销你的补丁,你需要将这些哈希值从最新到最旧的顺序列出,因为你想要逆时针进行。所以,我将称呼你的哈希值为

<hash1> ... <hashN>

其中<hash1><hash2>旧...比<hashN>旧。所以,请确保您正在执行正确的操作。

git revert <hashN> ... <hash1>

首先要做的是在正确的顺序中撤销它们,然后尝试使用--no-commit选项:

简单解决方案

其次,假设您已按正确顺序还原它们,请尝试使用--no-commit选项:

git revert --no-commit <hashN> ... <hash1>

更复杂的解决方案

第三步,如果简单的解决方案不起作用,但您确实需要撤消的提交作为单个提交真的有意义(如果没有,我不看好),那么请尝试以下方法:将要撤消的四个提交合并成一个大提交,然后再撤消这个大提交。

  1. 创建大提交:

    在最早提交的父级处创建一个分支:

    git checkout -b big-commit <hash1>~
    

    复制您新分支上的提交并将它们合并:

    git cherry-pick --no-commit <hash1> ... <hashN>
    git commit -m "Big commit"
    

    现在,您的分支big-commit应该有一个大的提交记录。

  2. 将这个大的提交记录反向应用到您正在尝试还原的分支上:

  3. git checkout <branch you wanted to revert on>
    git revert big-commit
    

    另一个相对简单的解决方案

    使用选择性变基来重建相关分支,就像它从未包含不想要的提交一样:

    1. 创建一个新的 rebuild 分支进行操作:

    2. git checkout -b rebuild <branch you want to revert>
      
    3. 交互式地变基,丢弃您不想要的提交:

    4. git rebase -i <hash1>~
      
      在交互式的rebase编辑器中,删除 <hash1><hashN> 的行。

    现在你的 rebuild 分支将包含 <branch you want to revert>,就好像 <hash1><hashN> 从未存在过一样。如果你在这里遇到冲突,它们似乎是不可避免的。

    如果你需要将你的工作放在 <branch you want to revert> 上,并且你不能只是通过 git reset 将其指向你的新的 rebuild 分支:

    git checkout <branch you want to revert>
    git reset --hard rebuild
    

    例如,如果您已经将其公开推送,那么您可以将差异作为补丁应用于要还原的分支<branch you want to revert>:

    git co <branch you want to revert>    
    git diff <branch you want to revert> rebuild | patch
    

1
我很好奇 - 在这种情况下使用 cherry-pick 命令是否仍会生成合并冲突,需要手动解决每个提交时的冲突?我认为 OP 正试图避免执行过程式合并任务。 - miqh
@miqid:好问题!我一直以为提交本身是本地兼容的/可以从某个起始点按顺序应用而不会冲突。如果不是这种情况,我看没有避免冲突的希望了。 - ntc2
事实上,在合并之前,我也尝试了挑选某个提交。结果大致相同——我发现自己在无明显原因的情况下解决了冲突。 - Benjamin Burkhart
@BenjaminBurkhartпјҡдҪ е°қиҜ•иҝҮеңЁgit revertжҲ–git cherry-pickе‘Ҫд»ӨдёӯдҪҝз”Ё--no-commitж Үеҝ—еҗ—пјҹжҲ‘иҝҳжңүеҸҰдёҖдёӘжғіжі•пјҢжҲ‘дјҡеңЁдёҠйқўж·»еҠ е®ғ... - ntc2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接