git还原了几个特定的​​提交

时间:2013-11-26 22:55:24

标签: git conflict revert git-revert

问题:分支具有良好的提交,与不需要的提交交错。

尝试解决方案:

git revert hash5 hash8 hash9 hash23

我认为这样做是因为它应用了所有指定的提交,然后让我解决任何冲突。

我现在认为会发生这种情况:

  • git在引入大冲突的过程中应用commit hash5。
  • 我参与合并,编辑我希望它看起来的代码,为更多冲突设置舞台(见下一点)
  • git应用commit hash8,它与合并中的编辑冲突
  • 我尝试合并......等等

问题:在向我提出任何可能的冲突之前,如何让git连续应用所有恢复?

1 个答案:

答案 0 :(得分:9)

完整性检查

首先,请注意git revert按照列出其哈希值的顺序还原您的修补程序;你需要列出从最新到最旧的哈希,因为你想要及时倒退。所以,我打算叫你的哈希

<hash1> ... <hashN>

其中<hash1>早于<hash2> ...早于<hashN>。所以,确保你正在做

git revert <hashN> ... <hash1>

首先!

简易解决方案

其次,假设您按正确的顺序还原它们,请尝试--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. 将大提交反向应用到您要恢复的分支:

    git checkout <branch you wanted to revert on>
    git revert big-commit
    
  3. 另一种相对简单的解决方案

    使用选择性重新定位来重建有问题的分支,就像它从未包含不需要的提交一样:

    1. 创建一个新的rebuild分支以使用:

      git checkout -b rebuild <branch you want to revert>
      
    2. 以交互方式变基,删除您不想要的提交:

      git rebase -i <hash1>~
      

      在互动式rebase编辑器中,删除<hash1> ... <hashN>的行。

    3. 现在,您的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