当我遇到合并冲突并输入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
一次时。
在这种情况下,它已经列出了两次相同的文件,但我曾经有过三次列出同一文件的次数。
这是预期的行为吗?
答案 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 93a7d98 的 commit ed644d1、commit f1c462e、ZheNing 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
选项为
在使用中,此选项无效。