2015-10-13 128 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