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


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 .


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? ".


371

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

git show <COMMIT>

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.


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.


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

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.


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.


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?


16

Outra possibilidade:

git log -p COMMIT -1

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


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


9

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

git diff <commit-hash>^-

Exemplo:

git diff cd1b3f485^-

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 <you@you.com>
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


"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.


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

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 <souparno.majumder@gmail.com>
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 <souparno.majumder@gmail.com>
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

2

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


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 

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
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.