Какой самый простой способ перечислить конфликтующие файлы в Git?


692

Мне просто нужен простой список конфликтующих файлов.

Есть ли что-нибудь попроще, чем:

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

или:

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

Я думаю, я мог бы подготовить aliasдля этого удобную вещь, однако мне было интересно, как это делают профессионалы. Я бы использовал его для написания циклов оболочки, например, для автоматического разрешения конфликтов и т. Д. Может быть, заменить этот цикл, подключившись к нему mergetool.cmd?


2
git rebase --continueперечислит файлы с конфликтами (если они есть)
jacob

достаточно
мерзавца

1
В конфликтующей сессии слияния `git merge --continue` покажет список файлов с конфликтами.
Джаян

git rebase --continueне перечислил конфликты, просто сказал мне их исправить (git version 2.21.0)
Gary

Ответы:


1213
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

8
@Pacerier, это просто грязно. Если бы у вас было миллион бесконфликтных слияний и одно конфликтующее слияние, вы бы хотели получить что-то сжатое для вывода.
xster

8
@sAguinaga: Просто бегиgit conflicts
Джимоти,

1
Это продолжает показывать файл даже после разрешения конфликта. git diff --checkработает лучше.
user3812377

66

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-конфликты', сделанный доступным для git, теперь я могу просто: git conflicts получить список, который я хотел.

Обновление: как предлагает Ричард, вы можете установить псевдоним git, как альтернативу исполняемому файлу

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

Преимущество использования исполняемого файла перед псевдонимом заключается в том, что вы можете поделиться этим сценарием с членами команды (в разделе репозитория bin dir).


1
В тот момент я почувствовал то же самое - подумал, как, черт возьми, людям это не нужно, и увидел, как тривиально было обойти это. Тем не менее, я использую git уже 2 года и, честно говоря, больше не сталкивался с этим «ограничением». Так что, может быть, в конце концов это не очень распространенный случай?
Зингер

4
Это достаточно просто, чтобы вы могли настроить для него псевдоним git config --global alias.conflicts "!git ls-files -u | cut -f 2 | sort -u"(! Означает запустить эту команду оболочки, а не просто команду git).
Ричард

1
Стоит отметить, что вы на самом деле хотите «одинарные кавычки» вместо «двойных кавычек». В противном случае !оболочка будет интерпретироваться вашей оболочкой:git config --global alias.conflicts '!git ls-files -u | cut -f 2 | sort -u'
umop

26

Вот надежный способ:

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

9
Нет. Индекс Git по-прежнему помечает определенные файлы как конфликтующие даже после удаления текстовых маркеров в файлах.
Александр Берд

7
Наряду с комментарием Александра, все еще полезно рассматривать это как вариант :) Пожалуйста, не удаляйте.
WoodenKitty

3
Или для запуска в текущем рабочем каталоге используйте точку для путиgrep -H -r "<<<<<<< HEAD" .
Дэвид Дуглас

Хе-хе, это мой способ сделать это тоже. Добавление cприятно приводит к подсчету конфликтов тоже! Одно замечание: я бы использовал флаги, -Hrnэто также даст информацию о номере строки.
ShellFish

3
Если вы используете регулярное выражение, я бы предложил [<=>]{7}вместо этого. (Может понадобиться -Eфлаг, чтобы это работало в grep.) Или, <{7}если вы не беспокоитесь о свисающих маркерах слияния или хотите подсчитать конфликты. (Вы также можете использовать git grep- тогда вам не нужен -rфлаг.)
celticminstrel

22

git status отображает «оба измененных» рядом с файлами, которые имеют конфликты вместо «измененный» или «новый файл» и т. д.


3
Это правда. Однако этот конкретный вопрос был о простом списке конфликтующих файлов ... это может быть проблема XY (я не могу вспомнить, почему мне действительно нужен этот список конфликтов, но тот факт, что я не нуждался в этом, так как это может означать, что я должен тогда я придерживался другого подхода. Не уверен, что сейчас .. Я также писал сценарии для автоматического разрешения конфликтов импорта java, которые нуждались в этом списке, т. е. не интерактивное использование) ..
inger

О, я этого не поняла. Я думал, что вы хотели "нормальный" список для "нормального" использования. Вот почему я взбесился с твоим собственным кодом и твоим самоответом ... потом я понял, что "обе модификации" работают на меня (и я предположил, что ты просто хотел того же, что и я, почему бы и нет? P) Спасибо за upvote, хотя :)
Рафа

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

4
Примечание. Вам также может понадобиться поискать ^ UA и ^ UD, поэтому следующий шаблон более полон: «^ U [UAD]»
mda

или просто, ^Uчтобы все началось с U
Ascherer

7
Этого недостаточно. Конфликтующие файлы могут иметь следующие комбинации:DD, AU, UD, UA, DU, AA, UU
Anthony Sottile

1
@AnthonySottile: Можете ли вы объяснить сценарии? Я отправил то, что работало для моего случая.
mda

@mda Один из примеров: конфликт, в котором исходные данные были изменены, я удалил, будет иметь статусDU
Anthony Sottile,

13

Это работает для меня:

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

или

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


2
Конфликты могут включать в себя измененные и удаленные файлы, которые это решение не охватывает.
MAR


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
#

Обратите внимание, что это раздел Unmerged paths.


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для экранирования или кавычек пробелы, и выходной список выглядел правильно, но $()подстановка все равно не работала так, как хотелось бы.


0

Мастер утилит git https://github.com/makelinux/git-wizard подсчитывает отдельно неразрешенные конфликтующие изменения (коллизии) и неотправленные файлы. Конфликты должны быть разрешены вручную или с помощью mergetool. Разрешенные неотправленные изменения могут быть добавлены и зафиксированы обычно с помощью git rebase --continue.


-1

небольшое изменение ответа Чарльза Бейли, который дает больше информации:

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

-2

Как подчеркивалось в других ответах, мы можем просто использовать команду git status, а затем искать файлы, перечисленные в разделе Unmerged paths:

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.