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.


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.


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

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

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.