【问题标题】:Is it possible to recover the conflict for a file after failing to resolve it correctly?无法正确解决文件冲突后,是否可以恢复冲突?
【发布时间】:2013-02-18 23:46:05
【问题描述】:

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

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

【问题讨论】:

  • 你是用git mergetool还是手动解决?
  • 无论你使用什么,总是有可能弄乱一个文件。通常我是手动完成的。

标签: git conflict resolve


【解决方案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(尽管没有通常包含的分支名称 cmets - 如果您真的想要这些,则需要添加一些 -L <branchname> 参数 - 您可以输入 @987654332 @ 获取更多信息)。

此时,您可以清理临时文件,然后重新开始解决该文件中的冲突。完成后记得git add它,然后继续处理其余文件。

【讨论】:

  • 感谢您的详细解答。如果有N个文件,我需要保存3N个文件。太贵了。
  • 但是我有一个基于你的解决方案的想法。
  • 只对搞砸的文件执行此操作: git show :1:test.txt > /tmp/test.txt.1 git show :2:test.txt > /tmp/test. txt.2 git show :3:test.txt > /tmp/test.txt.3 git merge-file -p /tmp/test.txt.2 /tmp/test.txt.1 /tmp/test.txt.3 > test.txt
  • 是的,这就是我的意思 - 仅针对您当前卡住的文件执行此操作。当然,如果您卡在另一个文件上,您可以稍后再重复...您已经处理的前 N ​​个文件,希望其余的文件,您应该能够“正常”处理,无论这意味着什么...... .
【解决方案2】:

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

【讨论】:

  • 没有。 Git checkout --merge 对本地更改进行三向合并。那不是我要找的。谢谢。
  • "从索引中检出路径时,此选项允许您在指定路径中重新创建冲突的合并。"
【解决方案3】:

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

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

【讨论】:

  • 需要 O(N)。好像太贵了:)
猜你喜欢
  • 2015-05-07
  • 2019-04-19
  • 2021-06-26
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 1970-01-01
  • 2018-08-21
  • 1970-01-01
相关资源
最近更新 更多