之间我的树是这个样子:还原几个错误提交,但保持了良好犯
A --> B --> C --> D --> E
一个好提交, B,d,E是错误的合并, Ç是一个很好的承诺。
所以我需要保持A和C,并摆脱其他。 有没有一个很好的方法来做到这一点? 在此先感谢所有Git-ninjas。
之间我的树是这个样子:还原几个错误提交,但保持了良好犯
A --> B --> C --> D --> E
一个好提交, B,d,E是错误的合并, Ç是一个很好的承诺。
所以我需要保持A和C,并摆脱其他。 有没有一个很好的方法来做到这一点? 在此先感谢所有Git-ninjas。
您可以使用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你想要哪个父合并。因为有坏提交
1)尽可能多就回到:
git commit -m 1 M # will leave you in commit S
git commit -m 2 M # will leave you in commit Q
这给了我一个信息'B是一个合并,但没有-m选项被给出。' –
@Mighter见编辑请 –
如果我这样做,我应该再次合并一切吗?因为另一个人正在合并所有...... –
如果提交的 “推”(公开),您应恢复做任何的
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
编辑文件以仅保留您想要的提交。
'git checkout -B master A;如果你还没有按下,请选择“git cherry-pick C”。 – jthill
@jthill我有。 –