为什么未合并路径在git diff中没有显示任何内容

14

合并两个分支时,很多时候合并会失败,我必须逐个解决差异。

有些文件成功合并,我可以看到差异:

git diff --staged <merged-file>
问题在于对于未合并的路径,当我尝试检查引入的差异时,我什么也看不到:

对于未合并的路径,检查差异时无法显示任何内容。

git diff <unmerged-file>

但是当我尝试将其与远程主分支进行差异比较时,就会出现差异:

git diff origin/master <unmerged-file>
为什么会发生这种情况?合并操作是否正在更新我的本地 HEAD 或其他什么东西?此外,当我使用 git add 命令标记解决方案时,它们从未进入暂存区 -- 这就是为什么 git diff 命令没有显示任何内容的原因吗?

你的问题可能缺少一些额外的细节。你要将哪个分支合并到哪个分支?在你的例子中,你是在master分支吗?还是你已经将master合并到你的分支中了?当我自己尝试类似的情况时,通过对一个有冲突的文件进行“diff”的操作,输出了带有“>>> === <<<”标记的预期结果。 - Maic López Sáenz
@LopSae 我正在将一个开发分支合并到主分支。对于一个有冲突的文件进行差异比较时,它不显示任何内容,只显示头部信息。看起来它知道差异存在,但不知道是什么。 - Kartik Anand
你应该将这些细节添加到问题本身中,包括你在 git diff 中看到的内容。如果你要合并的文件更改足够简单,你也可以将它们作为描述的一部分添加,或者创建一个简化的示例来展示如何重现该问题。 - Maic López Sáenz
3个回答

22

合并过程中,产生冲突的文件处于特殊状态。同一文件名对应多个不同blob id的条目。通常有三个blob(用于三方合并)或两个blob(用于简单合并)。

尝试进行合并...

$ git merge origin/otherbranch
Merge remote-tracking branch 'origin/otherbranch' into mybranch

Conflicts:
    somefile.txt

查看需要合并的文件

$ git diff --name-status --diff-filter=U
U       somefile.txt
或者
$ git update-index --refresh
somefile.txt: needs merge

查看与合并的文件相关的Blob;

$ git ls-files -s somefile.txt
100644 9a0579524e0c7ba9fc9ae18badadaddcad2d598f **1** somefile.txt
100644 1bcff16b6de5ed304a06e643070e40787db1ead8 **2** somefile.txt
100644 6e52271b22f6a6d1150619433551e0fa9094b108 **3** somefile.txt
根据git-merge手册。1表示普通祖先,2表示HEAD(我们自己),3表示MERGE_HEAD(对方)。显示差异。
$ git diff 9a0579524e0c7ba9fc9ae18badadaddcad2d598f 6e52271b22f6a6d1150619433551e0fa9094b108
< some differences >

检索共同祖先..

$ git cat-file blob 9a0579524e0c7ba9fc9ae18badadaddcad2d598f

从HEAD检出版本

$ git checkout --ours somefile.txt

从MERGE_HEAD检出版本

$ git checkout --theirs somefile.txt

重置为“merged”已更改

$ git checkout -m somefile.txt

更新:

使用<ref>:ID:Filepath可以使这个过程更简单。

git diff :1:somefile.txt :2:somefile.txt

将为您提供合并中两个父级之间的差异。 0表示完成的合并 1表示冲突的合并 2/3表示合并的两个父级。

如果您在特定提交xxxxxx处有一个已完成的合并,则可以使用xxxxxx^0(合并文件)xxxxxx^1“左侧”父级和xxxxxx^2“右侧”父级来引用其父级。比较合并文件与其祖先可以按以下方式进行;

git diff xxxxxx^0:somefile xxxxxx^1:somefile

1
这个问题提供了足够的细节并且很有用,但实际上并没有回答这个问题。 - Maic López Sáenz
@LopSae 是的!没错,这就是为什么我不确定是否应该给他悬赏。 - Kartik Anand
除非您认为它确实是答案,否则您不需要选择最受欢迎的问题作为答案。此外,如果您不选择接受的答案(在这种情况下是您自己),那么您将获得更多来自社区的参与,特别是当赏金仍在进行时。 - Maic López Sáenz
@LopSae 那么我的问题是什么?如果您阅读原始问题,它描述了一个具体的问题并询问“为什么会发生这种情况?”。似乎所选答案回答了“如何在合并文件上使用diff”的问题,这显然很容易。 - Dave
另外,在使用git checkout命令选择正确版本之后,您如何在以后确定使用的是哪个版本?是从ourstheirs还是其他地方? - tarekahf
显示剩余2条评论

8
我能看到冲突文件的更改的唯一方法是:
git diff --merge <unmerged-file>

你明白为什么了吗? - Nikhil Gupta
我无法重现您所描述的行为。git ls-files -u 对于未合并的文件会产生什么输出? - hlovdal
2
对我来说不起作用。我收到了这个错误信息:致命错误:--merge没有MERGE_HEAD? - Alexander Samoylov

0

你还没有将合并后的更改推送到远程分支。合并只影响本地分支,因此本地分支和远程分支之间存在差异。


是的,我也没有提交这些更改。所以,即使是 git diff 也应该显示出些什么? - Kartik Anand
你还需要将你的更改推送到远程分支。 - Shashwat Kumar
是的,我知道,我只是想问为什么“git diff”没有显示任何内容? - Kartik Anand
好的,我理解不同了。只需检查远程分支上是否存在合并的更改即可。 - Shashwat Kumar

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