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

时间:2010-06-17 21:08:52

标签: git git-merge git-merge-conflict

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

有什么比这更简单:

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

或:

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

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

20 个答案:

答案 0 :(得分:1029)

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

答案 1 :(得分:34)

试着回答我的问题:

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

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

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

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

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

答案 2 :(得分:22)

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

答案 3 :(得分:20)

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

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

答案 4 :(得分:19)

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

答案 5 :(得分:17)

git status --short | grep "^UU "

答案 6 :(得分:11)

这对我有用:

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

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

答案 7 :(得分:10)

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

答案 8 :(得分:3)

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

grep -rnw . -e '^<<<<<<<$'

答案 9 :(得分:3)

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

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

请注意,这是Unmerged paths部分。

答案 10 :(得分:2)

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

答案 11 :(得分:1)

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

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

答案 12 :(得分:0)

我的2美分在这里(即使有很多冷静/有效的答复)

我在.gitconfig

中创建了此别名
[alias]
 ...
 conflicts = !git diff --name-only --diff-filter=U | grep -oE '[^/ ]+$'

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

答案 13 :(得分: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来转义或引用空格,并且输出列表看起来正确,但是$()替换仍然无法达到预期的效果。

答案 14 :(得分:0)

实用程序git向导https://github.com/makelinux/git-wizard分别计算未解决的冲突更改(冲突)和未合并的文件。必须手动解决冲突或使用mergetool解决冲突。通常可以使用git rebase --continue添加并提交已解决的未合并更改。

答案 15 :(得分:0)

answer by Jones Agyemang对于大多数用例而言可能已经足够,并且是我的解决方案的一个很好的起点。为了在Git Bent(我制作的git wrapper库)中编写脚本,我需要更强大的功能。我正在发布我编写的原型,该原型还不是完全脚本友好的

注释

  • 链接的答案通过使用具有<<<<<<< HEAD的{​​{1}}来检查不适用于合并冲突的git stash apply
  • 我的解决方案确认了<<<<<<< Updated Upstream=======的存在
  • 链接的答案肯定表现更好,因为它不必做太多的事
  • 我的解决方案不提供行号

打印合并冲突的文件

您需要下面的>>>>>>>函数。

str_split_line

输出

# Root git directory
dir="$(git rev-parse --show-toplevel)"
# Put the grep output into an array (see below)
str_split_line "$(grep -r "^<<<<<<< " "${dir})" files
bn="$(basename "${dir}")"
for i in "${files[@]}"; do 
    # Remove the matched string, so we're left with the file name  
    file="$(sed -e "s/:<<<<<<< .*//" <<< "${i}")"

    # Remove the path, keep the project dir's name  
    fileShort="${file#"${dir}"}"
    fileShort="${bn}${fileShort}"

    # Confirm merge divider & closer are present
    c1=$(grep -c "^=======" "${file}")
    c2=$(grep -c "^>>>>>>> " "${file}")
    if [[ c1 -gt 0 && c2 -gt 0 ]]; then
        echo "${fileShort} has a merge conflict"
    fi
done

通过行函数分割字符串

如果您不希望将其作为单独的功能,则只需复制代码块

projectdir/file-name
projectdir/subdir/file-name

答案 16 :(得分:0)

我一直只使用git status

可以在末尾添加awk以获取文件名

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

答案 17 :(得分:0)

对我来说,接受的答案不起作用。防止捕获

警告:LF 将替换为 [] 中的 CRLF。 该文件将在您的工作目录中以原始行结尾

在 Powershell 中,我改用了这个:

git ls-files -u| ForEach{($_.Split("`t"))|Select-Object -Last 1}| get-unique

答案 18 :(得分:-1)

Charles Bailey的回答略有不同,提供了更多信息:

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

答案 19 :(得分:-1)

正如其他答案中所强调的那样,我们只需使用命令 git status ,然后查找未合并路径下列出的文件: