Quelle est la manière la plus simple de répertorier les fichiers en conflit dans Git?

692

J'ai juste besoin d'une liste simple de fichiers en conflit .

Y a-t-il quelque chose de plus simple que:

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

ou:

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

Je suppose que je pourrais mettre en place un outil pratique aliaspour cela, mais je me demandais comment les pros le faisaient. Je l'utiliserais pour écrire des boucles shell, par exemple pour résoudre automatiquement les conflits, etc. Peut-être remplacer cette boucle en se connectant mergetool.cmd?

en colère
la source
2
git rebase --continuelistera les fichiers avec conflits (s'il y en a)
jacob
le statut git suffit
Amruth A
1
Dans une session de fusion en conflit, «git merge --continue» affichera les fichiers de liste avec les conflits.
Jayan
git rebase --continuen'a pas répertorié les conflits, m'a juste dit de les corriger (git version 2.21.0)
Gary

Réponses:

1211
git diff --name-only --diff-filter=U
CB Bailey
la source
131
J'ai créé un alias pour cela:git config --global alias.conflicts "diff --name-only --diff-filter=U"
Jimothy
1
@CharlesBailey, est-ce que je manque quelque chose? Ce qui est mal avec git status?
Pacerier
8
@Pacerier, c'est juste plus salissant. Si vous aviez un million de fusions non conflictuelles et une fusion conflictuelle, vous voudriez quelque chose de succinct pour la sortie.
xster
8
@sAguinaga: exécutez simplementgit conflicts
Jimothy
1
Cela continue d'afficher le fichier même après la résolution du conflit. git diff --checkfonctionne mieux.
user3812377
64

git diff --check

affichera la liste des fichiers contenant des marqueurs de conflit, y compris les numéros de ligne .

Par exemple:

> 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

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

cnlevy
la source
1
J'ai aussi découvert git diff --checkd'autres problèmes (moins graves), comme les espaces vides, donc un git diff --check | grep -i conflictpourrait être en règle pour le cas d'OP
CCJ
37

Essayer de répondre à ma question:

Non, il ne semble pas y avoir de moyen plus simple que celui de la question, hors boîte.

Après avoir tapé cela trop souvent, je viens de coller le plus court dans un fichier exécutable nommé 'git-conflits', rendu accessible à git, maintenant je peux juste: git conflicts obtenir la liste que je voulais.

Mise à jour: comme Richard le suggère, vous pouvez configurer un alias git, comme alternative à l'exécutable

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

Un avantage de l'utilisation de l'exécutable sur l'alias est que vous pouvez partager ce script avec les membres de l'équipe (dans une partie bin dir du repo).

en colère
la source
1
J'ai ressenti la même chose à ce moment-là: penser à l'enfer que les gens n'en ont pas besoin et voir à quel point c'était trivial de contourner ce problème. Cependant, j'utilise git depuis 2 ans maintenant et honnêtement, je n'ai plus rencontré cette "limitation". Alors peut-être que ce n'est pas beaucoup de cas d'utilisation courants après tout?
inger
4
C'est assez simple pour que vous puissiez lui attribuer un alias git config --global alias.conflicts "!git ls-files -u | cut -f 2 | sort -u"(le! Signifie exécuter cette commande shell, plutôt qu'une simple commande git).
Richard
1
Il vaut la peine de mentionner que vous voulez réellement «guillemets simples» au lieu de «guillemets doubles». Sinon, le !sera interprété par votre shell:git config --global alias.conflicts '!git ls-files -u | cut -f 2 | sort -u'
umop
26

Voici une façon infaillible:

grep -H -r "<<<<<<< HEAD" /path/to/project/dir
Jones Agyemang
la source
9
Non. L'index de Git marquera toujours en interne certains fichiers comme étant en conflit même après la suppression des marqueurs textuels dans les fichiers.
Alexander Bird
7
Parallèlement au commentaire d'Alexandre, il est toujours utile de voir cela comme une option :) Veuillez ne pas supprimer.
WoodenKitty du
3
Ou pour exécuter dans le répertoire de travail actuel, utilisez un point pour le chemin -grep -H -r "<<<<<<< HEAD" .
David Douglas
Hehe, c'est ma façon de le faire aussi. Ajouter un crésultat sympa aussi le nombre de conflits! Une note est que j'utiliserais des drapeaux -Hrnqui fourniraient également des informations sur le numéro de ligne.
ShellFish
3
Si vous utilisez des expressions rationnelles, je suggérerais à la [<=>]{7}place de cela. (Il se peut que vous ayez besoin d'un -Eindicateur pour que cela fonctionne dans grep.) Ou, <{7}si vous n'êtes pas inquiet de balancer les marqueurs de fusion ou si vous voulez compter les conflits. (Vous pouvez également utiliser git grep- alors vous n'avez pas besoin du -rdrapeau.)
celticminstrel
22

git status affiche "les deux modifiés" à côté des fichiers qui ont des conflits au lieu de "modifié" ou "nouveau fichier", etc.

Rafa
la source
3
C'est vrai. Cependant, cette question particulière concernait une simple liste de fichiers en conflit .. cela pourrait être un problème XY (je ne me souviens pas pourquoi j'avais réellement besoin de cette liste de conflits, mais le fait que je n'en ai pas eu besoin depuis pourrait suggérer que je devrais ont suivi une approche différente à l' époque Je ne sais pas maintenant .. J'ai aussi été en train d' écrire des scripts pour autoresolving conflits d'importation java qui avait besoin de cette liste, à savoir l' utilisation non interactive) ....
Inger
Oh, je n'avais pas compris ça. Je pensais que vous vouliez une liste "normale" pour une utilisation "normale". C'est pourquoi j'ai paniqué avec votre propre code et votre réponse personnelle ... puis j'ai réalisé que le truc "les deux modifiés" fonctionnait pour moi (et j'ai supposé que vous vouliez juste la même chose que moi, pourquoi pas vous?; - P) Merci pour le vote positif :)
Rafa
17
git status --short | grep "^UU "
mda
la source
4
Remarque: Vous devrez peut-être également rechercher ^ UA et ^ UD, de sorte que le modèle suivant est plus complet: "^ U [UAD]"
mda
ou tout simplement ^Upour tout commencer avec U
Ascherer le
7
Ce n'est pas suffisant. Les fichiers en conflit peuvent avoir les combinaisons suivantes:DD, AU, UD, UA, DU, AA, UU
Anthony Sottile
1
@AnthonySottile: Pouvez-vous expliquer les scénarios? J'ai posté ce qui a fonctionné pour mon cas.
mda
@mda Un exemple: le conflit où en amont modifié, j'ai supprimé aura le statutDU
Anthony Sottile
13

Cela fonctionne pour moi:

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

ou

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

Eric Wang
la source
2
Les conflits peuvent inclure des fichiers modifiés ou supprimés que cette solution ne couvrira pas.
Mär
11

vous pouvez frapper git ls-files -usur votre ligne de commande, il répertorie les fichiers avec des conflits

Emil Reña Enriquez
la source
3

Si vous essayez de valider, et s'il y a des conflits, alors git vous donnera la liste des conflits actuellement non résolus ... mais pas comme une simple liste. C'est généralement ce que vous voulez lorsque vous travaillez de manière interactive, car la liste se raccourcit à mesure que vous résolvez les conflits.

Tél
la source
2
"interactivement parce que la liste se raccourcit à mesure que vous corrigez les conflits." Intéressant. J'ai toujours utilisé mergetool à cette fin.
inger
3

Peut-être que cela a été ajouté à Git, mais les fichiers qui n'ont pas encore été résolus sont répertoriés dans le message d'état (état git) comme ceci:

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

Notez qu'il s'agit de la section Chemins non fusionnés.

Patrick O'Hara
la source
1

En supposant que vous savez où se trouve votre répertoire racine git, $ {GIT_ROOT}, vous pouvez le faire,

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

Je l'ai toujours utilisé git status.

peut ajouter awkà la fin pour obtenir uniquement les noms de fichiers

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

Ascherer
la source
0

Mes 2 cents ici (même quand il y a beaucoup de réponses sympas / fonctionnelles)

J'ai créé cet alias dans mon .gitconfig

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

qui va me montrer juste les noms des fichiers avec conflits ... pas tout leur chemin :)

Manu
la source
0

Voici ce que j'utilise pour répertorier les fichiers modifiés adaptés à la substitution de ligne de commande dans bash

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

Pour modifier la liste, utilisez la $(cmd)substitution.

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

Ne fonctionne pas si les noms de fichiers ont des espaces. J'ai essayé d'utiliser sedpour échapper ou citer les espaces et la liste de sortie semblait correcte, mais la $()substitution ne se comportait toujours pas comme souhaité.

Darrel Lee
la source
0

L'assistant git utilitaire https://github.com/makelinux/git-wizard compte séparément les modifications conflictuelles non résolues (collisions) et les fichiers non fusionnés. Les conflits doivent être résolus manuellement ou avec mergetool. Les modifications non fusionnées résolues peuvent être ajoutées et validées généralement avec git rebase --continue.

Costa
la source
-1

légère variation de la réponse de Charles Bailey qui donne plus d'informations:

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

Comme souligné dans d'autres réponses, nous pouvons simplement utiliser l'état de la commande git , puis rechercher les fichiers répertoriés sous Chemins non fusionnés:

sandesh
la source