2013-03-04 30 views
2

假設我做了一個rebase和100個文件有衝突。我必須一一解決。讓我們說我已經解決了(N-1)個文件,而且我正在處理文件N.處理了一段時間之後,我發現我搞亂了這個文件。所以我想再次從頭開始解決它。但我不想放棄rebase並再次進行rebase,因爲我不想再次解析(N-1)個文件。在未能正確解析文件後,是否可以恢復文件的衝突?

是否有可能只爲文件N恢復合併衝突,所以我可以從頭再次解決它?

+0

你使用'git mergetool'還是手工解析? – asm 2013-03-04 19:43:24

+0

無論你使用什麼,它總是可以搞砸一個文件。通常我手動做。 – 2013-03-05 22:26:05

回答

1

假設你正在使用的文件被命名爲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,然後繼續其餘的文件。

+0

感謝您的詳細解答。如果有N個文件,我需要保存3N個文件。那太貴了。 – 2013-03-05 22:28:59

+0

但我有一個基於你的解決方案的想法。 – 2013-03-05 22:30:13

+0

這樣做只適用於搞砸的文件: 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

0

也許不那麼好解決方案(貌似沒有這麼git'ish),但這裏是一個可能的方式:

  1. 的(N - 1)的文件複製到一個臨時目錄
  2. git的重訂--abort
  3. 將(N-1)個文件複製回git目錄
  4. 工作在你的第N個文件上。
+0

它需要O(N)。似乎太貴:) – 2013-03-04 19:55:03

1

我相信你正在尋找git checkout --merge --path/to/file

+0

沒有。Git checkout --merge爲本地更改做了三種合併。這不是我正在尋找的。謝謝。 – 2013-03-05 22:39:16

+0

「當從索引檢出路徑時,使用此選項可以在指定的路徑中重新創建衝突的合併。」 – jthill 2013-03-05 22:57:15

+0

@LiboYu - 讓我這樣說:你試過了嗎? – jthill 2013-03-06 09:25:10

相關問題