假設我有一個提交列表: A > B > C > D > E
,如何從歷史記錄中刪除在C中所做的更改,使其具有A > B > D > E
?撤消或刪除以前的Git提交中的更改
回答
您可以隨時恢復更改。
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
Tx Igal,你能詳細解釋一下你的答案嗎? – sergiuz
完成。編輯我的答案。 –
你應該提到,如果其他人在他們的歷史中也有C提交,就不應該使用rebase。或者如果那些人不得不在重寫提交的基礎上對他們的工作進行重新佈局/重做,那麼rebase就可以了,但是不管怎樣,您都不會輕易地重新分享共享歷史記錄。 – 2015-10-13 14:28:36
嘗試git revert C
...,最好的也看過man git-revert
你可以不要這樣做和得到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'
這是重要需要注意的是D
和E
獲得導致D'
和E'
所以新沙的ID,如果你已經公佈C
,D
或E
使用revert方法(git revert C
),否則可能會搞亂其他國家人民的歷史。
所以這個答案有點誤導。儘管D和E被重寫爲具有新的sha ID,但每次提交引入的*更改*仍然是相同的。 – 2015-10-13 14:39:26
嗨..謝謝,試圖改寫我的答案,以反映仍然可以刪除'C'中所做的更改,但不會以'E'的相同sha ID結束。 – mariux
- 1. Git - 刪除/撤消提交的方式
- 2. 如何從以前的提交中撤消刪除:Gitastrophy
- 3. Git:撤消未提交的更改以重置特定文件
- 4. Git撤消合併但不刪除以後提交
- 5. 撤消git的刪除
- 6. 撤消在GIT中刪除
- 7. Git撤消提交併推送後刪除的文件
- 8. Git - 撤消更改
- 9. git撤消更改
- 10. Git的撤銷合併是刪除未提交的修改
- 11. git分支撤消提交
- 12. Git撤消上次提交
- 13. 需要撤消GIT提交
- 14. 如何撤消提交併將更改提交到Git中的其他分支?
- 15. 提交前撤消'git add' - 需要刪除添加的文件夾
- 16. 刪除之前在Git中的提交
- 17. Git - 將未提交的更改推送到以前的提交
- 18. 刪除以前提交/更改集中的文件
- 19. 撤消Git中的最後更改
- 20. 撤消Git中的行結束更改
- 21. 如何編輯以前的提交,並在不刪除git之前的提交?
- 22. 我的同事的更改刪除我在git中的提交
- 23. 在Git中刪除和撤消
- 24. 暫時撤銷以前提交的更改
- 25. Git - 撤消所有更改更改
- 26. 不刪除以前的提交併對其進行更改。
- 27. 如何從倉庫中刪除以前的git提交?
- 28. 如何從git repo中刪除以前提交的文件?
- 29. 從以前的所有git提交中刪除.idea目錄
- 30. 在提交新的更改之前更正以前的提交
您需要明確您是否想將C保存在您的歷史記錄中,或者如果您只想撤銷當前版本代碼庫中的更改,並且您不關心C是否仍在你的歷史。它對你而言甚至重要嗎? – 2015-10-13 14:24:46
另請參閱[在Git中撤消特定提交](http://stackoverflow.com/q/2318777/456814)。 – 2015-10-13 14:30:19
在這種情況下,我不關心C提交,我放棄它。 – sergiuz