如果无法正确解析文件,是否可以恢复文件的冲突?

时间:2013-03-04 19:10:09

标签: git conflict resolve

假设我做了一个rebase,有100个文件有冲突。我必须逐一解决它们。让我们说我已经解决了(N-1)个文件,我正在处理文件N.经过一段时间的工作后,我发现我弄乱了文件。所以我想再次从头开始解决它。但我不想中止rebase并再次进行rebase,因为我不想再次解析(N-1)文件。

是否有可能只恢复文件N的合并冲突,以便我可以从头开始再次解决它?

3 个答案:

答案 0 :(得分: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,然后继续使用其余文件。

答案 1 :(得分:1)

我相信您正在寻找git checkout --merge -- path/to/file

答案 2 :(得分:0)

也许不是那么好的解决方案(看起来不那么git'ish),但这是一种可能的方式:

  1. 将(N-1)个文件复制到临时目录
  2. git rebase --abort
  3. 将(N - 1)个文件复制回git dir
  4. 处理您的第N个文件。