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?


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

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


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).


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

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.


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 "

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


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


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.


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.


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'

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}'


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 :)


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é.


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.


-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

-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:

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.