我的树看起来像这样:
A --> B --> C --> D --> E
A 是好的提交, B,D,E 是错误的合并, C 是一个很好的提交。
所以我需要保持A和C,并摆脱其他人。 有一个很好的方法吗? 在此先感谢所有Git-ninjas。
答案 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
编辑文件以仅保留您想要的提交。