假設我做了一個rebase和100個文件有衝突。我必須一一解決。讓我們說我已經解決了(N-1)個文件,而且我正在處理文件N.處理了一段時間之後,我發現我搞亂了這個文件。所以我想再次從頭開始解決它。但我不想放棄rebase並再次進行rebase,因爲我不想再次解析(N-1)個文件。在未能正確解析文件後,是否可以恢復文件的衝突?
是否有可能只爲文件N恢復合併衝突,所以我可以從頭再次解決它?
假設我做了一個rebase和100個文件有衝突。我必須一一解決。讓我們說我已經解決了(N-1)個文件,而且我正在處理文件N.處理了一段時間之後,我發現我搞亂了這個文件。所以我想再次從頭開始解決它。但我不想放棄rebase並再次進行rebase,因爲我不想再次解析(N-1)個文件。在未能正確解析文件後,是否可以恢復文件的衝突?
是否有可能只爲文件N恢復合併衝突,所以我可以從頭再次解決它?
假設你正在使用的文件被命名爲test.txt
,並且該文件已被留下由於合併嘗試衝突標誌,你已經以某種方式拙劣的做這些衝突的手動解決,你可以重新用幾個命令用衝突標記創建文件。
作爲背景知識,有助於瞭解當合並需要手動解決文件衝突時,它會在您的git
索引中保留該文件的三個不同副本(稱爲「階段」)。階段1是合併文件的兩個版本的共同祖先,階段2和3是您嘗試合併的兩個分支的兩個版本。 git
實用程序的一些但不是全部瞭解語法:<stage>:<filename>
來引用這些條目。
所以,你首先需要做的是什麼地方重新創建這三個文件的臨時副本 - 我會在這裏使用/tmp
,但它不是強制性的:
git cat-file -p :1:test.txt > /tmp/test.txt.1
git cat-file -p :2:test.txt > /tmp/test.txt.2
git cat-file -p :3:test.txt > /tmp/test.txt.3
然後,使用git
管道命令git merge-file
用適當的衝突標記重新創建文件。請注意,參數的順序在這裏非常重要,如果要在重新進行合併時引用它,最好保存已在此文件上完成的工作。
mv test.txt test.txt.broken
git merge-file -p /tmp/test.txt.2 /tmp/test.txt.1 /tmp/test.txt.3 > test.txt
這將重新創建test.txt
與衝突標誌(儘管沒有了通常包含分支的名稱註釋 - 如果你真的想要的,你需要添加一些-L <branchname>
參數 - 您可以鍵入git help merge-file
到獲取更多的信息)。
此時,您可以清理臨時文件,並重新開始解決該文件中的衝突。當你完成後記得git add
,然後繼續其餘的文件。
感謝您的詳細解答。如果有N個文件,我需要保存3N個文件。那太貴了。 – 2013-03-05 22:28:59
但我有一個基於你的解決方案的想法。 – 2013-03-05 22:30:13
這樣做只適用於搞砸的文件: git show:1:test.txt> /tmp/test.txt.1 git show:2:test.txt> /tmp/test.txt.2 git顯示:3:test.txt> /tmp/test.txt.git merge-file -p /tmp/test.txt.2 /tmp/test.txt.1 /tmp/test.txt.3>測試。 txt – 2013-03-05 22:34:22
也許不那麼好解決方案(貌似沒有這麼git'ish),但這裏是一個可能的方式:
它需要O(N)。似乎太貴:) – 2013-03-04 19:55:03
你使用'git mergetool'還是手工解析? – asm 2013-03-04 19:43:24
無論你使用什麼,它總是可以搞砸一個文件。通常我手動做。 – 2013-03-05 22:26:05