恢复几个糟糕的提交,但在两者之间保持良好的提交

时间:2013-10-21 12:34:19

标签: git version-control github

我的树看起来像这样:

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

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

所以我需要保持A和C,并摆脱其他人。 有一个很好的方法吗? 在此先感谢所有Git-ninjas。

3 个答案:

答案 0 :(得分: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...)

即。查看以下提交图:

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

我们在M合并了两个“分支”。如果你告诉git还原M,它不知道你是想让代码保持在commit S状态还是处于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

答案 1 :(得分:0)

您可以使用git cherry-pick

答案 2 :(得分: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

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