Git rebase冲突但没有合并的内容?

7
当git rebase发现冲突,但文件中没有明显的问题时,这是什么意思?所涉及的文件没有冲突标记,而git mergetool则显示“nothing to merge”。
我可以选择重置或添加选项:
# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#   both modified:      filename.js

我该如何找出这是关于什么以及应该采取哪个路径?

git ls-files -s 文件名.js会返回3行:

100644 d2c915b1d632b8ef8fbcf056824fb7fac7824ab9 1   filename.js
100644 9010798f1d19ac712196b1fc9b0870fd332b1275 2   filename.js
100644 b3ab7ec50812c73a3ec97bf0985f3226ec13cbc8 3   filename.js

根据详细说明,此命令告诉我们模式位、对象名称和阶段编号。模式位相同。那么1、2和3是什么,为什么它们“都被修改”但不显示冲突标记?

1
可能是空格差异。 - wkl
尝试使用 git ls-files -s filename.js 命令查看版本是否不同。 - Josh Lee
@JoshLee 我根据你的评论更新了我的问题。输出显示了3个blob,但我不确定该怎么做才能找到差异,或者告诉哪一个是“add”或“reset”? - Andrew Vit
1
@birryree,空格差异不会在<<<冲突标记中显示吗? - Andrew Vit
1
你说得对,不用理我。 - wkl
2个回答

8
索引中标记为 123 的版本具有以下含义:
  1. 该文件是合并的两个提交的共同祖先中的版本。
  2. HEAD 中的版本,即在合并时当前提交的版本。
  3. 该文件是您正在尝试合并到 HEAD 中的提交中的版本。
我获得这些信息的来源是 git 手册中关于解决代码冲突有用的部分
git status 中出现 both modified 输出,当然表示该文件在合并的两个提交中以不同方式更改了,它们的共同祖先也随之改变。
然而,我很费解为什么您没有在文件中看到冲突标记——在 git ls-files -s 的输出中,blob 的哈希值(hash)不同,这意味着字节与字节之间的内容肯定是不同的。如果您满意工作副本中的文件,只需执行 git add filename.js,然后执行 git rebase --continue 即可。但无论如何,您可能希望查找差异所在。要做到这一点,我建议您尝试以下操作:
git diff :2:filename.js filename.js

您可以尝试使用 HEAD 版本和当前工作副本之间的差异来查看它们之间的区别。同样地,您也可以尝试:

git diff :3:filename.js filename.js

要看合并版本和您的工作副本之间的差异,请执行以下操作。


1

git ls-files -s 中的 123 表示 3-way merge 的“阶段”:1 是共同祖先,2 是当前分支 HEAD,3 是另一个分支 HEAD。在 Linux 上,您可以尝试以下命令查看文件之间的差异:

$ git cat-file blob d2c915b1d632b8ef8fbcf056824fb7fac7824ab9 | xxd -ps
$ git cat-file blob 9010798f1d19ac712196b1fc9b0870fd332b1275 | xxd -ps
$ git cat-file blob b3ab7ec50812c73a3ec97bf0985f3226ec13cbc8 | xxd -ps

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接