2

假设我做了一个 rebase 并且 100 个文件有冲突。我必须一一解决。假设我已经解决了 (N-1) 个文件,并且正在处理文件 N。在处理了一段时间后,我发现我把文件弄乱了。所以我想再次从头解决它。但我不想中止变基并再次变基,因为我不想再次解析 (N-1) 文件。

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

4

3 回答 3

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以获取更多信息)。

At that point, you can clean up the temporary files, and start over on resolving the conflicts in that file. Remember to git add it when you're done, and then continue with the rest of the files.

于 2013-03-04T21:16:15.590 回答
1

I believe you're looking for git checkout --merge --path/to/file.

于 2013-03-05T06:25:17.120 回答
0

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

  1. 将 (N - 1) 个文件复制到临时目录
  2. git rebase --abort
  3. 将 (N - 1) 个文件复制回 git 目录
  4. 处理您的第 N 个文件。
于 2013-03-04T19:39:13.343 回答