git diff entre dois arquivos diferentes

110

Em HEAD(o último commit), tenho um arquivo chamado foo. Em minha árvore de trabalho atual, mudei o nome para bare também o editei.

Quero git diff fooem HEAD, e barna minha árvore de trabalho atual.

MiJyn
fonte
64
Achei que esta pergunta (do título) pudesse ser sobre o uso do git diff em dois arquivos que não estão necessariamente em um repo. Descobri que o sinalizador --no-index serve para isso, por exemplo git diff --no-index --word-diff old_file.txt new_file.txt(--word-diff destaca as alterações por palavra, não apenas por linha, o que é muito útil para texto longo).
Pat

Respostas:

135

Especifique os caminhos explicitamente:

git diff HEAD:full/path/to/foo full/path/to/bar

Confira a --find-renamesopção nos git-diff documentos .

Crédito: twaggs .

Steven Wexler
fonte
9
Quero mencionar que você pode comparar quaisquer dois arquivos usando, git diff <path> <path>mesmo que eles não estejam em um repositório git.
mitenka
1
@mitenka Não acho isso correto. Se você observar, git diff --helpverá que os únicos padrões suportados para dois arquivos são git diff [<options>] --no-index [--] <path> <path>. git diff a bcorresponde apenas a padrões de confirmação, não a arquivos.
Doug
@Doug Aqui está a citação do comando help que você mencionou, git-scm.com/docs/git-diff : Mostra as [...] alterações entre dois arquivos no disco.
mitenka
@mitenka a ajuda diz, a menos que você use '--no-index', ele não compara arquivos; seu comentário deve ser uma resposta separada; não é verdade e não é relevante para esta resposta.
Doug
1
@Doug Obrigado pela sua opinião. Aqui está a citação da ajuda que você faz referência: Você pode omitir a --no-indexopção ao executar o comando em uma árvore de trabalho controlada pelo Git e pelo menos um dos pontos de caminho fora da árvore de trabalho, ou ao executar o comando fora de uma árvore de trabalho controlada pelo Git .
mitenka
77

Acredito que usar --no-indexé o que você está procurando:

git diff [<options>] --no-index [--] <path> <path>

conforme mencionado no manual do git:

Este formulário é para comparar os dois caminhos fornecidos no sistema de arquivos. Você pode omitir a --no-indexopção ao executar o comando em uma árvore de trabalho controlada pelo Git e pelo menos um dos caminhos aponta para fora da árvore de trabalho, ou ao executar o comando fora de uma árvore de trabalho controlada pelo Git.

mh sattarian
fonte
1
@swe esta é definitivamente uma resposta útil, mas o OP declarou especificamente que o arquivo está no HEAD, o que significa que está em um índice git. A resposta aceita aborda diretamente a questão. Também a resposta aceita teve uma vantagem de 6 anos;)
Michael Delgado
3
Isso pode não ter ajudado o OP, mas era exatamente o que eu estava procurando.
thislooksfun
Isso responde à pergunta postada pelo título, se você estiver procurando por isso na web.
Merlin
3

Se você estiver usando o tortoise git, você pode clicar com o botão direito em um arquivo e obter uma comparação: Clique com o botão direito do mouse no primeiro arquivo e através do submenu tortoisegit selecione "Diff later" Então no segundo arquivo você também pode clicar com o botão direito neste , vá para o submenu tortoisegit e selecione "Diff with yourfilenamehere.txt"

camjocotem
fonte
-12

Usando o PhpStorm, eu apenas copio o código do commit anterior e comparo-o com a versão atual usando a ferramenta integrada "comparar com a área de transferência".

Stevie Wonder
fonte
5
PhpStorm é um IDE comercial. Esta questão é sobre como fazer isso dentro do próprio git cli, sem presunção de software adicional.
Charles Taylor