我的树看起来像这样:
A --> B --> C --> D --> E
A是好的提交, B、D、E是错误的合并, C是好的提交。
所以我需要保留A和C,并摆脱其他人。有没有一个很好的方法来做到这一点?在此先感谢所有 Git 忍者。
我的树看起来像这样:
A --> B --> C --> D --> E
A是好的提交, B、D、E是错误的合并, C是好的提交。
所以我需要保留A和C,并摆脱其他人。有没有一个很好的方法来做到这一点?在此先感谢所有 Git 忍者。
在 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
你可以使用git cherry-pick
它。
如果提交被“推送”(公开),您应该恢复执行以下任一操作:
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
编辑文件以仅保留您想要的提交。