2012-01-04 68 views
230

鑑於使用commit承諾進行了更改,然後使用revert進行了恢復,那麼撤消該恢復的最佳方法是什麼?如何「取消還原」還原的Git提交?

理想情況下,應該使用新的提交來完成,以免重寫歷史記錄。

+53

不恢復恢復工作? – Mat 2012-01-04 14:00:47

+2

[我該如何修復還原的git commit?](http:// stackoverflow。com/questions/5354682/how-can-i-fix-a-reverted-git-commit) – 2017-04-11 12:14:12

回答

205

如果你還沒有推這種變化的是,git reset --hard HEAD^

否則,恢復的復歸是完全正常的。另一種方法是git checkout HEAD^^ -- .然後git add -A && git commit

+0

請注意,如果您想要在沒有立即將原始更改應用於主分支的情況下取消還原,您可以(1) (2)點擊亞當注意到的回覆分支**上的「回覆」**,然後(3)在結果PR的標題中單擊「編輯」並將目標分支改爲原始分支主人。現在您的原始分支可以重新合併以實現先前還原的更改。 – pauljm 2014-09-26 16:01:58

+2

謝謝。我剛剛恢復了原來的恢復,並且工作正常。 – Simon 2014-10-17 17:35:35

+0

是的,恢復恢復的提交類似於恢復提交。謝謝! – 2015-03-26 16:16:25

216

git cherry-pick <original commit sha>
將使原有的副本提交,基本上是重新申請的提交

還原的還原會做同樣的事情,有一個混亂的提交信息:
git revert <commit sha of the revert>

無論是的這些方法將允許您在不覆蓋歷史的情況下登錄git push,因爲它會在還原後創建新的提交。
當鍵入犯煞,你通常只需要前5個或6個字符:
git cherry-pick 6bfabc

+24

這是OPs問題的最優雅和最完整的解決方案。比接受的答案好得多,它是關於提交樹的HEAD處的恢復提交的假設。該運營商還特別要求提供不重寫歷史記錄的解決方案,因此在接受的答案中提供的硬解決方案完全錯誤。 – Timo 2015-10-22 10:39:30

+1

當我有合併提交時,這不適用於我。 – 2017-02-24 15:40:15

+0

非常感謝。這節省了很多壓力! – SwimmingG 2017-05-25 23:46:29

2

它看起來愚笨,對我來說。但是我一直處於同樣的狀況,而且我還是回覆了提交的提交。我做了數字還原,所以我必須爲每個'還原提交'做出還原。

現在我的提交歷史看起來有點奇怪。

weird history

這是一個寵物項目,所以它是確定。但是對於現實生活中的項目,我會優先選擇上次提交,然後再恢復所有已恢復的代碼。

+3

您可能會對我的另一個問題的答案感興趣:http://stackoverflow.com/questions/10415565/how-to-revert-multiple-commits-as-part-of-a-single-commit – JimmidyJoo 2015-09-24 14:14:52

+1

您可以避免自動提交,並在恢復時使用--no-commit標誌選擇提交消息,然後提交相關消息 – 2017-07-16 06:09:20

0

如果你不喜歡「恢復還原」的想法(特別是當這意味着丟失許多提交的歷史信息),你總是可以前往關於"Reverting a faulty merge"的git文檔。

鑑於下列初始狀態

P---o---o---M---x---x---W---x 
    \  /
    A---B---C----------------D---E <-- fixed-up topic branch 

(W是你的合併M的初始復歸; d和E是修復您最初破碎特性分支/提交)

現在,您可以簡單地重放提交A至E,使他們沒有「屬於」還原後的合併:

$ git checkout E 
$ git rebase --no-ff P 

您的分支的新副本,現在可以合併爲master股份公司ain:

A'---B'---C'------------D'---E' <-- recreated topic branch 
/
P---o---o---M---x---x---W---x 
    \  /
    A---B---C----------------D---E