Який найпростіший спосіб перерахувати конфліктні файли в 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

статусу git достатньо
Amruth A

1
У конфліктному сеансі злиття `git merge --continue` відображатиме список файлів із конфліктами.
Джая

git rebase --continueне перераховував конфлікти, просто сказав мені виправити їх (git версія 2.21.0)
Gary

Відповіді:


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

131
Я створив псевдонім для цього:git config --global alias.conflicts "diff --name-only --diff-filter=U"
Jimothy

1
@CharlesBailey, я щось пропускаю? Що неправильно з git status?
Пейсьєр

8
@Pacerier, це просто messier. Якби у вас був мільйон безконфліктних злиттів і одне конфліктне злиття, ви хочете отримати щось коротке для виведення.
xster

8
@sAguinaga: Просто запустітьgit conflicts
Джимоті

1
Це продовжує показувати файл навіть після вирішення конфлікту. git diff --checkпрацює краще.
користувач3812377

64

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може бути для справи ОП
CCJ

37

Намагаюся відповісти на моє запитання:

Ні, не здається, що немає простішого способу, ніж той, що йдеться у питанні, поза рамками.

Після того, як надто багато разів набрав текст, я просто вставив коротший у виконуваний файл з назвою "git-конфлікти", доступний для git, тепер я можу просто: git conflictsотримати список, який я хотів.

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

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

Перевагою використання виконуваного файлу над псевдонімом є те, що ви можете поділитися цим сценарієм з членами команди (у частині бін-репу репо).


1
Я відчував те саме в той момент - думаючи, як пекло людей цього не потребує, і бачив, наскільки тривіальним було подолання. Однак я використовую git вже 2 роки і, чесно кажучи, ще раз не стикався з цим "обмеженням". То, може, це не так вже й багато загального використання?
inger

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прапор, щоб він працював у греппі.) Або, <{7}якщо ви не переживаєте за звисання маркерів злиття або хочете рахувати конфлікти. (Ви також можете використовувати git grep- тоді вам не потрібен -rпрапор.)
celticminstrel

22

git status відображає "обидва модифіковані" поруч із файлами, які мають конфлікти замість "модифікованого" або "нового файлу" тощо


3
Це правда. Однак це конкретне питання стосувалося простого списку конфліктованих файлів .. це може бути проблемою XY (я не можу пригадати, чому мені насправді потрібен цей конфліктний список, але той факт, що він мені не потрібен, оскільки може підказати, що я повинен Тоді я дотримувався іншого підходу. Не впевнений зараз .. Я також писав сценарії для автоматичного розв’язання конфліктів Java-імпорту, які потребували цього списку, тобто неінтерактивного використання) ..
inger

О, я цього не зрозумів. Я думав, що ви хочете "нормальний" список для "нормального" використання. Ось чому я злякався від вашого власного коду та вашої самовідповіді ... тоді я зрозумів, що "обидві модифіковані" речі спрацювали на мене (і я припустив, що ви просто хочете те саме, що і я, чому ви не повинні ?; - П) Дякую за підтримку, проте :)
Рафа

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

4
Примітка: Вам може знадобитися для пошуку ^ UA і ^ UD також, так що наступна картина є більш повним: «^ U [UAD]»
мда

або просто, ^Uщоб все почати з U
Ascherer

7
Цього недостатньо. Файли, що конфліктують, можуть мати такі комбінації:DD, AU, UD, UA, DU, AA, UU
Ентоні Соттіл

1
@AnthonySottile: Чи можете ви пояснити сценарії? Я розмістив те, що працювало на мою справу.
mda

@mda Один із прикладів: Конфлікт, де модифіковано вище, я видалив, матиме статусDU
Ентоні Соттиль

13

Це працює для мене:

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

або

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


2
Конфлікти можуть включати модифіковані та видалені файли, які це рішення не охоплюватиме.
MAR


3

Якщо ви намагаєтеся здійснити і якщо є конфлікти, то git надасть вам список нерозв’язаних на сьогодні конфліктів ... але не як звичайний список. Зазвичай це вам потрібно, коли ви працюєте в інтерактивному режимі, оскільки список стає коротшим, коли ви виправляєте конфлікти.


2
"інтерактивно, оскільки список стає коротшим, коли ви виправляєте конфлікти." Цікаво. Я завжди використовував для цього mergetool.
inger

3

Можливо, це було додано до Git, але файли, які ще мають бути вирішені, вказані у повідомленні про стан (статус git) на зразок цього:

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

Зауважте, що це розділ Ненавантажені шляхи.


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 - продовжувати.


-1

незначна зміна відповіді Чарльза Бейлі, яка дає більше інформації:

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

-2

Як підкреслено в інших відповідях, ми можемо просто скористатися статусом git команд, а потім шукати файли, перелічені в розділі Unmerged paths:

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.