Git 恢复几个错误的提交,但在两者之间保留一个正确的提交

Git 恢复几个错误的提交,但在两者之间保留一个正确的提交,git,version-control,github,Git,Version Control,Github,我的树看起来像这样: A --> B --> C --> D --> E A是好的承诺, B、 D,E是错误的合并, C是一个很好的选择 所以我需要保留A和C,去掉其他的。 有什么好办法吗? 提前感谢所有Git忍者 您可以使用git cherry pick。在git中,恢复提交只会撤消提交,而不会撤消导致提交的整个系列,因此您只需要: git revert E git revert D git revert B 现在我注意到,您指定这些提交是合并,因此需要指定要保留的

我的树看起来像这样:

A --> B --> C --> D --> E
A是好的承诺, B、 D,E是错误的合并, C是一个很好的选择

所以我需要保留A和C,去掉其他的。 有什么好办法吗?
提前感谢所有Git忍者

您可以使用git cherry pick。

在git中,恢复提交只会撤消提交,而不会撤消导致提交的整个系列,因此您只需要:

git revert E
git revert D
git revert B
现在我注意到,您指定这些提交是合并,因此需要指定要保留的父级,因此请使用
-m parentNumber
标志:

# revert the E commit, keeping the state of the first parent
git revert -m 1 E
# (and similar for the others...)
即,查看以下提交图:

-------R--S--M
-P--Q-------/
这里我们有两个“分支”,它们合并在
M
中。如果您告诉git要还原
M
,它不知道您想让代码保持在提交
S
状态还是提交
Q
状态,因此您需要告诉git您想要合并的父级

git commit -m 1 M  # will leave you in commit S
git commit -m 2 M  # will leave you in commit Q
如果提交是“推送”(公共)的,则应执行以下操作之一:

1) 只要存在错误提交,就可以进行多次恢复:

git revert E
git revert D
git revert B
2) 通过执行以下操作,可以提交一次还原:

  git checkout B -b temp
  git rebase -i A
编辑文件以仅保留要还原的提交,并将剩余的压缩为单个提交

  git revert <that single commit>

  git checkout E
  git cherry-pick <revert from that single commit>

编辑文件以仅保留所需的提交。

这会给我一条消息“B是一个合并,但未提供-m选项”。如果我这样做,是否应该再次合并所有内容?因为另一个人正在合并所有这些…是的,如果你还原它,你将不得不再次合并它。您可能会发现一篇关于合并和还原的有趣文章。
git checkout-B master A;git cherry pick C
如果您还没有按下。
git commit -m 1 M  # will leave you in commit S
git commit -m 2 M  # will leave you in commit Q