2013-10-21 33 views
2

之间我的树是这个样子:还原几个错误提交,但保持了良好犯

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

一个好提交, B,d,E是错误的合并, Ç是一个很好的承诺。

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

+0

'git checkout -B master A;如果你还没有按下,请选择“git cherry-pick C”。 – jthill

+0

@jthill我有。 –

回答

0

您可以使用git cherry-pick

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,它不知道你是否想让代码保持在提交状态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 
+0

这给了我一个信息'B是一个合并,但没有-m选项被给出。' –

+0

@Mighter见编辑请 –

+0

如果我这样做,我应该再次合并一切吗?因为另一个人正在合并所有...... –

0

如果提交的 “推”(公开),您应恢复做任何的

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 

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

相关问题