假设我做了一个rebase,有100个文件有冲突。我必须逐一解决它们。让我们说我已经解决了(N-1)个文件,我正在处理文件N.经过一段时间的工作后,我发现我弄乱了文件。所以我想再次从头开始解决它。但我不想中止rebase并再次进行rebase,因为我不想再次解析(N-1)文件。
是否有可能只恢复文件N的合并冲突,以便我可以从头开始再次解决它?
答案 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),但这是一种可能的方式: