O mais legal disso é que isso funcionaria com o "git difftool", usando as ferramentas para mostrar o diff.
orip 6/07/10
Para referência, a resposta a esta outra questão ilustra como você pode configurar um apelido bash-alimentado para simplificar o acima: stackoverflow.com/questions/3321492/...
Nick
Respostas:
641
Use git show $COMMIT. Ele mostrará a mensagem de log para o commit e o diff desse commit específico.
Existem duas outras atalhos para nomear um conjunto formado por uma confirmação e sua confirmação pai. A notação r1 ^ @ significa todos os pais de r1. r1 ^! inclui commit r1, mas exclui todos os seus pais.
Isso significa que você pode usar 15dc8^!como uma abreviação para 15dc8^..15dc8qualquer lugar do git onde as revisões são necessárias. Para o comando diff,git diff 15dc8^..15dc8 entende-se como git diff 15dc8^ 15dc8, o que significa a diferença entre o pai de commit ( 15dc8^) e commit ( 15dc8).
Nota : a descrição na página de git-rev-parse(1)manual fala sobre intervalos de revisão , onde ele também precisa trabalhar para confirmações de mesclagem, com mais de um pai. Então r1^!é " r1 --not r1^@" ie " r1 ^r1^1 ^r1^2 ..."
Além disso, você pode usar git show COMMITpara obter a descrição e o diff de uma confirmação. Se você quiser apenas diff, você pode usargit diff-tree -p COMMIT
Esta deve ser a resposta aceita, é muito melhor. No entanto, a última sentença do extrato git-rev-parse é bastante confusa - parece que significa 'intervalo do pai deste commit para esse commit'.
RichVel
1
@ RichVel: é um pouco confuso porque tenta descrever também a situação em que o commit possui mais de um pai (é um commit de mesclagem). r1 ^! funciona como esperado também então.
Jakub Narębski
@ JakubNarębski: bom ponto, talvez você possa editar sua resposta para resumir sua compreensão dos casos monoparentais e multiparentais - declarações separadas sobre cada um podem ser mais fáceis de entender.
RichVel
1
@ JakubNarębski: sim, muito melhor! Agora eu uso esse atalho o tempo todo - obrigado.
RichVel
1
A ^!notação abreviada pai funciona corretamente com difftool para confirmações normais, mas a diferença é revertida para confirmações de mesclagem. Por quê então?
hIpPy
56
Se você sabe há quanto tempo, pode tentar algo como:
# Current branch vs. parent
git diff HEAD^ HEAD
# Current branch, diff between commits 2 and 3 times back
git diff HEAD~3 HEAD~2
As confirmações anteriores funcionam mais ou menos assim:
# Parent of HEAD
git show HEAD^1
# Grandparent
git show HEAD^2
Existem várias maneiras de especificar confirmações:
HEAD ^ 2 não é o avô; se HEAD ^ 1 é papai, HEAD ^ 2 é mamãe. Use HEAD ~ 2 para o pai do papai.
Binarian
11
Como o @mipadi aponta, você pode usar git show $COMMIT, mas isso também mostra alguns cabeçalhos e a mensagem de confirmação. Se você quiser um diff direto, usegit show --pretty=format:%b $COMMIT .
Obviamente, essa não é uma mão muito curta, então estou mantendo esse alias no meu .gitconfig
[alias]
sd = show --pretty=format:%b
Isso me permite usar git sd $COMMITpara mostrar diff .
Este alias pode incluir --color o que o torna mais fácil de ler: sd = mostrar --color --pretty = formato:% b
RichVel
@RichVel Indeed! Muito bom ponto. Se você tem as cores ativadas por padrão no git, você não precisará dessa opção. É o que eu normalmente faço.
Øystein Steimler
5
Muitos dos exemplos mencionados (por exemplo git diff 15dc8^!, ou git diff 15dc8^..15dc8) não funcionam se você estiver usando o zsh e tiver o extendedglobconjunto de opções. Você pode corrigi-lo de uma das três maneiras a seguir:
unsetopt extendedglob (e / ou remova-o de .zshrc)
setopt NO_NOMATCH (e / ou defina em .zshrc)
escapar do sinal de intercalação e bater sempre com uma barra invertida, por exemplo git diff 15dc8\^\!
Além disso, é útil adicionar aliases, como os hobs mencionados, se você colocar o seguinte na seção [alias] do seu arquivo ~ / .gitconfig, poderá usar a abreviação para visualizar o diff entre head e anterior.
[alias]
diff-last = diff HEAD^1
Então, executando $ git diff-last você obterá seu resultado. Observe que isso também incluirá quaisquer alterações que você ainda não tenha confirmado, bem como a diferença entre confirmações. Se você deseja ignorar as alterações que ainda não foram confirmadas, use diff para comparar o HEAD com o pai diretamente:
Respostas:
Use
git show $COMMIT
. Ele mostrará a mensagem de log para o commit e o diff desse commit específico.fonte
Usar:
como descrito no seguinte fragmento da página de manual git-rev-parse (1) (ou na página de manual moderna git gitrevisions (7) ):
Isso significa que você pode usar
15dc8^!
como uma abreviação para15dc8^..15dc8
qualquer lugar do git onde as revisões são necessárias. Para o comando diff,git diff 15dc8^..15dc8
entende-se comogit diff 15dc8^ 15dc8
, o que significa a diferença entre o pai de commit (15dc8^
) e commit (15dc8
).Nota : a descrição na página de
git-rev-parse(1)
manual fala sobre intervalos de revisão , onde ele também precisa trabalhar para confirmações de mesclagem, com mais de um pai. Entãor1^!
é "r1 --not r1^@
" ie "r1 ^r1^1 ^r1^2 ...
"Além disso, você pode usar
git show COMMIT
para obter a descrição e o diff de uma confirmação. Se você quiser apenas diff, você pode usargit diff-tree -p COMMIT
fonte
^!
notação abreviada pai funciona corretamente com difftool para confirmações normais, mas a diferença é revertida para confirmações de mesclagem. Por quê então?Se você sabe há quanto tempo, pode tentar algo como:
As confirmações anteriores funcionam mais ou menos assim:
Existem várias maneiras de especificar confirmações:
Vejo esta página para detalhes .
fonte
Como o @mipadi aponta, você pode usar
git show $COMMIT
, mas isso também mostra alguns cabeçalhos e a mensagem de confirmação. Se você quiser um diff direto, usegit show --pretty=format:%b $COMMIT
.Obviamente, essa não é uma mão muito curta, então estou mantendo esse alias no meu .gitconfig
Isso me permite usar
git sd $COMMIT
para mostrar diff .fonte
Muitos dos exemplos mencionados (por exemplo
git diff 15dc8^!
, ougit diff 15dc8^..15dc8
) não funcionam se você estiver usando o zsh e tiver oextendedglob
conjunto de opções. Você pode corrigi-lo de uma das três maneiras a seguir:unsetopt extendedglob
(e / ou remova-o de .zshrc)setopt NO_NOMATCH
(e / ou defina em .zshrc)escapar do sinal de intercalação e bater sempre com uma barra invertida, por exemplo
git diff 15dc8\^\!
fonte
~ 1 significa 'pai', ~ 2 'avô, etc.
fonte
A solução de Paulo acima fez o que eu esperava.
Além disso, é útil adicionar aliases, como os hobs mencionados, se você colocar o seguinte na seção [alias] do seu arquivo ~ / .gitconfig, poderá usar a abreviação para visualizar o diff entre head e anterior.
Então, executando $ git diff-last você obterá seu resultado. Observe que isso também incluirá quaisquer alterações que você ainda não tenha confirmado, bem como a diferença entre confirmações. Se você deseja ignorar as alterações que ainda não foram confirmadas, use diff para comparar o HEAD com o pai diretamente:
fonte
Usa aliases, portanto, não responde exatamente à sua pergunta, mas acho úteis para fazer o que você pretende ...
fonte