Como comparar arquivos de dois ramos diferentes?

1538

Eu tenho um script que funciona bem em um ramo e está quebrado em outro. Eu quero olhar as duas versões lado a lado e ver o que é diferente. Existem maneiras de fazer isso?

Para deixar claro, não estou procurando uma ferramenta de comparação (eu uso o Beyond Compare). Estou procurando um comando git diff que me permita comparar a versão principal com a minha versão atual do ramo para ver o que mudou. Não estou no meio de uma mesclagem nem nada. Eu só quero dizer algo como

git diff mybranch/myfile.cs master/myfile.cs
Micah
fonte

Respostas:

2208

git diff pode mostrar a diferença entre dois commits:

git diff mybranch master -- myfile.cs

Ou equivalente:

git diff mybranch..master -- myfile.cs

Usando a última sintaxe, se um dos lados estiver, HEADele poderá ser omitido (por exemplo, master..comparado mastera HEAD).

Você também pode estar interessado mybranch...master(nos git diffdocumentos ):

Este formulário é para exibir as alterações no ramo que contém e até o segundo <commit>, iniciando em um ancestral comum de ambos <commit>. git diff A...Bé equivalente a git diff $(git-merge-base A B) B.

Em outras palavras, isso dará uma diferença nas alterações, masteruma vez que divergiram de mybranch(mas sem novas alterações desde então mybranch).


Em todos os casos, o --separador antes do nome do arquivo indica o fim dos sinalizadores da linha de comando. Isso é opcional, a menos que o Git fique confuso se o argumento se referir a um commit ou a um arquivo, mas incluir esse não é um mau hábito. Consulte https://stackoverflow.com/a/13321491/54249 para obter alguns exemplos.


Os mesmos argumentos podem ser passados ​​para git difftoolse você tiver um configurado.

dahlbyk
fonte
44
E se nenhuma das duas versões que você deseja comparar for a árvore de trabalho, você poderá usar git diff branch1 branch2 myfile.cs. ( --Isso não deve mais ser necessário, pois ele pode levar apenas dois argumentos de revisão.) #
Cascabel
8
Eu tentei todas as versões disso e nada acontece. Eu tenho o meu difftool configurado (ele funciona para mesclagem). Eu tenho um arquivo chamado bd.ps1. Toda versão do comando que digito não faz nada. Nem sequer dá um erro. WTH!?!?!
Micah
3
@Micah: Você está tentando com diff simples também? Você está digitando corretamente o caminho relativo ao diretório atual? (Silenciosamente, não mostrará diferenças se o arquivo não existir e você usará o --erro. Comum e fácil de cometer.) #
Cascabel
5
Isso não funcionou para mim, a menos que eu incluísse o caminho completo do arquivo, como mostrado por git diff --name-status branch1..branch2(provavelmente óbvio, mas pensei em mencioná-lo caso outra pessoa tenha o mesmo problema que eu).
precisa saber é o seguinte
4
A ordem de mybranch e master também é importante. O arquivo no primeiro ramo será mostrado com prefixos '-', o arquivo no segundo ramo será mostrado com prefixos '+'.
timbo 14/09/15
414

Você consegue fazer isso: git diff branch1:path/to/file branch2:path/to/file

Se você tiver o difftool configurado, também poderá: git difftool branch1:path/to/file branch2:path/to/file

Pergunta relacionada: Como visualizo a saída do git diff com o programa visual diff

Tim Henigan
fonte
4
Usar os dois pontos não é realmente uma ótima maneira - significa que você está referenciando os arquivos através dos objetos da árvore; portanto, é necessário digitar o caminho completo, em vez de relativo ao diretório atual.
Cascabel
13
@ Jeffefi, isso pode ter sido alterado em uma versão mais recente, mas pelo menos agora você pode usar caminhos relativos (por exemplo branch1:./file). Isso também é útil se o arquivo estiver em um local separado entre as ramificações (por exemplo git diff branch1:old/path/to/file branch2:new/path/to/file).
redbmk
4
@redbmk Sim, isso foi em algum momento entre 2010 e agora! Ainda assim, se é o mesmo arquivo nos dois ramos, não é necessário fazê-lo assim, apenas git diff branch1 branch2 path/to/file.
Cascabel
3
@jefromi legal, eu não tinha certeza da linha do tempo quando isso foi adicionado. Sim, eu normalmente usaria a sintaxe que você mencionou, mas a resposta de Tim me ajudou a descobrir como comparar arquivos com caminhos diferentes, mesmo que ele não é realmente o que a questão estava pedindo
redbmk
1
Embora eu ame essa idéia, não consigo fazer com que essa sintaxe funcione ou encontre qualquer menção nos documentos do git diff. o que estou perdendo? Obrigado!
yoyo
160

Sintaxe mais moderna:

git diff ..master path/to/file

O prefixo de ponto duplo significa "do diretório de trabalho atual para". Você também pode dizer:

  • master.., ou seja, o inverso acima. É o mesmo que master.
  • mybranch..master, referenciando explicitamente um estado que não seja a árvore de trabalho atual.
  • v2.0.1..master, ou seja, referenciando uma tag.
  • [refspec]..[refspec], basicamente qualquer coisa identificável como um estado de código para git.
Joe Atzberger
fonte
33

Existem várias maneiras de comparar arquivos de duas ramificações diferentes:

  • Opção 1: se você deseja comparar o arquivo de n ramificação específica com outra ramificação específica:

    git diff branch1name branch2name path/to/file
    

    Exemplo:

    git diff mybranch/myfile.cs mysecondbranch/myfile.cs
    

    Neste exemplo, você está comparando o arquivo na ramificação "mybranch" com o arquivo na ramificação "mysecondbranch".

  • Opção 2: Maneira simples:

     git diff branch1:file branch2:file
    

    Exemplo:

     git diff mybranch:myfile.cs mysecondbranch:myfile.cs
    

    Este exemplo é semelhante à opção 1.

  • Opção 3: se você deseja comparar seu diretório de trabalho atual com alguma ramificação:

    git diff ..someBranch path/to/file
    

    Exemplo:

    git diff ..master myfile.cs
    

    Neste exemplo, você está comparando o arquivo de sua ramificação real com o arquivo na ramificação principal.

Javier C.
fonte
12

Eu simplesmente faço git diff branch1 branch2 path/to/file

Isso verifica as diferenças entre os arquivos. As alterações branch1seriam em vermelho. Alterações embranch2 seriam em verde.

Supõe-se que branch1é o passado e branch2é o futuro. Você pode reverter isso revertendo a ordem dos ramos no diff:git diff branch2 branch1

iGbanam
fonte
Qual versão do git diff pode fazer isso? Não parece ser compatível com a versão que estou executando (2..9.2.windows.1).
Vince Bowdren
9

Se você quiser fazer uma diferença em relação à ramificação atual, pode omitir e usar:

git diff $BRANCH -- path/to/file

dessa forma, ele difere do ramo atual para o ramo referenciado ( $BRANCH).

Paulo Fidalgo
fonte
5

Concordando com a resposta sugerida por @dahlbyk. Se você deseja que o diff seja gravado em um arquivo diff para revisões de código, use o seguinte comando.

git diff branch master -- filepath/filename.extension > filename.diff --cached
Azad
fonte
2

No meu caso, eu uso o comando abaixo:

git diff <branch name> -- <path + file name>

Este comando pode ajudá-lo a comparar o mesmo arquivo em dois ramos diferentes

SKT
fonte
1

A melhor maneira de fazer isso é usando git diffda seguinte maneira: git diff <source_branch> <target_branch> -- file_path

Ele verificará a diferença entre os arquivos nessas ramificações. Dê uma olhada neste artigo para obter mais informações sobre os comandos git e como eles funcionam.

Nesha Zoric
fonte
1

Use hashes de confirmação como este:

git diff <hash1> <hash2> <filename>

onde hash1 pode ser qualquer confirmação de qualquer ramificação, o mesmo para hash2 .

prometeu
fonte
1

Existem dois cenários para comparar arquivos:

Cenário 1: Compare arquivos em ramificações remotas (ambas as ramificações devem existir no repositório remoto)

Cenário 2: Compare os arquivos locais (na cópia da área de trabalho local) com os arquivos no repositório remoto.

A lógica é simples. Se você fornecer dois nomes de ramificação para diferenças, ele sempre comparará as ramificações remotas e, se você fornecer apenas um nome de ramificação, sempre comparará sua cópia de trabalho local com o repositório remoto (o que você forneceu). Você pode usar o range para fornecer repositórios remotos.

por exemplo, fazer checkout de uma filial

git checkout branch1
git diff branch2 [filename]

nesse caso, se você fornecer o nome do arquivo, ele comparará sua cópia local do nome do arquivo com a ramificação remota denominada " branch2 ".

git diff branch1 branch2 [filename]

nesse caso, ele comparará o nome de arquivo de ramificações remotas denominadas " branch1 " vs " branch2 "

git diff ..branch2 [filename]

também nesse caso, ele comparará o nome de arquivo de ramificações remotas denominadas " branch1 " vs " branch2 ". Então, é o mesmo que acima. No entanto, se você acabou de criar uma ramificação a partir de outra ramificação, diga "master" e sua ramificação atual não existe no repositório remoto, ele comparará " master " remoto versus " branch2 " remoto .

Espero que seja útil.

Dharmender Rawat
fonte
0

Para comparar dois arquivos no git bash, você precisa usar o comando:

git diff <Branch name>..master -- Filename.extension   

Este comando mostrará a diferença entre os dois arquivos no próprio bash.

Rishav_SO
fonte