2015-10-13 134 views
2

假设我有一个提交列表: A > B > C > D > E,如何从历史记录中删除在C中所做的更改,使其具有A > B > D > E撤消或删除以前的Git提交中的更改

+0

您需要明确您是否想将C保存在您的历史记录中,或者如果您只想撤销当前版本代码库中的更改,并且您不关心C是否仍在你的历史。它对你而言甚至重要吗? – 2015-10-13 14:24:46

+0

另请参阅[在Git中撤消特定提交](http://stackoverflow.com/q/2318777/456814)。 – 2015-10-13 14:30:19

+0

在这种情况下,我不关心C提交,我放弃它。 – sergiuz

回答

5

您可以随时恢复更改。

git revert C 

如果您想重写历史记录,这是rebase的用途。您需要:

git rebase -i A 

然后从提交列表中删除C.

更详细的解释:

首先选择通过创建一个新的提交这是原来的承诺相反恢复的变化。这样仓库会是什么样子:

A> B> C> d> E> C`

其中C`是C.相反基本上相同patch --reverse

第二个选项改变了历史。 rebase允许您选择特定的提交,更改提交顺序等等。我建议阅读git-rebase-i标志用于交互模式,它允许用户在重新绑定之前编辑提交列表。

如果您提交的名单中删除C和进行重订,实际输出将

A> B> d>电子

你有C的分支不再历史。

注意:在这两种情况下,您都可能在此过程中发生冲突。 在第一种情况下,因为你申请C`在E,而在第二种情况下,因为你在申请B. d

+0

Tx Igal,你能详细解释一下你的答案吗? – sergiuz

+0

完成。编辑我的答案。 –

+0

你应该提到,如果其他人在他们的历史中也有C提交,就不应该使用rebase。或者如果那些人不得不在重写提交的基础上对他们的工作进行重新布局/重做,那么rebase就可以了,但是不管怎样,您都不会轻易地重新分享共享历史记录。 – 2015-10-13 14:28:36

2

尝试git revert C

...,最好的也看过man git-revert

2

你可以不要这样做得到A > B > D > E。 你将永远结束了A > B > D' > E'

要取消C引入的变化,你可以在你的情况下使用

git rebase --onto <newbase> <oldbase> <commit/branch> 

git rebase --onto B C E 

这将会把从旧的D..E引入的更改基地C到新基地B(如果你没有碰到任何冲突)导致

A > B > D' > E' 

这是重要需要注意的是DE获得导致D'E'所以新沙的ID,如果你已经公布CDE使用revert方法(git revert C),否则可能会搞乱其他国家人民的历史。

+1

所以这个答案有点误导。尽管D和E被重写为具有新的sha ID,但每次提交引入的*更改*仍然是相同的。 – 2015-10-13 14:39:26

+0

嗨..谢谢,试图改写我的答案,以反映仍然可以删除'C'中所做的更改,但不会以'E'的相同sha ID结束。 – mariux