在Git中列出冲突文件的最简单方法是什么?


692

我只需要一个简单的冲突文件列表。

还有什么比以下更简单的了:

git ls-files -u  | cut -f 2 | sort -u

要么:

git ls-files -u  | awk '{print $4}' | sort | uniq

我想我可以alias为此设置一个方便的工具,但是想知道专业人士是如何做到的。我会用它来编写shell循环,例如自动解决冲突等。也许可以通过插入mergetool.cmd?来替换该循环。


2
git rebase --continue将列出有冲突的文件(如果有)
jacob

git状态足够
Amruth A

在有冲突的合并会话中,git merge --continue`将显示有冲突的列表文件。
Jayan

git rebase --continue没有列出冲突,只是告诉我要解决它们(git版本2.21.0)
加里

Answers:


1208
git diff --name-only --diff-filter=U

131
我为此创建了一个别名:git config --global alias.conflicts "diff --name-only --diff-filter=U"
Jimothy

1
@CharlesBailey,我想念什么吗?什么是git status
Pacerier,2015年

8
@Pacerier,只是比较混乱。如果您有一百万个无冲突的合并和一个有冲突的合并,那么您希望输出的内容简洁。
xster

8
@sAguinaga:只需运行git conflicts
Jimothy

1
即使解决了冲突,此操作仍继续显示文件。git diff --check效果更好。
user3812377

63

git diff --check

将显示包含冲突标记(包括行号)的文件列表。

例如:

> git diff --check
index-localhost.html:85: leftover conflict marker
index-localhost.html:87: leftover conflict marker
index-localhost.html:89: leftover conflict marker
index.html:85: leftover conflict marker
index.html:87: leftover conflict marker
index.html:89: leftover conflict marker

来源:https : //ardalis.com/detect-git-conflict-markers


1
我还git diff --check告诉我有关其他(不太严重的)问题的信息,例如尾随空格,所以git diff --check | grep -i conflict可能是为了处理OP的情况
CCJ

37

试图回答我的问题:

不,似乎没有比问题中的方法更简单的方法了。

在多次输入之后,只需将较短的代码粘贴到名为“ git-conflicts”的可执行文件中,即可使用git进行访问,现在我可以: git conflicts获得所需的列表。

更新:按照Richard的建议,您可以设置git别名,以替代可执行文件

git config --global alias.conflicts '!git ls-files -u | cut -f 2 | sort -u'

在别名上使用可执行文件的一个优点是,您可以与团队成员共享该脚本(在仓库的bin目录中)。


1
那时,我的想法是一样的-思考人们到底是怎么需要它的,然后看看解决方法是多么微不足道。但是,我已经使用git 2年了,说实话,我再也没有遇到过这种“局限性”。所以也许那毕竟不是那么常见的用例?
辛格

4
这很简单,您可以为其设置别名git config --global alias.conflicts "!git ls-files -u | cut -f 2 | sort -u"(!表示运行此shell命令,而不仅仅是git命令)。
理查德

1
值得一提的是,您实际上想要的是“单引号”而不是“双引号”。否则,!将由您的shell解释:git config --global alias.conflicts '!git ls-files -u | cut -f 2 | sort -u'
umop'12

26

这是一种简单的方法:

grep -H -r "<<<<<<< HEAD" /path/to/project/dir

9
不会。即使删除了文件中的文本标记,Git的索引仍会在内部将某些文件标记为发生冲突。
亚历山大·伯德

7
除了亚历山大的评论之外,将其作为选项仍然很有用:)请不要删除。
WoodenKitty 2014年

3
或者要在当前工作目录中运行,请使用点作为路径grep -H -r "<<<<<<< HEAD" .
David Douglas

呵呵,这也是我的做法。添加一个c很好的结果也可以计算冲突!请注意,我将使用标志-Hrn来提供行号信息。
ShellFish

3
如果您使用的是正则表达式,建议[<=>]{7}不要使用它。(可能需要-E标记才能在grep中起作用。)或者,<{7}如果您不担心悬挂的合并标记或想要计算冲突,则可以。(您也可以使用git grep-则不需要-r标志。)
celticminstrel

22

git status 在有冲突的文件旁边显示“已修改”,而不是“已修改”或“新文件”等


3
确实如此。但是,这个特定问题是关于冲突文件的简单列表。这可能是一个XY问题(我不记得为什么我实际上需要该冲突列表,但是由于我实际上不需要它,这一事实可能表明我应该我当时还在写脚本来自动解决java-import冲突,该脚本需要此列表,即非交互使用)
。– inger

哦,我还不明白。我以为您想要“正常”使用的“正常”列表。这就是为什么我不喜欢自己的代码和自己的答案的原因……然后我意识到“两者都修改”对我来说很有意义(我以为您只是想和我一样,为什么不呢?;- P)不过感谢您的支持:)
拉法

17
git status --short | grep "^UU "

4
注意:您可能还需要搜索^ UA和^ UD,因此以下模式更完整:“ ^ U [UAD]”
mda 2012年

或只是^U为了让一切以U开头
Ascherer 2014年

7
这还不够。冲突的文件可以具有以下组合:DD, AU, UD, UA, DU, AA, UU
Anthony Sottile 2014年

1
@AnthonySottile:您能解释一下这些情况吗?我发布了对我的案子有用的方法。
mda

@mda一个例子:上游被修改的冲突,我删除的将具有状态DU
Anthony Sottile

13

这对我有用:

git grep '<<<<<<< HEAD'

要么

git grep '<<<<<<< HEAD' | less -N


2
冲突可能包括修改后的文件或删除后的文件,此解决方案将不涵盖这些文件。
三月


3

如果您尝试提交,并且存在冲突,那么git会为您提供当前未解决的冲突的列表...但不是简单列表。这通常是交互工作时想要的,因为解决冲突后列表会变短。


2
“是交互式的,因为在解决冲突时列表会变短。” 有趣。我一直为此目的使用mergetool。
辛格

3

也许这已被添加到Git,但是状态消息(git status)中列出了尚未解决的文件,如下所示:

#
# Unmerged paths:
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#   both modified:      syssw/target/libs/makefile
#

请注意,这是“未合并的路径”部分。


1

假设您知道git根目录$ {GIT_ROOT}的位置,

 cat ${GIT_ROOT}/.git/MERGE_MSG | sed '1,/Conflicts/d'

0

我一直都用过git status

可以添加awk到最后以获取文件名

git status -s | grep ^U | awk '{print $2}'


0

我在这里的2美分(即使有很多冷静/积极的回应)

我在我的别名中创建了这个别名 .gitconfig

[alias]
 ...
 conflicts = !git diff --name-only --diff-filter=U | grep -oE '[^/ ]+$'

这将仅显示有冲突的文件名...而不是它们的完整路径:)


0

这是我用来列出适用于bash中命令行替换的修改文件的内容

git diff --numstat -b -w | grep ^[1-9] | cut -f 3

要编辑列表,请使用$(cmd)替换。

vi $(git diff --numstat -b -w | grep ^[1-9] | cut -f 3)

如果文件名带有空格,则不起作用。我试图使用sed转义符或引号来使空格和输出列表看起来正确,但是$()替换仍然没有达到预期的效果。



-1

查尔斯·贝利(Charles Bailey)的回答略有不同,可提供更多信息:

git diff --name-only --diff-filter=U | xargs git status

-2

正如其他答案中突出显示的那样,我们可以简单地使用git status命令,然后查找“未合并路径”下列出的文件:

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.