Mostrando quais arquivos foram alterados entre duas revisões

2105

Desejo mesclar dois ramos que foram separados por um tempo e queria saber quais arquivos foram modificados.

Encontrei este link: http://linux.yyz.us/git-howto.html, que foi bastante útil.

As ferramentas para comparar as ramificações que encontrei são:

  • git diff master..branch
  • git log master..branch
  • git shortlog master..branch

Estava pensando se há algo como "git status master..branch" para ver apenas os arquivos que são diferentes entre os dois ramos.

Sem criar uma nova ferramenta, acho que é o mais próximo que você pode fazer isso agora (o que obviamente mostrará repetições se um arquivo for modificado mais de uma vez):

  • git diff master..branch | grep "^diff"

Gostaria de saber se há algo que eu perdi ...

johannix
fonte
12
Quantos outros acham o título desta pergunta enganoso? Na verdade, trata-se de encontrar as diferenças de arquivo entre dois ramos. O que eu vim aqui procurando foi como ver diferenças de arquivo entre duas revisões no mesmo ramo. Ou eu sou o único?
Sandeepan Nath
4
@ SandeepanNath: com o git não há diferença. Você está SEMPRE se referindo a confirmações individuais.
Samuel O'Malley
@ SamuelO'Malley Eu sou novo no git e considerando a estratégia de ramificação aparentemente comum em que todos os ramos são finalmente mesclados ao ramo mestre e, finalmente, o mestre é implementado. Agora, considerando o evento de uma implantação, em que a produção já está no mestre, mas atrás da dica (por uma revisão se a última implementação ocorreu após a última mesclagem mestre), gostaria de ver as diferenças entre essas duas revisões, para descubra o que seria lançado. Eu não gostaria de olhar para o ramo que foi mesclado pela última vez. Corrija-me se eu estiver enganado.
Sandeepan Nath
2
@SandeepanNath: em vez de usar os nomes das filiais, você pode seguir as respostas abaixo e apenas especificar os IDs de confirmação. Ou até mesmo consulte os commits pelos nomes das tags, se você criar tags ao lançar.
Samuel O'Malley
1
@SandeepanNath Você não pode comparar duas filiais; você deve especificar a revisão. Portanto, comparar duas filiais está comparando duas revisões.
Bastien Vandamme

Respostas:

2575

Para comparar a ramificação atual com a masterramificação:

$ git diff --name-status master

Para comparar dois ramos:

$ git diff --name-status firstbranch..yourBranchName

Leia git diffa documentação oficial .

JasonSmith
fonte
2
O que significam cada um dos índices do lado esquerdo (eu vejo muitos M's e D's)?
Gogogadgetinternet
15
@ user446936 - você pode ver o que as letras significam na página de manual do status do git @ kernel.org/pub/software/scm/git/docs/git-status.html - em particular, M == modificado, D == excluído
James Manning
12
git diff --name-status your_branch...mastersaídas as mudanças que ocorreram no master desde your_branch foi criado a partir dele
Radu
1
O operador de ponto duplo é supérfluo, aqui, porque diffs são pares.
Jb0bs # 7/15
2
Recebo revisão ou caminho desconhecido na árvore de trabalho.
SuperUberDuper
408

Tentar

$ git diff --stat --color master..branchName

Isso fornecerá mais informações sobre cada alteração, enquanto você ainda usa o mesmo número de linhas.

Você também pode inverter os galhos para obter uma imagem ainda mais clara da diferença se quiser mesclar o outro caminho:

$ git diff --stat --color branchName..master
Gerry
fonte
77
Se você tiver (altamente recomendado, imho) a cor git ativada ( config --global color.ui true), poderá pular a --color. (Eu tenho lks - síndrome teclado preguiçoso.)
Art SWRI
25
Estou com você na cor! Aliás, eu quis dizer git config --global color.ui true- estar completo.
Art SWRI
2
Não funciona, gera erros:fatal: ambiguous argument 'master..branchName': unknown revision or path not in the working tree.
Tomáš Zato - Restabelece Monica 18/01
7
@ TomášZato desculpe, mas você precisa trocar "branchName" pelo nome da sua filial.
Gerry
161

Lembre-se também de que o git tem ramificações baratas e fáceis. Se eu acho que uma mesclagem pode ser problemática, crio um ramo para a mesclagem. Portanto, se mastertiver as alterações que desejo mesclar e bafor minha ramificação que precisa do código do mestre, devo fazer o seguinte:

git checkout ba
git checkout -b ba-merge
git merge master
.... review new code and fix conflicts....
git commit
git checkout ba
git merge ba-merge
git branch -d ba-merge
git merge master

O resultado final é que eu tenho que experimentar a mesclagem em um galho descartável antes de ferrar com o meu galho. Se eu me enrolar, posso excluir o ba-mergeramo e começar de novo.

Eric Anderson
fonte
4
Impressionante. Eu nunca pensei em ramificar dessa maneira. Eu acho que isso deve ser considerado como parte das "melhores práticas" ao mesclar.
egelev
Quando você une a ba-marge de volta à ba, não há um potencial para corrigir os conflitos novamente?
Josef.B
2
@EricAnderson Certo, é um gráfico. O SVN gruda como chiclete embaixo de uma mesa da escola. valeu.
Josef.B
1
Por que você precisa
executar o
Você poderia deixar de fora. A única razão pela qual isso seria útil é se novas coisas chegarem masterenquanto você estiver trabalhando na revisão do código e na correção de conflitos.
Eric Anderson
58

Se alguém estiver tentando gerar um arquivo diff a partir de dois ramos:

git diff master..otherbranch > myDiffFile.diff
Paulino III
fonte
2
Isso foi útil especialmente com galhos grandes que contêm muitas diferenças.
vandsh
Isso é útil quando a diferença é realmente grande. Por padrão, ele não mostraria todas as diferenças no console (eu estava me perguntando por que). Passar a diferença para um arquivo é o caminho a seguir nesse caso.
rotimi-best
42

Há também um método baseado em GUI.

Você pode usar o gitk .

  1. Corre:

    $ gitk --all
    
  2. Clique com o botão direito do mouse em uma confirmação de uma ramificação e selecione Marcar esta confirmação no menu pop-up.

  3. Clique com o botão direito do mouse em um commit de outro ramo e selecione Dif - isto -> marcado commit ou Dif - marcado commit -> this .

Em seguida, haverá uma lista de arquivos alterados no painel inferior direito e detalhes de diferenças no painel inferior esquerdo.

Yantao Xie
fonte
3
@ Orwellophile Carrego um vídeo para mostrar como fazê-lo. Espero que ajude você.
Yantao Xie
Uau, só para mim, me sinto especial. Eu o marquei em delicious.com para referência futura e google-foo extra.
Orwellophile
Resposta severamente subestimada. Obrigado!
Koshinae 6/03
36

Mais uma opção, usando meld neste caso:

git difftool -d master otherbranch

Isso permite não apenas ver as diferenças entre os arquivos, mas também fornece uma maneira fácil de apontar e clicar em um arquivo específico.

rsilva4
fonte
6
Pode querer fusão conjunto como difftool padrão: git configuração --global diff.tool fusão
bwv549
1
Este é o meu favorito porque ele usará o difftool que você configurar.
1937 Josiah
Não suportado no OSX. :-(
Mike S.
@MikeS. confira esta resposta stackoverflow.com/a/12815806/151918 que contém instruções para OSX. Funciona para mim, pelo menos, espero que ajude.
rsilva4
Agradável. Mas qual é a -dopção?
Scotty.NET
29

Observe que o git facilita a tentativa de mesclar e se afastar de qualquer problema se você não gostar do resultado. Pode ser mais fácil do que procurar problemas em potencial com antecedência.

David Plumpton
fonte
10
David, que é um bom ponto, embora que seria bom apenas para saber o que está acontecendo antes de mão ...
johannix
18

E se você estiver procurando alterações apenas entre certos arquivos, então:

git diff branch1 branch2 -- myfile1.js myfile2.js

branch1 é opcional e seu ramo atual (o ramo em que você está) será considerado por padrão se o ramo1 não for fornecido. por exemplo:

git diff master -- controller/index.js
Mannu
fonte
15

Ao trabalhar de forma colaborativa ou em vários recursos ao mesmo tempo, é comum que o upstream ou mesmo seu mestre contenham trabalho que não esteja incluído em sua filial e que apareçam incorretamente nas diferenças básicas.

Se seu Upstream pode ter sido movido, você deve fazer o seguinte:

git fetch
git diff origin/master...

Apenas o uso do git diff master pode incluir ou deixar de incluir alterações relevantes.

Alex Brown
fonte
8

Existem dois ramos, digamos

  • A (Filial na qual você está trabalhando)
  • B (Outro ramo com o qual você deseja comparar)

Estar no ramo A, você pode digitar

git diff --color B

então isso lhe dará uma saída de

insira a descrição da imagem aqui

O ponto importante sobre isso é

  1. O texto em verde está presente no ramo A

  2. O texto em vermelho está presente na ramificação B

selftaught91
fonte
8

Há muitas respostas aqui, mas eu queria adicionar algo que eu costumo usar. Se você estiver em um dos ramos que gostaria de comparar, normalmente faço o seguinte. Por essa resposta, diremos que estamos em nosso ramo secundário. Dependendo da visualização que você precisa no momento, depende da sua escolha, mas na maioria das vezes eu estou usando a segunda opção das duas. A primeira opção pode ser útil se você estiver tentando voltar para uma cópia original - de qualquer forma, ambos farão o trabalho!

Isso comparará o mestre com o ramo em que estamos (o qual é secundário) e o código original será as linhas adicionadas e o novo código será considerado as linhas removidas

git diff ..master

OU

Isso também irá comparar o mestre com o ramo em que estamos (o qual é secundário) e o código original será as linhas antigas e o novo código serão as novas linhas

git diff master..
TheCodenator
fonte
1

Se você estiver usando o Github / Github Enterprise, poderá usar a interface da Web da Web pressionando o URL /comparedo caminho do repositório, por exemplo, https://github.com/http4s/http4s/compare . Você pode selecionar o branch / commit / tag que deseja comparar: Github Compare a captura de tela

E o diff será apresentado na interface do github no URL /compare/{x1}...{x2}onde estão x2e x1são o branch / commit / tag que você deseja comparar, por exemplo: https://github.com/http4s/http4s/compare/release-0.18.x ...mestre

Você pode ver mais no documento do Github .

Valy Dia
fonte
0

Para as pessoas que procuram uma solução GUI, o Git Cola possui um "Visualizador de Diferenças de Filial ( Diff -> Ramos .. ) muito bom .

kerner1000
fonte
-1
git diff revision_n revision_m

se revision_ne revision_msão confirmações sucessivas, produz o mesmo que git show revision_m

Jovo Skorupan
fonte
-2

Se você gosta da GUI e está usando o Windows, aqui está uma maneira fácil.

  1. Baixar WinMerge
  2. Confira os dois ramos em pastas diferentes
  3. Faça uma comparação de pasta por pasta usando o WinMerge. Você também pode fazer modificações facilmente se um dos ramos for o que você está trabalhando.
Marius Matioc
fonte
Não é a maneira mais simples, na verdade não há necessidade de baixar repositórios para diferenciar entre os ramos.
31419 stefgosselin
Ele de fato não é a maneira mais simples, mas é a maneira GUI, que muitas vezes é muito mais fácil, especialmente para ver os diffs em todos os arquivos
Marius Matioc
-3

Você também pode comparar facilmente ramificações de arquivos alterados usando, por exemplo, o TortoiseGit . Basta clicar em Procurar referências e escolher os ramos que deseja comparar.

Por exemplo, se você comparar seu ramo com o mestre , obterá como resultado uma lista de arquivos que serão alterados no mestre se você decidir mesclar seu ramo no mestre .

Lembre-se de que você terá resultados diferentes se comparar o mestre com o seu ramo e o seu ramo com o mestre .

Piotr
fonte
1
a questão parece ser sobre a utilidade git nativo
Vladimir Hraban