Qual é a maneira mais simples de listar arquivos conflitantes no Git?


693

Eu só preciso de uma lista simples de arquivos em conflito .

Existe algo mais simples que:

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

ou:

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

Eu acho que eu poderia criar um aliasjeito prático para isso, no entanto, queria saber como os profissionais fazem isso. Eu o usaria para escrever loops de shell, por exemplo, para resolver automaticamente conflitos, etc. Talvez substitua esse loop conectando-o mergetool.cmd?


2
git rebase --continueirá listar os arquivos com conflitos (se houver algum)
jacob

git status é suficiente
Amruth A

1
Na sessão de mesclagem em conflito, o git merge --continue` mostrará os arquivos da lista com conflitos.
Jayan

git rebase --continuenão lista os conflitos, só me disse para corrigi-los (git versão 2.21.0)
Gary

Respostas:


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

131
Eu criei um alias para isso:git config --global alias.conflicts "diff --name-only --diff-filter=U"
Jimothy

1
@CharlesBailey, estou faltando alguma coisa? O que há de errado com git status?
Pacerier

8
@ Pacerier, é apenas mais confuso. Se você tivesse um milhão de fusões não conflitantes e uma fusão conflitante, desejaria algo sucinto para a saída.
xster 7/01/16

8
@sAguinaga: Simplesmente executegit conflicts
Jimothy

1
Isso continua a mostrar o arquivo mesmo depois de resolver o conflito. git diff --checkfunciona melhor.
user3812377

64

git diff --check

mostrará a lista de arquivos contendo marcadores de conflito, incluindo números de linha .

Por exemplo:

> 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
Eu encontrei git diff --checkme contando sobre outros problemas (menos graves) também, como espaços em branco, assim que um git diff --check | grep -i conflictpoderia estar em ordem para o caso do OP
CCJ

37

Tentando responder minha pergunta:

Não, não parece haver nenhuma maneira mais simples do que a da questão, pronta para uso.

Depois de digitar isso muitas vezes, colei o menor em um arquivo executável chamado 'git-conflitos', tornado acessível ao git, agora posso: git conflictsobter a lista que eu queria.

Atualização: como Richard sugere, você pode configurar um alias do git, como alternativa ao executável

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

Uma vantagem de usar o executável sobre o alias é que você pode compartilhar esse script com os membros da equipe (em uma parte bin dir do repo).


1
Senti o mesmo naquele momento - pensando em como diabos as pessoas não precisam disso e vendo como era trivial contornar isso. No entanto, eu uso o git há 2 anos e honestamente não encontrei essa "limitação" mais uma vez. Então talvez isso não seja um caso de uso comum, afinal?
Inker 19/10

4
Isso é simples o suficiente para você configurar um alias para ele git config --global alias.conflicts "!git ls-files -u | cut -f 2 | sort -u"(o! Significa executar este comando shell, em vez de apenas um comando git).
Richard

1
Vale ressaltar que você realmente deseja "aspas simples" em vez de "aspas duplas". Caso contrário, o !será interpretado pelo seu shell:git config --global alias.conflicts '!git ls-files -u | cut -f 2 | sort -u'
umop

26

Aqui está uma maneira infalível:

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

9
Não. O índice do Git ainda marcará internamente certos arquivos como estando em conflito, mesmo após a remoção dos marcadores de texto nos arquivos.
Alexander Ave

7
Além do comentário de Alexander, ainda é útil ver isso como uma opção :) Por favor, não exclua.
WoodenKitty

3
Ou para executar dentro de trabalho atual dir usar um ponto de caminho -grep -H -r "<<<<<<< HEAD" .
David Douglas

Hehe, esta é a minha maneira de fazer isso também. Adicionando um cbom resultado também a contagem de conflitos! Uma observação é que eu usaria sinalizadores, -Hrnisso também fornecerá informações sobre o número da linha.
Moluscos

3
Se você estiver usando regex, sugiro em [<=>]{7}vez disso. (Pode ser necessário -Esinalizar para que isso funcione no grep.) Ou, <{7}se você não estiver preocupado com os marcadores de mesclagem pendentes ou se quiser contar os conflitos. (Você também pode usar git grep- então você não precisa da -rbandeira.)
celticminstrel

22

git status exibe "ambos modificados" ao lado de arquivos que apresentam conflitos em vez de "modificados" ou "novo arquivo" etc.


3
Isso é verdade. No entanto, essa pergunta em particular dizia respeito a uma lista simples de arquivos em conflito. Esse pode ser um problema XY (não me lembro por que eu realmente precisava dessa lista de conflitos, mas o fato de não precisar disso desde então pode sugerir que eu deveria seguiu uma abordagem diferente naquela época não tenho certeza agora .. Eu também estava escrevendo roteiros para autoresolving conflitos java-importação que necessário esta lista, ou seja, uso não-interativo) ....
inger

Oh, eu não tinha entendido isso. Eu pensei que você queria uma lista "normal" para uso "normal". É por isso que eu surtei com seu próprio código e sua resposta pessoal ... então percebi que a coisa "ambos modificados" funcionava para mim (e eu assumi que você queria o mesmo que eu, por que não deveria?; - P) Obrigado pela upvote embora :)
Rafa

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

4
Nota: Pode ser necessário procurar ^ UA e ^ UD também, portanto, o seguinte padrão é mais completo: "^ U [UAD]"
mda

ou apenas ^Upara começar tudo com U
Ascherer

7
Isso não é suficiente. Arquivos conflitantes pode ter as seguintes combinações:DD, AU, UD, UA, DU, AA, UU
Anthony Sottile

1
@AnthonySottile: Você pode explicar os cenários? Publiquei o que funcionou para o meu caso.
Mda #

@mda Um exemplo: Conflito onde a montante modificada, eu deletei terá estadoDU
Anthony Sottile

13

Isso funciona para mim:

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

ou

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


2
Os conflitos podem incluir arquivos modificados x excluídos, que esta solução não cobrirá.
Mar


3

Se você tentar confirmar, e se houver conflitos, o git fornecerá a lista dos conflitos não resolvidos no momento ... mas não como uma lista simples. Isso geralmente é o que você deseja ao trabalhar interativamente, porque a lista fica mais curta à medida que você corrige os conflitos.


2
"interativamente porque a lista fica mais curta à medida que você corrige os conflitos." Interessante. Eu sempre usei o mergetool para esse fim.
Inker 25/10

3

Talvez isso tenha sido adicionado ao Git, mas os arquivos que ainda precisam ser resolvidos estão listados na mensagem de status (status do git) assim:

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

Observe que esta é a seção Caminhos não imersos.


1

Supondo que você saiba onde está seu diretório raiz do git, $ {GIT_ROOT}, você pode fazer,

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

0

Eu sempre usei git status.

pode adicionar awkno final para obter apenas os nomes dos arquivos

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


0

Meus 2 centavos aqui (mesmo quando há muitas respostas legais / úteis)

Eu criei esse alias no meu .gitconfig

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

que vai me mostrar apenas os nomes dos arquivos com conflitos ... não todo o caminho :)


0

Aqui está o que eu uso em uma lista de arquivos modificados adequados para substituição de linha de comando no bash

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

Para editar a lista, use $(cmd)substituição.

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

Não funciona se os nomes dos arquivos tiverem espaços. Tentei usar sedpara escapar ou citar os espaços e a lista de saída parecia correta, mas a $()substituição ainda não se comportou como desejado.


0

O utilitário git wizard https://github.com/makelinux/git-wizard conta separadamente as alterações conflitantes não resolvidas (colisões) e os arquivos não imersos. Os conflitos devem ser resolvidos manualmente ou com a fusão. Alterações não-resolvidas resolvidas podem ser adicionadas e confirmadas normalmente com o git rebase --continue.


-1

ligeira variação da resposta de Charles Bailey que fornece mais informações:

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

-2

Conforme destacado em outras respostas, podemos simplesmente usar o comando git status e procurar os arquivos listados em Caminhos não imersos:

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.