Ответ 1
git diff --name-only --diff-filter=U
Мне просто нужен простой список конфликтующих файлов.
Есть ли что-нибудь попроще, чем:
git ls-files -u | cut -f 2 | sort -u
или же:
git ls-files -u | awk '{print $4}' | sort | uniq
Я думаю, я мог бы создать удобный alias
для этого, однако было интересно, как это делают профессионалы. Я бы использовал его для написания циклов оболочки, например, для автоматического разрешения конфликтов и т.д. Может быть, заменить этот цикл, подключив в mergetool.cmd
?
git diff --name-only --diff-filter=U
Попытка ответить на мой вопрос:
Нет, кажется, нет более простого способа, чем тот, который находится в вопросе, из коробки.
После того, как вы набрали это слишком много раз, просто вставив более короткий в исполняемый файл с именем "git -conflicts", доступный для git, теперь я могу просто:
git conflicts
, чтобы получить список, который я хотел.
Обновление: как предлагает Ричард, вы можете настроить псевдоним git в качестве альтернативы исполняемому файлу
git config --global alias.conflicts '!git ls-files -u | cut -f 2 | sort -u'
Преимущество использования исполняемого файла над псевдонимом заключается в том, что вы можете делиться этим script с членами команды (в двоичной части репо).
Вот глупый способ:
grep -H -r "<<<<<<< HEAD" /path/to/project/dir
git status
отображает "измененные" рядом с файлами, у которых есть конфликты вместо "измененного" или "нового файла" и т.д.
git status --short | grep "^UU "
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
Это работает для меня:
git grep '<<<<<<< HEAD'
или
git grep '<<<<<<< HEAD' | less -N
вы можете нажать git ls-files -u
в командной строке, в котором перечислены файлы с конфликтами
Возможно, это было добавлено в Git, но файлы, которые еще не были разрешены, перечислены в сообщении состояния (git status) следующим образом:
#
# Unmerged paths:
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both modified: syssw/target/libs/makefile
#
Обратите внимание, что это раздел Unmerged paths.
Если вы попытаетесь зафиксировать, и если есть конфликты, то git предоставит вам список нерешенных конфликтов... но не как обычный список. Это обычно то, что вы хотите, работая в интерактивном режиме, потому что список становится короче, когда вы исправляете конфликты.
Предполагая, что вы знаете, где находится ваш корневой каталог git, $ {GIT_ROOT}, вы можете сделать:
cat ${GIT_ROOT}/.git/MERGE_MSG | sed '1,/Conflicts/d'
Я всегда использовал git status
.
может добавить awk
в конце, чтобы получить только имена файлов
git status -s | grep ^U | awk '{print $2}'
Мои 2 цента здесь (даже когда есть много крутых/рабочих ответов)
Я создал этот псевдоним в моем .gitconfig
[alias]
...
conflicts = !git diff --name-only --diff-filter=U | grep -oE '[^/ ]+$'
который покажет мне только имена файлов с конфликтами... не весь их путь :)
Вот что я использую для списка измененных файлов, подходящих для подстановки командной строки в 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
чтобы экранировать или заключать в кавычки пробелы, и выходной список выглядел правильно, но подстановка $()
прежнему не работала должным образом.
небольшая вариация ответа Чарльза Бейли дает больше информации:
git diff --name-only --diff-filter=U | xargs git status
Как подчеркивалось в других ответах, мы можем просто использовать команду git status, а затем искать файлы, перечисленные в разделе Unmerged paths: