17

问题:一个分支有很好的提交与不希望的提交交错。

尝试的解决方案:

git revert hash5 hash8 hash9 hash23

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

我现在认为会发生什么:

  • git 在引入大冲突的过程中应用 commit hash5。
  • 我尝试合并,编辑我想要的代码,为更多冲突做好准备(见下一点)
  • git 应用提交 hash8,这与合并中所做的编辑冲突
  • 我尝试合并...等等

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

4

1 回答 1

12

完整性检查

首先,请注意,它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
    

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

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

  1. 创建一个新的rebuild分支来工作:

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

    git rebase -i <hash1>~
    

    在交互式变基编辑器中,删除<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
于 2013-11-27T01:02:07.503 回答