Qual è il modo più semplice per elencare i file in conflitto in Git?


692

Ho solo bisogno di un semplice elenco di file in conflitto .

C'è qualcosa di più semplice di:

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

o:

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

Immagino di poterlo impostare a portata aliasdi mano , ma mi chiedevo come lo facciano i professionisti. Lo userei per scrivere loop di shell, ad esempio per risolvere automaticamente i conflitti, ecc. Forse sostituiresti quel loop collegandoti mergetool.cmd?


2
git rebase --continueelencherà i file con conflitti (se ce ne sono)
jacob

lo stato git è sufficiente
Amruth A

1
In una sessione di unione in conflitto` git merge --continue` mostrerà i file della lista con conflitti.
Jayan,

git rebase --continuenon ha elencato i conflitti, mi ha appena detto di risolverli (versione git 2.21.0)
Gary

Risposte:


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

131
Ho creato un alias per questo:git config --global alias.conflicts "diff --name-only --diff-filter=U"
Jimothy,

1
@CharlesBailey, mi sto perdendo qualcosa? Cosa c'è di sbagliato con git status?
Pacerier,

8
@Pacerier, è solo più disordinato. Se avessi un milione di fusioni non conflittuali e una fusione conflittuale, vorresti qualcosa di succinto per l'output.
xster,

8
@sAguinaga: corri semplicementegit conflicts
Jimothy,

1
Questo continua a mostrare il file anche dopo aver risolto il conflitto. git diff --checkfunziona meglio.
user3812377

64

git diff --check

mostrerà l'elenco dei file contenenti marcatori di conflitto, inclusi i numeri di riga .

Per esempio:

> 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

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


1
Ho scoperto di git diff --checkparlarmi anche di altri problemi (meno gravi), come lo spazio bianco finale, quindi git diff --check | grep -i conflictpotrebbe essere in ordine per il caso di OP
CCJ

37

Cercando di rispondere alla mia domanda:

No, non sembra esserci un modo più semplice di quello nella domanda, fuori dalla scatola.

Dopo averlo digitato in troppe volte, ho appena incollato quello più corto in un file eseguibile chiamato 'git-conflitti', reso accessibile a git, ora posso solo: git conflictsottenere l'elenco che volevo.

Aggiornamento: come suggerisce Richard, è possibile impostare un alias git, in alternativa all'eseguibile

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

Un vantaggio dell'utilizzo dell'eseguibile rispetto all'alias è che puoi condividere quello script con i membri del team (in una parte bin repo del repository).


1
Mi sono sentito lo stesso a quel punto - pensando a come diavolo la gente non ne avesse bisogno e vedendo quanto fosse banale risolvere il problema. Tuttavia, uso git da 2 anni e onestamente non ho incontrato ancora una volta questa "limitazione". Quindi forse non è molto il caso d'uso comune dopo tutto?
inger

4
Questo è abbastanza semplice da poter impostare un alias per questo git config --global alias.conflicts "!git ls-files -u | cut -f 2 | sort -u"(il! Significa eseguire questo comando shell, piuttosto che solo un comando git).
Richard,

1
Vale la pena ricordare che in realtà vuoi "virgolette singole" anziché "virgolette doppie". Altrimenti, la !volontà verrà interpretata dalla shell:git config --global alias.conflicts '!git ls-files -u | cut -f 2 | sort -u'
umop,

26

Ecco un modo infallibile:

grep -H -r "<<<<<<< HEAD" /path/to/project/dir

9
No. L'indice di Git contrassegnerà ancora internamente alcuni file come in conflitto anche dopo la rimozione degli indicatori testuali nei file.
Alexander Bird,

7
Accanto al commento di Alexander, è comunque utile vederlo come un'opzione :) Per favore, non cancellare.
WoodenKitty,

3
O per correre all'interno dell'attuale directory di lavoro usa un punto per percorso -grep -H -r "<<<<<<< HEAD" .
David Douglas

Hehe, questo è anche il mio modo di farlo. L'aggiunta di un crisultato piacevolmente anche il conteggio dei conflitti! Una nota è che userei flag che -Hrnforniranno anche informazioni sul numero di riga.
ShellFish,

3
Se stai usando regex, suggerirei [<=>]{7}invece di questo. (Potrebbe essere necessario un -Eflag per farlo funzionare in grep.) Oppure, <{7}se non sei preoccupato di appendere i marker di fusione o vuoi contare i conflitti. (Puoi anche usare git grep- quindi non hai bisogno della -rbandiera.)
celticminstrel il

22

git status visualizza "entrambi modificati" accanto ai file che presentano conflitti anziché "modificato" o "nuovo file", ecc


3
È vero. Tuttavia, questa particolare domanda riguardava un semplice elenco di file in conflitto .. questo potrebbe essere un problema XY (non ricordo perché avevo effettivamente bisogno di quell'elenco dei conflitti, ma il fatto che non ne avessi avuto bisogno dal momento che potrebbe suggerire che dovrei ho seguito un approccio diverso allora. Non sono sicuro ora .. Stavo anche scrivendo script per la risoluzione automatica dei conflitti di importazione java che necessitavano di questo elenco, vale a dire. uso non interattivo) ..
inger

Oh, non l'avevo capito. Pensavo volessi un elenco "normale" per un uso "normale". È per questo che ho dato di matto con il tuo codice e la tua auto-risposta ... poi ho capito che la cosa "sia modificata" ha funzionato per me (e ho pensato che tu volessi lo stesso di me, perché non dovresti?; - P) Grazie per il voto :)
Rafa,

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

4
Nota: potrebbe essere necessario cercare anche ^ UA e ^ UD, quindi il seguente modello è più completo: "^ U [UAD]"
mda

o semplicemente ^Uper iniziare tutto con U
Ascherer il

7
Questo non è sufficiente. I file in conflitto possono avere le seguenti combinazioni:DD, AU, UD, UA, DU, AA, UU
Anthony Sottile

1
@AnthonySottile: puoi spiegare gli scenari? Ho pubblicato ciò che ha funzionato per il mio caso.
mda

@mda Un esempio: il conflitto in cui l'upstream è stato modificato, ho eliminato avrà lo statoDU
Anthony Sottile,

13

Questo funziona per me:

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

o

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


2
I conflitti possono includere file modificati o eliminati che questa soluzione non copre.
Mart


3

Se si tenta di eseguire il commit e in presenza di conflitti, git fornisce l'elenco dei conflitti attualmente non risolti ... ma non come un semplice elenco. Questo è di solito ciò che si desidera quando si lavora in modo interattivo perché l'elenco si riduce quando si risolvono i conflitti.


2
"in modo interattivo perché l'elenco diventa più breve mentre si risolvono i conflitti." Interessante. Ho sempre usato il mergetool per quello scopo.
inger

3

Forse questo è stato aggiunto a Git, ma i file che devono ancora essere risolti sono elencati nel messaggio di stato (stato git) in questo modo:

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

Si noti che questa è la sezione Percorsi non uniti.


1

Supponendo che tu sappia dove si trova la tua directory radice git, $ {GIT_ROOT}, puoi fare,

 cat ${GIT_ROOT}/.git/MERGE_MSG | sed '1,/Conflicts/d'

0

L'ho sempre usato git status .

può aggiungere awkalla fine per ottenere solo i nomi dei file

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


0

I miei 2 centesimi qui (anche quando ci sono molte risposte interessanti / funzionanti)

Ho creato questo alias nel mio .gitconfig

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

che mi mostrerà solo i nomi dei file con conflitti ... non il loro intero percorso :)


0

Ecco cosa uso un elenco di file modificati adatti per la sostituzione della riga di comando in bash

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

Per modificare l'elenco utilizzare la $(cmd)sostituzione.

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

Non funziona se i nomi dei file hanno spazi. Ho provato a usare sedper sfuggire o citare gli spazi e l'elenco di output sembrava corretto, ma la $()sostituzione non si è ancora comportata come desiderato.


0

Il programma di utilità git wizard https://github.com/makelinux/git-wizard conteggia separatamente i conflitti non risolti (collisioni) e i file non uniti. I conflitti devono essere risolti manualmente o con mergetool. Le modifiche non risolte risolte possono essere aggiunte e impegnate di solito con git rebase --continua.


-1

leggera variazione della risposta di Charles Bailey che fornisce maggiori informazioni:

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

-2

Come evidenziato in altre risposte, possiamo semplicemente usare lo stato del comando git e quindi cercare i file elencati in Percorsi non uniti:

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.