获取冲突文件列表的最简单方法是什么?

ing*_*ger 641 git git-merge git-merge-conflict

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

有什么比这简单:

git ls-files -u  | cut -f 2 | sort -u
Run Code Online (Sandbox Code Playgroud)

要么

git ls-files -u  | awk '{print $4}' | sort | uniq
Run Code Online (Sandbox Code Playgroud)

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

CB *_*ley 1123

git diff --name-only --diff-filter=U
Run Code Online (Sandbox Code Playgroud)

  • 我为此创建了一个别名:`git config --global alias.conflicts"diff --name-only --diff-filter = U"` (118认同)
  • 即使解决冲突后,该文件仍会继续显示。`git diff --check` 效果更好。 (7认同)
  • @Pacerier,它只是更加混乱.如果你有一百万个无冲突的合并和一个冲突的合并,你需要一些简洁的输出. (6认同)
  • @sAguinaga:简单地运行`git conflicts` (6认同)
  • @CharlesBailey,我错过了什么吗?`git status` 有什么问题? (4认同)
  • diff-filter = U是什么? (3认同)
  • 看起来很好,似乎工作 - 谢谢!你知道什么时候--diff-filter可用吗? (2认同)
  • 值得注意的是,这仅在项目到达冲突后尚未暂存(或取消暂存)时才有效。@cnlevy 的 [answer](/sf/answers/3456794071/) (`git diff --check`) 将查找未暂存文件的冲突标记。 (2认同)

cnl*_*evy 39

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
Run Code Online (Sandbox Code Playgroud)

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

  • 我发现 `git diff --check` 也告诉我其他(不太严重的)问题,比如尾随空格,所以 `git diff --check | grep -i冲突`可能适合OP的情况 (2认同)
  • `git diff --check` 使用 core.whitespace 中的空白规则。您可以在 `git` 调用期间禁用所有空格检查,以获取冲突标记: `git -c core.whitespace=-trailing-space,-space-before-tab,-indent-with-non-tab,-tab -in-indent,-cr-at-eol diff --check` (2认同)

ing*_*ger 36

试着回答我的问题:

不,似乎没有任何比问题更简单的方法,开箱即用.

在输入太多次之后,只需将较短的一个粘贴到名为'git-conflicts'的可执行文件中,git可以访问,现在我可以: git conflicts获取我想要的列表.

更新:正如Richard建议的那样,您可以设置一个git别名,作为可执行文件的替代

git config --global alias.conflicts '!git ls-files -u | cut -f 2 | sort -u'
Run Code Online (Sandbox Code Playgroud)

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

  • 这很简单,你可以为它设置一个别名`git config --global alias.conflicts"!git ls-files -u | cut -f 2 | sort -u"`(这意味着运行这个shell命令,而不仅仅是一个git命令). (4认同)

Raf*_*afa 21

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

  • 确实如此.然而,这个特殊的问题是关于冲突文件的简单列表..这可能是一个XY问题(我不记得为什么我实际上需要冲突列表,但事实上我没有需要它,因为可能暗示我应该那时候已经采用了不同的方法.现在还不确定..我也在编写脚本来自动解决需要这个列表的java-import冲突,即非交互式使用). (3认同)
  • 还可能存在合并冲突,其中一个分支删除了文件,而另一个分支修改了该文件。这些不会显示在`git status | 中。grep“都修改了”`。 (2认同)

小智 21

这是一个万无一失的方式:

grep -H -r "<<<<<<< HEAD" /path/to/project/dir
Run Code Online (Sandbox Code Playgroud)

  • 不会.即使删除了文件中的文本标记,Git的索引仍会在内部将某些文件标记为冲突. (9认同)
  • 除了亚历山大的评论之外,将此作为选项仍然有用:)请不要删除. (7认同)
  • 或者在当前工作目录中运行使用路径点 - "grep -H -r"<<<<<<< HEAD".` (3认同)
  • 如果你正在使用正则表达式,我建议`[<=>] {7}`而不是这个.(可能需要`-E`标志才能在grep中工作.)或者,如果你不担心悬挂合并标记或想要计算冲突,那么`<{7}`.(你也可以使用`git grep` - 然后你不需要`-r`标志.) (3认同)

mda*_*mda 17

git status --short | grep "^UU "
Run Code Online (Sandbox Code Playgroud)

  • 这还不够.冲突文件可以具有以下组合:`DD,AU,UD,UA,DU,AA,UU` (7认同)
  • 注意:您可能还需要搜索^ UA和^ UD,因此以下模式更完整:"^ U [UAD]" (4认同)
  • @self 还有`^(.U|U.|AA|DD)`。 (2认同)

Eri*_*ang 12

这对我有用:

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

要么

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

  • 冲突可能包括修改过的文件和删除的文件,本解决方案不涵盖这些文件。 (2认同)

Emi*_*uez 10

您可以点击git ls-files -u命令行,列出有冲突的文件


Den*_*ing 6

如果您正在本地 git 存储库或应用的目录中工作,我还建议您使用以下命令patch -p1 --merge < ...

grep -rnw . -e '^<<<<<<<$'
Run Code Online (Sandbox Code Playgroud)


小智 5

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

  • “交互式,因为当您解决冲突时,列表会变短。” 有趣的。我一直为此目的使用mergetool。 (2认同)