2012-11-02 73 views
2

Threre是多個資源,它會告訴你如何在git中恢復分支合併,以防在分支中發現錯誤。如果分支沒有被推向上游,或者恢復/更正分支中的錯誤/恢復恢復/合併,則在這種合併之後的步驟將被重置/更正爲分支/合併中的錯誤。但是,這隻涉及在分支代碼中出現錯誤的情況。今天,我試圖恢復由於衝突在合併提交中被解決的方式而無效的合併。恢復無效的git合併

前的情況:

master o -- 1 -- C 
     \ /
branch a -- b 

是合併分支成遇到的提交有關某人的實現代碼主開發商在其他承諾他解決衝突,並承諾他們,從而創建一個合併提交「C」。問題在於他在做這件事時引入了一個錯誤。我想做的事,然後是恢復這一合併,並重新合併正確的,創造的東​​西,看起來像這樣:

master o -- 1 -- C -- ~C -- C1 
     \ /  /
branch a -- b ---------- 

其中「〜C」是還原後的「C」和「C1」正確的合併。不幸的是,它看起來像我不能這樣做。

當然重置爲1並將「分支」重新合併爲「主」作品,但這些更改已經在上游,我不想做任何骯髒的竅門。

解決方案我發現在線程Undo a Git merge that hasn't been pushed yet沒有帶我到任何地方。

我得到的最清潔的想法是修正「C」中的代碼並將它們提交給「master」,但在這種情況下,您從git獲得任何幫助,例如衝突文件列表或突出顯示的衝突行,在這種情況下,這非常有幫助。

任何想法?

+0

爲什麼沒有〜C - > C1工作?有沒有說因爲b已經合併到C了,所以什麼都沒有改變?您在嘗試〜C後是否嘗試從分支變成主人? –

+0

正如你猜測的 - 〜C - > C1沒有工作,因爲合併已經完成。正如我在鏈接到的問題(和鏈接那裏的文章)中所說的那樣 - 恢復不會恢復歷史記錄,只會發生變化,所以並不奇怪。我沒有嘗試挑選承諾,那對我有什麼幫助? – mikosz

回答

2

您嘗試創建的圖形不會從git的角度感知。具體而言,使C1合併到C和b是很奇怪的,因爲它們的合併基數是b,所以沒有什麼可做的。

如果您不能或不會做快進推,那麼你最好的選擇是重新創建的合併,並創建在〜C現在站的地方提交C1。稱之爲「解決拙劣的衝突解決方案」並加以解決 - 不需要額外的合併混淆。

要創建這樣的承諾,首先創建正確,合併提交C1,然後運行是這樣的:

git reset --hard $(git commit-tree -p C -m "fix botched conflict resolutions" C1:) 

this answer該行的解釋。

+1

看起來像可以工作的東西,但我得到「致命的:不是有效的對象名稱-p」。當我重新整理提交樹命令「git的承諾樹3b66f18a1:-p 4eb2e3d0b7a7 -m‘修復拙劣的衝突解決’」我知道「用法:git的承諾樹 [(-p )...] <更新日誌「並且此時此刻正處於虧損狀態...... – mikosz

+1

@MikolajRadwan你有一箇舊版本的git,它的'commit-tree'不支持'-m'開關,所以你必須拼寫內部命令作爲'echo'修復僵化的衝突解決方案。 git commit-tree 3b66f18a1:-p 4eb2e3d0b7a7'。 – user4815162342