为什么我的合并提交没有冲突显示在 git 由一个文件夹过滤的日志中,但在涉及两个文件夹时却没有显示在另一个文件夹中?

Why does my merge commit with no conflicts show up in git log filtered by one folder but not another when it involves both folders?

在使用一种工具来确定先前导出的给定提交的相关历史记录时,我在 git 日志中发现了一个相当奇怪的行为,我似乎无法确定发生了什么。我希望有人可以帮助解释这种行为。

我创建了以下提交图,并且在同一存储库中有两个独立的工作区。工作区 A 在列出的每个提交中都更新了一个文件,除了 E 和 I 是简单合并(例如 git merge bar 创建的提交 I)。另一方面,工作区 B 仅在提交 A 和 L 中更改了文件。

当我 运行 git log --name-only --oneline -- workspaceA 时,我列出了提交 'I',但没有文件受到影响:

b7faf96 (HEAD -\> main) Commit I  
a3c265e Commit H  
workspaceA/H  
e03be40 (bar) Commit L  
workspaceA/L  
7ead348 Commit G  
workspaceA/G  
7b80d8d (tag: workspaceA-2020.0.2.0, baz) Commit B  
workspaceA/B  
d383bfa Commit F  
workspaceA/F  
6d2b8a4 (tag: workspaceB-2020.0.1.0, tag: workspaceA-2020.0.1.0) Commit A  
workspaceA/A  
...

请注意,此列表包含提交 'I',但未在提交下列出任何文件。

现在,当我 运行 git log --name-only --oneline -- workspaceB 我得到一个根本不包含提交 'I' 的列表:

e03be40 (bar) Commit L  
workspaceB/L  
6d2b8a4 (tag: workspaceB-2020.0.1.0, tag: workspaceA-2020.0.1.0) Commit A  
workspaceB/A  
...

我的问题是提交 'I' 是否出现没有任何一致性,即使在创建提交 'I' 的合并期间实际上更改了 none 文件.谁能解释为什么会这样?

这不符合我的期望,因为我不明白为什么提交 'I' 只在过滤一个文件夹而不是另一个文件夹时出现,即使合并涉及对两个文件夹的更改,如中所示我的截图。

默认情况下,git log 完全隐藏合并提交的差异。

添加 diff-merges 选项之一以查看考虑了哪些文件:我建议 --cc,您也可以尝试 -c-m


来自 git help log :

DIFF FORMATTING :

[...]

--diff-merges=(off|none|on|first-parent|1|separate|m|combined|c|dense-combined|cc)

Specify diff format to be used for merge commits. Default is off unless --first-parent is in use, in which case first-parent is the default.

Shorthand 选项为:

  • -m 对于 --diff-merges=on--diff-merges=m
  • -c 对于 combined
  • --cc 对于 dense-combined

发生这种情况的原因是因为 Git 从您指定的路径过滤器的角度向您展示了代表新 状态 的提交列表。

workspaceA 的 POV 来看,合并 两侧的那个文件夹中的某些内容发生了变化。提交 I 有两个父项:HLHLmerge-base 是提交 BB 和 [=] 之间的 workspaceA 中至少有一处更改12=],以及 BL 之间。这意味着提交 I 具有 workspaceA 的新状态,即使提交本身不包含任何更改。

请注意,workspaceB 并非如此。 BH之间没有变化,BL之间有变化。因此合并提交 I 与已经列出的 L 相比不会有状态变化。