98

例如,在以下 master 分支中,我只需要删除提交 af5c7bf16e6f04321f966b4231371b21475bc4da,这是由于先前的 rebase 导致的第二个:

commit 60b413512e616997c8b929012cf9ca56bf5c9113
Author: Luca G. Soave <luca.soave@gmail.com>
Date:   Tue Apr 12 23:50:15 2011 +0200

    add generic config/initializers/omniauth.example.rb

commit af5c7bf16e6f04321f966b4231371b21475bc4da
Author: Luca G. Soave <luca.soave@gmail.com>
Date:   Fri Apr 22 00:15:50 2011 +0200

    show github user info if logged

commit e6523efada4d75084e81971c4dc2aec621d45530
Author: Luca G. Soave <luca.soave@gmail.com>
Date:   Fri Apr 22 17:20:48 2011 +0200

    add multiple .container at blueprint layout

commit 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22
Author: Luca G. Soave <luca.soave@gmail.com>
Date:   Thu Apr 21 19:55:57 2011 +0200

    add %h1 Fantastic Logo + .right for 'Sign in with Github'

我需要维护

  • 第一次提交 60b413512e616997c8b929012cf9ca56bf5c9113,
  • 第三次提交 e6523efada4d75084e81971c4dc2aec621d45530 和
  • 最后一次提交 414ceffc40ea4ac36ca68e6dd0a9ee97e73dee22

“扔掉”只是第二次提交af5c7bf16e6f04321f966b4231371b21475bc4da

我怎样才能做到这一点?提前感谢卢卡

4

3 回答 3

105

变基还原是选项。Rebase 实际上会从历史记录中删除该提交,因此看起来第二次提交从未存在过。如果您将主分支推送到任何其他存储库,这将是一个问题。如果你在这种情况下尝试在 rebase 之后推送,git 会给你一个拒绝非快进合并错误。

当分支已与其他存储库共享时,Revert 是正确的解决方案。git revert af5c7bf16将进行一个新的提交,简单地反转 af5c7bf16 引入的更改。这样历史就不会被重写,你保持一个清晰的错误记录,其他 repos 将接受推送。

这是擦除的好方法:git rebase -i <commit>^ 这会将您带到要删除的提交之前的提交。交互式编辑器将向您显示返回该点的所有提交的列表。您可以选择、挤压等。在这种情况下,删除您要擦除的提交的行并保存文件。Rebase 将完成它的工作。

于 2011-04-22T16:23:02.017 回答
37

如果 rebase 是一个选项,您可以 rebase 并删除它:

$ git rebase -i 414ceffc^

如果 rebase 不是一个选项,您可以将其还原:

$ git revert af5c7bf16
于 2011-04-22T16:11:22.563 回答
30

尽管原始答案在这里获得了所有功劳,但我并没有完全找到它们能够令人满意地回答这个问题。如果您发现自己需要从历史中间删除一个提交或一组提交,这就是我的建议:

  • 在包含所有提交的分支的头部创建一个新分支并切换到它。
  • 将新分支恢复到您要开始新基地的点。
  • 然后,(这里是关键点)cherry 选择您实际想要应用的后续提交,然后从原始分支到新分支,并跳过您不再需要的提交(即您要删除的提交)。
  • 如果需要,将原始分支重命名为表明它是旧代码的名称,然后将新分支重命名为原始分支的名称。
  • 最后,将您的更改推送到您的远程仓库(如果使用的话)。您可能需要使用“强制推送”。如果您的协作者在拉取修订版时遇到问题,他们可能最容易从远程源再次克隆 repo。无论如何,如果您要从历史中间撕下提交,您可能会想与他们交谈!

这是关于 Cherry Picking 的信息: 使用 git 挑选提交是什么意思?

这里有一些关于用 Tortoise Git 做的事情(就像我刚刚做的那样)。使用 gui 实用程序进行这些操作肯定更容易! 使用 TortoiseGit 挑选樱桃

于 2017-08-03T23:16:06.907 回答