2

我的树看起来像这样:

A --> B --> C --> D --> E

A是好的提交, B、D、E是错误的合并, C是好的提交。

所以我需要保留A和C,并摆脱其他人。有没有一个很好的方法来做到这一点?在此先感谢所有 Git 忍者。

4

3 回答 3

1

在 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...)

IE。查看以下提交图:

-------R--S--M
-P--Q-------/

在这里,我们有两个“分支”合并到M. 如果你告诉 git revert M,它不知道你是想让代码保持在 commitS状态还是 commit 状态Q,所以你需要告诉 git 你想要合并的哪个父级。

git commit -m 1 M  # will leave you in commit S
git commit -m 2 M  # will leave you in commit Q
于 2013-10-21T12:37:27.277 回答
0

你可以使用git cherry-pick它。

于 2013-10-21T12:37:02.613 回答
0

如果提交被“推送”(公开),您应该恢复执行以下任一操作:

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>

那么您需要编辑提交消息,使其在您的原始 E 分支中有意义。

但是,如果提交是本地的并且从未发布过,您应该删除它们而不是为了更干净的树。

  git checkout B -b temp
  git rebase -i A

编辑文件以仅保留您想要的提交。

于 2013-10-21T12:47:07.407 回答