2012-05-02 91 views
41

這不是一個主要問題,只是我想知道是否可能。如何作爲單次提交的一部分恢復多次提交

假設我們有兩個提交,abcd123wxyz789,這些提交發生在非相鄰的獨立位置,遠在回購商的歷史記錄中。現在讓我們說我們想要恢復它們。這樣做

git revert abcd123 wxyz789 

會導致兩個不同的提交,一個恢復abcd123和其他恢復wxyz789

這一切都很好,但如果我們想要在兩個提交中修復的錯誤在邏輯上是鏈接的,並且出於自我文檔的目的,我們希望做出一個包含一個提交的單個提交「我打破了一些東西,現在我正在恢復文件x,y和z「評論?有沒有這樣做的git命令?

(我當然知道,它可以創建一個承諾,我只是手動修復所有的變化,然後按這是痛苦的所有obbious原因。)

+0

[Revert multiple git commits]可能的重複(http://stackoverflow.com/questions/1463340/revert-multiple-git-commits) –

+0

我看到了這個線程。它和這個之間的區別在於Bill希望從HEAD回溯多個文件。我的承諾發生在「非鄰近的,獨立的地方,遠在回購的歷史中」。 – JimmidyJoo

+1

然而,重新閱讀所選的答案給了我我想要的東西。 --no-commit標誌是我需要的。 所以...我如何提名我的問題從存在中刪除?! – JimmidyJoo

回答

52

你可以這樣做:

git revert abcd123 
git revert --no-commit wxyz789 
git commit --amend 

...然後編寫一條適當的提交消息來描述恢復兩個提交的組合效果。

+0

這將與超過2個提交工作? –

+0

@ AntonI.Sipos是的,儘可能多的你喜歡。 – Trufa

+17

更簡潔: 'git revert abcd123 wxyz789 --no-commit' 'git commit' – rmp251

29

如果複雜的復原彼此相互轉換,revert --no-commit可能會有問題。

我簡單的解決辦法是做真正的復歸和壁球:

git revert <all commits> 
git rebase -i 

,然後標記所有將恢復爲squash,除了第一個,建立一個單一的提交。

+0

我非常喜歡這個解決方案! – monokrome

+1

+1。對於git學習者:1.閱讀一下提交的內容,2.熟悉交互式重新分頁:壓縮,刪除,編輯,重新綁定,重新排序提交。一旦你讓你的頭腦熟悉它(提示:它只是時間旅行),這個解決方案比用'--no-commit'這樣的東西變得更自然。 (不要害怕「不要發佈公佈」規則 - 只要你在本地或私人部門做,就可以做*任何*)。 –

+1

**額外提示:**第一個可以從'pick'改變爲'reword'(用於輸入一個新的提交信息)或'edit'(用於暫存沒有提交的改變)。對於其他回覆,如果您不關心提交消息,則可以使用'fixup'而不是'squash'。 – ADTC

18
git revert -n <commits> 
git commit 

第一個命令將執行所有回覆而不創建任何提交併執行最終結果(-n選項)。之後,commit命令創建一個提交。

+1

完美。簡潔。它可以讓你在所有回覆之後添加你的提交信息,而不用回去修改其他答案所提出的提交。 –

+0

除了它不起作用。我需要回滾最後5次提交,其中3次是這些奇妙的Git合併,每當您將某人刪除時發生變化。所以'commit <###>這個錯誤是一個合併,但沒有-m選項'。每個合併都有兩個父母,顯然我必須確定我需要保留的每個合併的哪個父母。我甚至都不知道該怎麼做,更不用說我如何指定那些我不知道的恢復命令。 – Neutrino