¿Cuál es la forma más simple de enumerar archivos en conflicto en Git?

692

Solo necesito una lista simple de archivos en conflicto .

¿Hay algo más simple que:

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

o:

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

Supongo que podría configurar un útil aliaspara eso, sin embargo, me preguntaba cómo lo hacen los profesionales. Lo usaría para escribir bucles de shell, por ejemplo, para resolver automáticamente conflictos, etc. ¿Tal vez reemplazar ese bucle enchufándolo mergetool.cmd?

inger
fuente
2
git rebase --continueenumerará los archivos con conflictos (si los hay)
jacob
el estado de git es suficiente
Amruth A
1
En una sesión de fusión en conflicto, `git merge --continue` mostrará los archivos de la lista con conflictos.
Jayan
git rebase --continueno enumeró los conflictos, solo me dijo que los arreglara (git versión 2.21.0)
Gary

Respuestas:

1211
git diff --name-only --diff-filter=U
CB Bailey
fuente
131
git config --global alias.conflicts "diff --name-only --diff-filter=U"
Creé
1
@CharlesBailey, ¿me estoy perdiendo algo? ¿Qué hay de malo con git status?
Pacerier
8
@Pacerier, es más desordenado. Si tuviera un millón de fusiones no conflictivas y una fusión conflictiva, querría algo sucinto para la salida.
xster
8
@sAguinaga: Simplemente corregit conflicts
Jimothy
1
Esto continúa mostrando el archivo incluso después de resolver el conflicto. git diff --checkFunciona mejor
user3812377
64

git diff --check

mostrará la lista de archivos que contienen marcadores de conflicto, incluidos los números de línea .

Por ejemplo:

> 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

fuente: https://ardalis.com/detect-git-conflict-markers

cnlevy
fuente
1
También me encontré git diff --checkcontándome sobre otros problemas (menos serios), como el espacio en blanco, por lo que git diff --check | grep -i conflictpodría ser el caso de OP
CCJ
37

Tratando de responder mi pregunta:

No, no parece haber una forma más simple que la de la pregunta, fuera de la caja.

Después de escribir eso muchas veces, solo pegué el más corto en un archivo ejecutable llamado 'git-conflictos', que se hizo accesible a git, ahora puedo simplemente: git conflictsobtener la lista que quería.

Actualización: como sugiere Richard, puede configurar un alias git, como alternativa al ejecutable

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

Una ventaja de usar el ejecutable sobre el alias es que puede compartir esa secuencia de comandos con los miembros del equipo (en una parte bin dir del repositorio).

inger
fuente
1
Sentí lo mismo en ese momento: pensar cómo demonios la gente no necesita esto y ver cuán trivial era solucionarlo. Sin embargo, he estado usando git durante 2 años y, sinceramente, no me he encontrado con esa "limitación" una vez más. Entonces, ¿tal vez eso no sea un caso de uso común después de todo?
Inger
44
Esto es lo suficientemente simple como para que pueda configurar un alias git config --global alias.conflicts "!git ls-files -u | cut -f 2 | sort -u"(el! Significa ejecutar este comando de shell, en lugar de solo un comando git).
Richard
1
Vale la pena mencionar que en realidad quieres 'comillas simples' en lugar de 'comillas dobles'. De lo contrario, !será interpretado por su shell:git config --global alias.conflicts '!git ls-files -u | cut -f 2 | sort -u'
umop
26

Aquí hay una manera infalible:

grep -H -r "<<<<<<< HEAD" /path/to/project/dir
Jones Agyemang
fuente
99
No. El índice de Git seguirá marcando internamente ciertos archivos como en conflicto, incluso después de que se eliminen los marcadores de texto en los archivos.
Alexander Bird
77
Junto con el comentario de Alexander, sigue siendo útil ver esto como una opción :) Por favor, no lo elimine.
WoodenKitty
3
O para ejecutar dentro del directorio de trabajo actual, use un punto para la ruta -grep -H -r "<<<<<<< HEAD" .
David Douglas
Jeje, esta es mi forma de hacerlo también. ¡Agregar un cresultado agradable también es la cuenta de conflictos! Una nota es que usaría indicadores, -Hrnesto también proporcionará información sobre el número de línea.
ShellFish
3
Si está utilizando expresiones regulares, sugeriría en [<=>]{7}lugar de esto. (Es posible que necesite una -Ebandera para que funcione en grep.) O, <{7}si no le preocupa colgar marcadores de fusión o si desea contar los conflictos. (También puede usar git grep, entonces no necesita la -rbandera.)
celticminstrel
22

git status muestra "ambos modificados" junto a los archivos que tienen conflictos en lugar de "modificado" o "nuevo archivo", etc.

Rafa
fuente
3
Es verdad. Sin embargo, esta pregunta en particular se refería a una lista simple de archivos en conflicto ... esto podría ser un problema XY (no recuerdo por qué realmente necesitaba esa lista de conflictos, pero el hecho de que no la haya necesitado desde entonces podría sugerir que debería han seguido un enfoque diferente en ese entonces no seguro ahora .. yo también estaba escribiendo guiones para autoresolving conflictos java-importación que necesitaban esta lista, es decir, el uso no interactivo) ....
Inger
Oh, no lo había entendido. Pensé que querías una lista "normal" para el uso "normal". Es por eso que enloquecí con tu propio código y tu respuesta propia ... luego me di cuenta de que la cosa "ambas modificadas" funcionó para mí (y supuse que solo querías lo mismo que yo, ¿por qué no deberías?) P) Gracias por el voto a favor :)
Rafa
17
git status --short | grep "^UU "
mda
fuente
44
Nota: es posible que deba buscar ^ UA y ^ UD también, por lo que el siguiente patrón es más completo: "^ U [UAD]"
mda
o solo ^U para que todo comience con U
Ascherer el
77
Esto no es suficiente. Los archivos en conflicto pueden tener las siguientes combinaciones:DD, AU, UD, UA, DU, AA, UU
Anthony Sottile
1
@AnthonySottile: ¿Puedes explicar los escenarios? Publiqué lo que funcionó para mi caso.
mda
@mda Un ejemplo: el conflicto donde se modificó el flujo ascendente, eliminé tendrá estadoDU
Anthony Sottile
13

Esto funciona para mi:

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

o

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

Eric Wang
fuente
2
Los conflictos pueden incluir archivos modificados o eliminados que esta solución no cubrirá.
Marzo
11

puede presionar git ls-files -uen su línea de comando, enumera archivos con conflictos

Emil Reña Enriquez
fuente
3

Si intenta comprometerse, y si hay conflictos, git le dará la lista de los conflictos no resueltos actualmente ... pero no como una lista simple. Esto suele ser lo que desea cuando trabaja de forma interactiva porque la lista se acorta a medida que soluciona los conflictos.

Tel
fuente
2
"interactivamente porque la lista se acorta a medida que se solucionan los conflictos". Interesante. Siempre he usado mergetool para ese propósito.
Inger
3

Tal vez esto se haya agregado a Git, pero los archivos que aún no se han resuelto se enumeran en el mensaje de estado (estado de git) como este:

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

Tenga en cuenta que esta es la sección de rutas no fusionadas.

Patrick O'Hara
fuente
1

Suponiendo que sabe dónde está su directorio raíz de git, $ {GIT_ROOT}, puede hacer,

 cat ${GIT_ROOT}/.git/MERGE_MSG | sed '1,/Conflicts/d'
Tzunghsing David Wong
fuente
0

Siempre he usado git status .

puede agregar awkal final para obtener solo los nombres de archivo

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

Ascherer
fuente
0

Mis 2 centavos aquí (incluso cuando hay muchas respuestas interesantes / de trabajo)

Creé este alias en mi .gitconfig

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

que me mostrará solo los nombres de los archivos con conflictos ... no toda su ruta :)

Manu
fuente
0

Esto es lo que uso para una lista de archivos modificados adecuados para la sustitución de línea de comandos en bash

git diff --numstat -b -w | grep ^[1-9] | cut -f 3

Para editar la lista use la $(cmd)sustitución.

vi $(git diff --numstat -b -w | grep ^[1-9] | cut -f 3)

No funciona si los nombres de los archivos tienen espacios. Traté de usar sedpara escapar o citar los espacios y la lista de resultados se veía bien, pero la $()sustitución todavía no se comportó como se deseaba.

Darrel Lee
fuente
0

El asistente de utilidad git https://github.com/makelinux/git-wizard cuenta por separado los cambios conflictivos no resueltos (colisiones) y los archivos no fusionados. Los conflictos deben resolverse manualmente o con mergetool. Los cambios no fusionados resueltos pueden agregarse y confirmarse generalmente con git rebase --continuar.

Costa
fuente
-1

ligera variación de la respuesta de Charles Bailey que brinda más información:

git diff --name-only --diff-filter=U | xargs git status
taj
fuente
-2

Como se resalta en otras respuestas, simplemente podemos usar el estado del comando git y luego buscar los archivos enumerados en Rutas no fusionadas:

sandesh
fuente