Como ver as alterações em um commit do Git?

1549

Quando git diff COMMITvejo as alterações entre esse commit e o HEAD (tanto quanto sei), mas gostaria de ver as alterações feitas por esse único commit.

Eu não encontrei nenhuma opção óbvia em diff/ logque me dará essa saída.

Laktak
fonte
4
possível duplicata do Shorthand para diff do git commit com seu pai?
Chris Maes

Respostas:

1975

Para ver o diff para um COMMIThash específico :

git diff COMMIT~ COMMITmostrará a diferença entre esse COMMITancestral e o COMMIT. Veja as páginas de manual do git diff para detalhes sobre o comando e gitrevisions sobre a ~notação e seus amigos.

Como alternativa, git show COMMITfará algo muito semelhante. (Os dados do commit, incluindo seu diff - mas não para commits de mesclagem.) Veja a página de manual do git show .

Nevik Rehnel
fonte
17
Note-se que as ^necessidades de ser citado nas conchas Thomson e Bourne (sinônimo de |lá) e rce seus derivados (operador acento circunflexo) e zshcom extendedglob habilitado ( notoperador de englobamento)
Stephane Chazelas
3
Observe que HEAD^implica o primeiro pai no caso de uma confirmação ter vários pais (ou seja, confirmação de mesclagem).
Mansour
23
git diff COMMIT~ COMMITfunciona para mim, observe o til em vez de acento circunflexo. Estou executando o git versão 2.6.1.windows.1 no Windows 10.
Juuso Ohtonen
14
@tradetree: a palavra COMMIT deve ser substituída pelo nome de algum commit, por exemplo, a soma SHA.
Nick Matteo
91
Eu sinto que o git show é mais apropriado para esta pergunta e deve ser a sugestão mencionada primeiro.
Pypmannetjies
497

Como mencionado em " Atalho para diff do git commit com seu pai? ", Você também pode usar git diffcom:

git diff COMMIT^!

ou

git diff-tree -p COMMIT

Com o git show, você precisaria (para se concentrar apenas no diff):

git show --color --pretty=format:%b $COMMIT

O COMMITparâmetro é um commit-ish :

Um objeto de confirmação ou um objeto que pode ser desreferenciado recursivamente para um objeto de confirmação. A seguir estão todos os commit-ishes: um objeto de commit, um objeto de tag que aponta para um objeto de commit, um objeto de tag que aponta para um objeto de tag que aponta para um objeto de commit, etc.

Veja gitrevision "ESPECIFICANDO REVISÕES" para referenciar um commit-ish.
Veja também " O que significa tree-ish no Git? ".

VonC
fonte
371

Você também pode tentar desta maneira fácil:

git show <COMMIT>
Lakhan
fonte
2
Parece que este faz algo bem diferente
Variable Miserable
3
Ele mostra apenas a mensagem de confirmação. Não é o diff das alterações de código aplicadas a esta confirmação.
K0pernikus
1
Sim? Finalmente nas últimas versões do git ...
Davy
2
Esta deve ser a resposta correta atualizada
Scott Skiles
1
Essa deve ser a resposta.
Roel
77

git show mostra as alterações feitas no commit mais recente.

Equivalente a git show HEAD.

git show HEAD~1 leva você de volta 1 commit.

Adam Salma
fonte
45

Eu costumo fazer:

git diff HEAD~1

Para mostrar as alterações relacionadas ao último commit. Se você tiver mais confirmações, apenas aumente o número 1 para quantas confirmações você deseja ver.

Alex
fonte
34

Primeiro obtenha o ID de confirmação usando,

git log #to list all

Ou

git log -p -1 #last one commit id

Copie o ID de confirmação.

Agora usamos dois métodos para listar alterações de uma confirmação específica,

Método 1:

git diff commit_id^! #commit id something like this 1c6a6000asad012

Método 2:

git show commit_id
For example: git show 1c6a600a
Mohideen bin Mohammed
fonte
2
O que ^!significa isso?
Martín Coll
2
^! é a abreviação para cometer ^ .. comprometer que meios irá excluir todos os pais e verifique diff no que cometem
Mohideen bin Mohammed
Não sou especialista, mas tenho um caso (com várias ramificações envolvidas) em que git log c ^! não é exatamente o mesmo que git log c ^ .. c. De fato, é muito melhor: git log c ^ .. c listou muitas entradas enquanto git log c ^! fiz a coisa certa, então é isso que eu estava procurando por um longo tempo
#
32
git show <commit_sha>

Isso mostrará exatamente o que há nesse commit. Eu acho que você pode fazer um intervalo apenas colocando um espaço entre dois commit shas.

git show <beginning_sha> <ending_sha>

o que é bastante útil se você estiver revidando com frequência, pois seus logs de recursos serão todos seguidos.

Iwnnay
fonte
25

Na página de manual do git-diff (1) :

git diff [options] [<commit>] [--] [<path>…]
git diff [options] --cached [<commit>] [--] [<path>…]
git diff [options] <commit> <commit> [--] [<path>…]
git diff [options] <blob> <blob>
git diff [options] [--no-index] [--] <path> <path>

Use o terceiro no meio:

git diff [options] <parent-commit> <commit>

Também na mesma página do manual, na parte inferior, na seção Exemplos :

$ git diff HEAD^ HEAD      <3>

Compare a versão antes da última confirmação e da última confirmação.

É certo que está redigido um pouco confuso, seria menos confuso quanto

Compare a confirmação mais recente com a confirmação antes.


fonte
3
Sua reformulação se aplicaria a git diff HEAD HEAD^.
Richard
git diff HEAD ^ HEAD não exibe nenhuma alteração.
precisa saber é o seguinte
@ user3690202, o que implica que não há alterações a serem exibidas. Esse é realmente o caso?
Como não pode haver nenhuma alteração a ser exibida? Se você deseja visualizar o último commit, certamente, a menos que seja um repositório completamente novo, haverá algumas alterações a serem exibidas?
precisa saber é o seguinte
@ user3690202 é possível fazer um "commit vazio" com o Git que não contenha nenhuma alteração do pai, embora exista uma proteção interna que verifique e evite isso, embora seja substituível com uma opção de linha de comando. Duvido que você intencionalmente crie um commit vazio, então outra possibilidade é que você tenha uma conversão de final de linha pré-commit em (ou outras coisas engraçadas de espaço em branco) que está enganando o Git a pensar que nenhuma alteração foi realmente feita. Em qual plataforma você está executando o Git?
22

O seguinte parece fazer o trabalho; Eu o uso para mostrar o que foi trazido por uma mesclagem.

git whatchanged -m -n 1 -p <SHA-1 hash of merge commit>
MichaelMoser
fonte
Isso funcionaria também git log? (por causa de stackoverflow.com/a/18585297/6309 )
VonC
16

Outra possibilidade:

git log -p COMMIT -1
John_West
fonte
1
@GrantMcLean Sim, e já está na resposta mais votada, por isso não o mencionei.
31416 John_West
11

Você poderia usar git diff HEAD HEAD^1 para ver o diff com o commit pai.

Se você deseja apenas ver a lista de arquivos, adicione a --statopção

Irshu
fonte
Isto é o que você quer dizer, git diff HEAD ^ 1 HEAD
Shibir Basak 26/09/18
Observe que isso mostrará o que você adicionou como removido, pois fará uma comparação inversa. A maneira como você deve ler o diffcomando é: o que eu precisaria alterar no arquivo para passar de commit HEADpara commit HEAD^1?
brainplot
9
git difftool COMMIT^ <commit hash>

também é possível se você configurou seu difftool.

Veja aqui como configurar o difftool Ou a página de manual aqui

Além disso, você pode usar git diff-tree --no-commit-id --name-only -r <commit hash>para ver quais arquivos foram alterados / confirmados em um hash de confirmação

Chand Priyankara
fonte
9

Eu gosto do comando abaixo para comparar um commit específico e seu último commit:

git diff <commit-hash>^-

Exemplo:

git diff cd1b3f485^-
starcwl
fonte
6

Para ver o autor e a hora usando commit git show COMMIT. O que resultará em algo assim:

commit 13414df70354678b1b9304ebe4b6d204810f867e
Merge: a2a2894 3a1ba8f
Author: You <[email protected]>
Date:   Fri Jul 24 17:46:42 2015 -0700

     Merge remote-tracking branch 'origin/your-feature'

Se você deseja ver quais arquivos foram alterados, execute o seguinte com os valores da linha Mesclar acima git diff --stat a2a2894 3a1ba8f .

Se você quiser ver o diff real, execute git --stat a2a2894 3a1ba8f

Nikita G.
fonte
"Se você quiser ver o diff real, execute git --stat a2a2894 3a1ba8f". Eu acho que você quer dizer git diff a2a2894 3a1ba8fou não unknown option: --stat.
Fruit
5

Para verificar alterações completas:

  git diff <commit_Id_1> <commit_Id_2>

Para verificar apenas os arquivos alterados / adicionados / excluídos:

  git diff <commit_Id_1> <commit_Id_2> --name-only

NOTA : Para verificar o diff sem confirmar no meio, você não precisa colocar os IDs de confirmação.

bit_cracker007
fonte
4

Estou executando o Git versão 2.6.1.windows.1 no Windows 10, então precisei de uma pequena modificação na resposta de Nevik (til em vez de circunflexo):

git diff COMMIT~ COMMIT

Outra opção é citar o sinal de intercalação:

git diff "COMMIT^" COMMIT
Juuso Ohtonen
fonte
3

Este comando fornece o commit-hash pai do Git:

git log -n 2 <commit-hash>

Depois disso git diff-tool <commit-hash> <parent-commit-hash>

Exemplo:

bonnie@bonnie ~/ $ git log -n 2 7f65b9a9d3820525766fcba285b3c678e889fe3

commit 7f65b9a9d3820525766fcba285b3c678e889fe3b
Author: souparno <[email protected]>
Date:   Mon Jul 25 13:17:07 2016 +0530

CSS changed to maintain the aspect ratio of the channel logos and to fit them properly.

commit c3a61f17e14e2b80cf64b172a45f1b4826ee291f
Author: souparno <[email protected]>
Date:   Mon Jul 25 11:28:09 2016 +0530

The ratio of the height to width of the channel images are maintained.

Depois disto

git difftool 7f65b9a9d3820525766fcba285b3c678e889fe3b c3a61f17e14e2b80cf64b172a45f1b4826ee291f
souparno majumder
fonte
2

Se você quiser apenas ver as alterações no último commit, simplesmente git showfornecerá isso.

MyrionSC2
fonte
1

No caso de verificar a alteração da fonte em uma visualização gráfica,

$gitk (Mention your commit id here)

por exemplo:

$gitk HEAD~1 
user272390
fonte
Não entendo por que essa resposta foi reduzida. Concordo que a linha de comando e as coisas baseadas em texto são o caminho a percorrer, mas o gitk fornece muitas informações úteis.
ShellFish 25/09/19