为什么`git ls-files --modified`在合并冲突中多次显示文件?

时间:2018-05-28 14:20:02

标签: git

当我遇到合并冲突并输入git ls-files --modified时,我希望它会显示当前合并冲突中修改的文件列表,并且只显示一次文件。但有时它会显示多次列出的同一文件。例如,当我执行以下操作时:

git init
git commit --allow-empty -m 'init'
echo hello world > file
git add -A
git commit -m "hello world"
git checkout HEAD^
git checkout -b other
echo hello other > file
git add -A
git commit -m "hello other"
git merge master 
# Generates conflict
git ls-files --modified

显示

file
file

当git状态仅显示file一次时。

在这种情况下,它已经列出了两次相同的文件,但我曾经有过三次列出同一文件的次数。

这是预期的行为吗?

2 个答案:

答案 0 :(得分:4)

git ls-files是一个低级命令(在Git世界中,这称为" plumbing命令"),它显示了Git存储库的内部状态。更准确地说,它列出了索引中的条目。

当合并最终发生冲突时,每个冲突的文件在索引中都有3个条目:一个用于共同的祖先,一个用于您的版本,另一个用于要合并的版本。这是允许git diff在您有未解决的冲突时向您显示组合差异的原因。

作为上述两个陈述的结果,如果发生冲突,git ls-files显示同一文件的几个条目是合乎逻辑的。

答案 1 :(得分:0)

使用 Git 2.31(2021 年第一季度)会更容易:“git ls-files(man) 可以并且确实在取消合并索引时显示多个条目,即除非使用 -s/-u 选项,否则会引起混淆。
引入了一个新选项 --deduplicate

请参阅 commit 93a7d98commit ed644d1commit f1c462eZheNing Hu (adlternative)(2021 年 1 月 23 日)。
(由 Junio C Hamano -- gitster --commit 5198426 合并,2021 年 2 月 5 日)

<块引用>

ls-files.c:添加--deduplicate选项

签字人:胡哲宁 [jc:扩展文档和重写提交日志]
签字人:Junio C Hamano gitster@pobox.com

<块引用>

在合并冲突期间,文件名可能会在“git ls-files(man) 输出中出现多次,每个阶段出现一次。
如果您同时使用 --delete--modify,输出可能会两次提及已删除的文件。

当没有使用“-t”、“-u”或“-s”选项时,这些重复条目不会为输出增加太多价值。

引入一个新的“--deduplicate”选项来抑制它们。

git ls-files 现在包含在其 man page 中:

<块引用>

--deduplicate

当只显示文件名时,禁止重复 来自合并期间的多个阶段,或给予 --deleted--modified 选项。

当任何 -t--unmerged--stage 选项为 在使用中,此选项无效。