Obter todos os arquivos que foram modificados no ramo git

209

Existe uma maneira de ver quais arquivos foram alterados em uma ramificação?

Raif
fonte
2
Eles não são meus funcionários, são meus colegas e não são eles em particular, mas as pessoas em geral. Mas sim, relendo este post, parece um pouco agro. :)
Raif
3
Você pode usar o github ou bitbucket, gitlab? Existem ferramentas para gerenciar exatamente essa situação. O desenvolvedor faz uma solicitação de recebimento. Você recebe a solicitação e terá acesso a uma interface muito boa que mostra uma diferença de todas as alterações feitas em cada arquivo. Você pode até comentar, solicitar alterações, etc. Quando as alterações forem boas, você poderá aceitar a solicitação que mesclará as alterações na ramificação solicitada (normalmente desenvolvida). Essa é a melhor maneira de lidar com essa situação.
Scott Wright

Respostas:

168

Uma alternativa à resposta de @Marco Ponti e evitando o checkout:

git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)

Se seu shell em particular não entender a construção $ (), use back-ticks.

Twalberg
fonte
1
ah! isso é bem divertido, agora que tal se eu quiser dizer <notMainDev> como o ramo atual em que estou? isso não é preciso especificá-lo?
Raif
29
git diff --name-only <some-other-branch>mostrará quais arquivos são diferentes entre sua ramificação atual e <some-other-branch>. Portanto, é essencialmente o mesmo comando, mas nota que você pode usar isso para encontrar os arquivos que são diferentes entre quaisquer dois ramos, mesmo se eles não estão remotamente relacionados. Se essa comparação é útil ou não, depende da topologia de suas ramificações ... Além disso, observe que <some-other-branch>realmente pode haver algum commit, ou qualquer coisa que resolva um (tags, etc.).
Twalberg 17/05
hmmm, bem, acho que o que quero dizer é que eu gostaria de fazer o git diff --name-only <notMainDev> $ (git merge-base <notMainDev> <MY_CURRENT_CO_BRANCH>) onde MY_CURRENT_CO_BRANCH seria, naturalmente, minha ramificação atual
Raif
Você pode fazer isso também. Isso encontrará o ponto em que, <notMainDev>e <MY_CURRENT_CO_BRANCH>mais recentemente, teve um ancestral comum e será comparado <notMainDev>a esse ancestral. Você precisará fornecer seu nome de filial atual, como git merge-baseespera dois argumentos - não há um atalho, pelo menos na versão atual.
Twalberg 17/05
1
Está bem! Deixa comigo. Cortesia do meu colega como é o nome dele. git merge-base <notMainDev> git branch | grep '\*' | awk '{print $2}' que obterá o commit da ramificação entre <notMainDev> e minha ramificação atual. Eu posso então fazer git diff --name-only <notMainDev> $ (git merge-base <notMainDev> git branch | grep '\*' | awk '{print $2}')
Raif
147

Tudo o que você precisa fazer é o seguinte:

git checkout <notMainDev>
git diff --name-only <mainDev>

Isso mostrará apenas os nomes de arquivos diferentes entre os dois ramos.

Marco Ponti
fonte
uau rápido e também o ponto. obrigado. btw eu amo git. é sempre rápido e
direto
23
Acredito que isso também mostrará coisas que mudaram <mainDev>desde que os ramos divergiram. Em git diff --name-only <sha-of-branch-point>vez disso, você pode usar ou ver a resposta alternativa que eu postei que evita o checkout.
Twalberg 17/05
Sim, isso é verdade @twalberg, mostraria essas alterações se os ramos fossem divergentes. Eu estava assumindo que o notMainDevseria mantido atualizado com os commits mainDev ... Eu geralmente acho útil ver essas diferenças também.
Marco Ponti
você não pode simplesmente especificar - right-only para mostrar apenas os arquivos que foram alterados no lado direito?
TheZenker
você obtém o <sha-of-branch-point>comgit rev-parse <branch-name>
fc9.30 01/02/19
69

espantado, isso não foi dito até agora!

git diff master...branch

Portanto, veja as alterações apenas em branch

Para verificar a filial atual, use

git diff master...

Graças a jqr

Esta é uma mão curta para

git diff $(git merge-base master branch) branch

portanto, a base de mesclagem (a confirmação comum mais recente entre as ramificações) e a dica da ramificação

Também usar origem / mestre em vez de apenas mestre ajudará caso seu mestre local seja datado

exussum
fonte
4
Enquanto isso mostra o que mudou, ele mostra a todas as mudanças, ao invés de um resumo dos arquivos alterados ... que é o que me levam a esta página em primeiro lugar :)
Chris Rutledge
1
adicione o sinalizador --name-only a isso. ou --short-stat
exussum
2
git diff --name-only master..se você quiser apenas os nomes dos arquivos diferentes entre os dois ramos.
7309 Adam
1
Isso não funcionará corretamente se o seu mestre tiver confirmado depois que você criou seu ramo secundário.
simplylizz
2
@simplylizz sim, sim. isso é exatamente o que este está resolvendo
exussum
45

Não acredito que existem muitas maneiras de fazer isso. Eu uso o que mudou como alguém postado antes, apenas com os seguintes argumentos:

git whatchanged --name-only --pretty="" origin..HEAD

Isso apenas lista os nomes de arquivos e apenas os que foram alterados na ramificação atual.

lukiller
fonte
3
Essa parece ser a resposta mais fácil aqui, pois não requer informações adicionais. A saída parece correta e é muito mais fácil lembrar do que a resposta aceita!
RickMeasham
1
Obrigado, isso é interessante, mais prolixo. Ele fornece saída para cada confirmação, na ordem inversa. git-whatchanged - Mostrar registra com diferença cada commit introduz git-scm.com/docs/git-whatchanged
nealmcb
A partir de documentos do git :New users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
Derek S
21

Eu realmente gostei da resposta de @ twalberg, mas não queria digitar o nome do ramo atual o tempo todo. Então, eu estou usando isso:

git diff --name-only $(git merge-base master HEAD)
Yep_It's_Me
fonte
1
Sua solução funciona para mim e eu recebo a lista de arquivos que espero ver. Sou iniciante no Git e já usei git diff master... --name-onlyquando executado no ramo de destino e obtive o mesmo resultado. Você poderia ter a gentileza de fornecer algum feedback sobre o que é bom ou ruim entre sua resposta e o comando que forneci?
Hungerstar 12/12
Seu comando funcionará exatamente da mesma forma, se o mestre não tiver nenhum novo commit desde que sua ramificação foi criada. Eu acho que meu comando será equivalente a git diff master.. --name-only(note que existem apenas 2 pontos em vez de 3). Para entender o que os pontos significam, consulte esta resposta
Yep_It's_Me
Impressionante! Obrigado pela resposta rápida e insight. Muito apreciado.
Hungerstar 13/12/19
12

git whatchanged parece ser uma boa alternativa.

chalasr
fonte
1
O que era exatamente o que eu estava procurando.
Sild
A partir de documentos do git :New users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
Derek S
9
git diff --name-only master...branch-name

com o qual queremos comparar.

Rajesh Dusa
fonte
Parece um parcial de uma resposta existente, stackoverflow.com/a/41486181/11912
James Skemp
Essa variação compara o HEAD do mestre a um ramo atual. A resposta aceita compara o estado do mestre no ponto que você bifurcou . Pode ter a resposta que você está procurando, dependendo do que você deseja saber.
Mark Stosberg
8

E se pudesse ser tão fácil assim?

git changed

Se você deseja assumir que o ramo principal é chamado de "mestre" e que você cria seus outros ramos a partir do mestre, você pode adicionar esse alias ao seu ~/.gitconfigarquivo para facilitar:

cbranch = !"git branch | grep '*' | cut -f2 -d' '"
changed = !"git diff --name-only $(git cbranch) $(git merge-base $(git cbranch) master)"

Essas suposições funcionarão para a maioria das pessoas na maioria das situações, mas você deve estar ciente de que as está fazendo.

Além disso, você deve usar um shell que suporte $(). É muito provável que seu shell suporte isso .

iconoclasta
fonte
3
git show --stat origin/branch_name

Isso fornecerá uma lista dos arquivos que foram adicionados ou modificados nesta ramificação.

Badari
fonte
2
Isso está errado, isso mostra apenas os arquivos alterados na confirmação principal desse ramo, não no ramo inteiro.
Davidtbernal
2

Por alguma razão, ninguém mencionou git-tree. Consulte https://stackoverflow.com/a/424142/1657819

git-treeé preferido porque é um comando de encanamento ; deve ser programático (e, presumivelmente, mais rápido)

(assumindo que o ramo base seja master)

git diff-tree --no-commit-id --name-only -r master..branch-name

No entanto, isso mostrará todos os arquivos que foram afetados na ramificação. Se você quiser ver apenas arquivos modificados explicitamente , poderá usar --diff-filter:

git diff-tree --no-commit-id --name-only -r master..branch-name --diff-filter=M

Também é possível usar, em --name-statusvez de, --name-onlypara ver o status dos arquivos ( A/ M/ De assim por diante)

O padrinho
fonte
Era exatamente isso que eu precisava para aprender arquivos alterados, excluindo os que foram excluídos. rubocop --fail-level error $(git diff-tree --no-commit-id --name-only -r origin/master..HEAD --diff-filter=M)
HarlemSquirrel
1

A resposta aceita - git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)- é muito próxima, mas notei que o status estava errado para exclusões. Adicionei um arquivo em uma ramificação e, no entanto, este comando (usando --name-status) deu ao arquivo que excluí o status "A" e ao arquivo que adicionei o status "D".

Eu tive que usar este comando:

git diff --name-only $(git merge-base <notMainDev> <mainDev>)
Connor Clark
fonte
0

Expandindo o que @twalberg e @iconoclast tinham, se você estiver usando o cmd por qualquer motivo, poderá usar:

FOR /F "usebackq" %x IN (`"git branch | grep '*' | cut -f2 -d' '"`) DO FOR /F "usebackq" %y IN (`"git merge-base %x master"`) DO git diff --name-only %x %y
Lunyx
fonte
0

O seguinte arquivo em lotes é baseado na resposta do twalberg, mas funcionará no Windows:

@ECHO OFF
C:                               :: <== OR USE A DIFFERENT DRIVE
CD \path\to\where\git\files\are  :: <== CHANGE TO THE ACTUAL PATH
SET /p b="Enter full path of an ALREADY MERGED branch to compare with origin/master: "
bash --login -i -c "git diff --name-only %b% $(git merge-base %b1% origin/drop2/master)"
PAUSE

O item acima pressupõe que o ramo principal seja origem / mestre e que o git bash foi incluído quando o Git foi instalado (e sua localização é no ambiente do caminho). Na verdade, eu precisava mostrar as diferenças reais usando uma ferramenta diff configurada (kdiff3) para substituir o seguinte comando bash acima:

bash --login -i -c "git difftool --dir-diff %b% $(git merge-base %b1% origin/drop2/master)"
Steve Chambers
fonte
0

Eu uso grep, então só recebo as linhas com diff --git, que é o caminho dos arquivos:

git diff branchA branchB | grep 'diff --git'
// OUTPUTS ALL FILES WITH CHANGES, SIMPLE HA :)
diff --git a/package-lock.json b/package-lock.json
T04435
fonte