git: Como comparar os arquivos alterados com as versões anteriores após um pull?

117

Quando executo o "git pull", geralmente quero saber o que mudou entre a última versão de um arquivo e a nova. Digamos que eu queira saber o que outra pessoa comprometeu em um determinado arquivo.

Como isso é feito?

Estou assumindo que é "git diff" com alguns parâmetros para commit x versus commit y, mas não consigo obter a sintaxe. Também acho "git log" um pouco confuso e não tenho certeza de onde obter o ID de confirmação da minha versão mais recente do arquivo em comparação com a nova.

doug
fonte
1
Você pode achar a ferramenta gráfica gitk mais adequada ao seu gosto.
crazyscot
stackoverflow.com/questions/61002/… pode ser semelhante a este
VonC

Respostas:

158

Existem todos os tipos de maneiras maravilhosas de especificar commits - veja a seção de especificações de revisõesman git-rev-parse para mais detalhes. Nesse caso, você provavelmente deseja:

git diff HEAD@{1}

Os @{1}meios "a posição anterior do ref eu especificado", de modo que avalia o que você tinha verificado anteriormente - pouco antes da tração. Você pode adicionar HEADo final aqui se também tiver algumas mudanças em sua árvore de trabalho e não quiser ver as diferenças para elas.

Não tenho certeza do que você está pedindo com "o ID de confirmação da minha versão mais recente do arquivo" - o "ID" de confirmação (hash SHA1) é aquele hexadecimal de 40 caracteres bem no topo de cada entrada na saída do git log. É o hash para todo o commit, não para um determinado arquivo. Você realmente não precisa de mais - se quiser comparar apenas um arquivo no pull, faça

git diff HEAD@{1} filename

Isso é uma coisa geral - se você quiser saber sobre o estado de um arquivo em um determinado commit, você especifica o commit e o arquivo, não um ID / hash específico para o arquivo.

Cascabel
fonte
O post anterior com link de VonC diz essencialmente a mesma coisa que esta, mas a explicação é um pouco diferente, então vou deixar isso por agora. (Também usa @{1}como abreviação para HEAD@{1})
Cascabel
verdade, mas também gosto da explicação. +1
VonC
Isso é exatamente o que eu estava procurando. Obrigado pela explicação.
lucapette
1 para o que eu estava pesquisando. Seria incrível se isso fosse selecionado como a resposta e chegasse ao topo ... :)
longda
@longda Se você está classificando por votos (o que eu achei que fosse o padrão), já deveria estar no topo.
Cascabel
57

Eu gosto de usar:

git diff HEAD^

Ou se eu só quiser comparar um arquivo específico:

git diff HEAD^ -- /foo/bar/baz.txt
cadizm
fonte
5
-1: HEAD^é o commit pai, não o commit anteriorpull
CharlesB
1
Se HEADfor um commit de mesclagem, HEAD^é o primeiro commit pai, então sim, pode ser o commit antes de pull. Para obter o outro pai (para uma fusão bidirecional), use HEAD^2. Mas então, a resposta acima não está realmente respondendo à pergunta em primeiro lugar, deixando o -1 ;-)
Michael Wild
Obrigado pelo esclarecimento. Não li a pergunta com muito cuidado, pois estava procurando outra coisa no Google e esse link apareceu no alto da página de resultados. Pensei em intervir, já que sou um novo usuário e não tenho nenhum carma (se é assim que se chama SO). Culpa minha =)
cadizm
3
@MichaelWild pode não ser o que o autor da pergunta estava perguntando, mas era o que eu estava procurando quando encontrei isso. Foi útil para mim. Votos positivos.
John Dvorak
Este é o que TortoiseGit "Diff com a versão anterior" faz. E é o que eu estava procurando.
Fabien Haddadi
15

Se você fizer um direto, git pullentão você será 'acelerado' ou mesclará um número desconhecido de commits do repositório remoto. Porém, isso acontece como uma ação, então o último commit em que você estava imediatamente antes do pull será a última entrada no reflog e pode ser acessado como HEAD@{1}. Isso significa que você pode fazer:

git diff HEAD@{1}

No entanto, eu recomendo fortemente que se isso for algo que você está fazendo muito, você deve considerar apenas fazer git fetchae examinar o branch obtido antes de mesclar ou rebasear manualmente nele. Por exemplo, se você estiver no master e for puxar na origem / master:

git fetch

git log HEAD..origin/master

 # looks good, lets merge

git merge origin/master
CB Bailey
fonte
Bom uso de em git logvez de git diffaqui (mesmo se a sintaxe for um pouco incoerente entre '..' para git loge '...' para git diff;) +1 Consulte stackoverflow.com/questions/53569/… e stackoverflow.com/questions / 850607 /…
VonC
Felizmente, se você usar a sintaxe '..' em um comando git diff, git "faz a coisa certa".
CB Bailey