Git: Como diferenciar dois arquivos diferentes em diferentes ramos?

170

Eu tenho dois arquivos diferentes em diferentes ramos. Como posso diferenciá-los em um comando?

Algo como

# git diff branch1/foo.txt branch2/foo-another.txt

Eu poderia verificar o outro arquivo, diferenciá-lo e restaurá-lo, mas essa é uma solução bastante suja.

Ondra Žižka
fonte
3
@EugenKonkov Não é uma duplicata, porque esta pergunta está perguntando como diferenciar arquivos diferentes em diferentes ramificações. A pergunta vinculada pergunta apenas como diferenciar o mesmo arquivo em diferentes ramificações.
Steve

Respostas:

214
git diff branch1:full/path/to/foo.txt branch2:full/path/to/foo-another.txt

Você também pode usar caminhos relativos:

git diff branch1:./relative/path/to/foo.txt branch2:./relative/path/to/foo-another.txt
twaggs
fonte
9
Impressionante! Eu certamente não fui capaz de deduzir isso de git help diff. A propósito, esses nomes não precisam ser nomes de ramificação antes dos dois pontos, mas podem ser qualquer tipo de referência de confirmação (por exemplo, valores SHA-1).
Steve Jorgensen
3
Nota importante: O Git on windows exige que o itemspec completo seja um nome unix. ie branch1: full \ path \ to \ foo.txt falha, enquanto branch1: full / path / to / foo.txt funciona bem, assim como full \ path \ to \ foo.txt (sem ramificação)
Eris
usar git difftoole, em seguida, soltar o branch2:e que permitirá que você editar um arquivo na árvore de trabalho atual (para trazer sobre as mudanças de branch1)
gMale
Tentei no linux com a versão 1.8.3.1 do git, apenas os caminhos relativos permitidos.
Sola Yang
21

Sidenote: não há necessidade de caminhos completos; você pode começar ./por caminhos relativos. Às vezes, pode ser útil.

git diff branch1:./relative/path/to/foo.txt branch2:./relative/path/to/foo-another.txt
Campa
fonte
2

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

  • Se o nome for o mesmo ou diferente:

     git diff branch1:file branch2:file
    

    Exemplo:

     git diff branch1:full/path/to/foo.txt branch2:full/path/to/foo-another.txt
    
  • Somente se o nome for o mesmo e você desejar comparar seu diretório de trabalho atual com alguma ramificação:

    git diff ..someBranch path/to/file
    

    Exemplo:

    git diff ..branch2 full/path/to/foo.txt
    

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

Você pode verificar esta resposta:

Compare um arquivo de duas ramificações diferentes no Git

Javier C.
fonte
1

Resposta off-topic - ver comentários

Apenas para adicioná-lo, acho uma sintaxe muito direta:

git diff <branch1> <branch2> <filepath>

Também funciona com referências relativas, como por exemplo:

# compare the previous committed state from HEAD with the state branch1 was 3 commits ago
git diff HEAD^ <branch1>~3 <filepath>
RomainValeri
fonte
1
O OP solicitou especificamente "arquivos diferentes". Sua resposta é sobre a comparação do mesmo arquivo em dois ramos diferentes.
Etienne Miret
@ EtienneMiret Você está absolutamente certo, eu perdi esse ponto importante. Resposta off-topic.
RomainValeri 16/10/19
-1

Você pode especificar um início e um intervalo git diffa serem aplicados. O intervalo é indicado com a ..notação.

branch1=somebranch
branch2=someotherbranch
git diff ${branch1}..${branch2} -- file_path
JCF
fonte
Isso está comparando apenas o mesmo arquivo em duas ramificações; a questão era sobre dois arquivos diferentes em dois ramos.
Piran