833

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

有什么比以下更简单的:

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

或者:

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

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

4

20 回答 20

1444

使用 git diff,使用name-only 仅显示名称,使用diff-filter=U仅包含“未合并”文件。

git diff --name-only --diff-filter=U
于 2012-06-03T23:43:59.907 回答
134

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

于 2018-03-20T11:14:56.400 回答
42

试图回答我的问题:

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

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

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

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

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

于 2010-06-26T21:07:39.800 回答
38

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

grep -H -r "<<<<<<< HEAD" /path/to/project/dir
于 2013-12-16T11:50:16.450 回答
25

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

于 2011-10-19T09:53:42.147 回答
20
git status --short | grep "^UU "
于 2012-02-10T16:33:15.820 回答
17

这对我有用:

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

或者

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

于 2016-10-27T15:57:39.203 回答
14

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

于 2015-08-11T07:34:55.500 回答
5

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

于 2011-08-04T07:20:28.633 回答
5

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

grep -rnw . -e '^<<<<<<<$'
于 2021-02-21T10:50:02.413 回答
3

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

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

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

于 2015-04-21T15:04:27.517 回答
1

我一直只是用git status

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

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

于 2014-01-24T18:06:36.227 回答
1

假设你知道你的 git 根目录 ${GIT_ROOT} 在哪里,你可以这样做,

 cat ${GIT_ROOT}/.git/MERGE_MSG | sed '1,/Conflicts/d'
于 2018-08-10T00:16:26.083 回答
1

我在这里的 2 美分(即使有很多很酷/有效的回应)

我在我的.gitconfig

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

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

于 2018-12-10T15:35:13.783 回答
0

查尔斯·贝利的回答略有不同,提供了更多信息:

git diff --name-only --diff-filter=U | xargs git status
于 2014-02-04T01:44:29.153 回答
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转义或引用空格并且输出列表看起来正确,但$()替换仍然没有按预期运行。

于 2019-03-06T00:26:40.020 回答
0

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

于 2020-05-05T09:51:00.543 回答
0

Jones Agyemang的答案对于大多数用例来说可能已经足够了,并且是我解决方案的一个很好的起点。对于我制作的 git 包装库Git Bent中的脚本,我需要一些更强大的东西。我正在发布我编写的原型,但它还不是完全适合脚本的

笔记

  • 链接的答案检查<<<<<<< HEADwhich 不适用于使用git stash applywhich has的合并冲突<<<<<<< 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

按行函数拆分字符串

如果您不希望将其作为单独的函数,您可以只复制代码块

function str_split_line(){
# for IFS, see https://stackoverflow.com/questions/16831429/when-setting-ifs-to-split-on-newlines-why-is-it-necessary-to-include-a-backspac
IFS="
"
    declare -n lines=$2
    while read line; do
        lines+=("${line}")
    done <<< "${1}"
}
于 2020-09-25T23:56:21.783 回答
0

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

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

在 Powershell 中,我使用了这个:

git ls-files -u| ForEach{($_.Split("`t"))|Select-Object -Last 1}| get-unique
于 2021-04-30T15:34:31.717 回答
-3

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

于 2018-05-01T10:44:27.207 回答