Além de escrever um alias ou script, existe um comando mais curto para obter o diff para um commit específico?
git diff 15dc8^..15dc8
Se você fornecer apenas o único ID de confirmação git diff 15dc8
, será diferente desse commit contra HEAD.
Além de escrever um alias ou script, existe um comando mais curto para obter o diff para um commit específico?
git diff 15dc8^..15dc8
Se você fornecer apenas o único ID de confirmação git diff 15dc8
, será diferente desse commit contra HEAD.
Respostas:
Use git show $COMMIT
. Ele mostrará a mensagem de log para o commit e o diff desse commit específico.
Usar:
git diff 15dc8^!
como descrito no seguinte fragmento da página de manual git-rev-parse (1) (ou na página de manual moderna git gitrevisions (7) ):
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^..15dc8
qualquer 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 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
^!
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:
# 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:
# Great grandparent
git show HEAD~3
Vejo esta página para detalhes .
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 $COMMIT
para mostrar diff .
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 extendedglob
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\^\!
git diff 15dc8 15dce~1
~ 1 significa 'pai', ~ 2 'avô, etc.
A solução de Paulo acima fez o que eu esperava.
$ git diff HEAD^1
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:
$ git diff HEAD^1 HEAD
Usa aliases, portanto, não responde exatamente à sua pergunta, mas acho úteis para fazer o que você pretende ...
alias gitdiff-1="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 2|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git diff"
alias gitdiff-2="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 3|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git diff"
alias gitdiff-3="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 4|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git diff"
alias gitlog-1="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 2|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git log --summary"
alias gitlog-2="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 3|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git log --summary"
alias gitlog-3="git log --reverse|grep commit|cut -d ' ' -f2|tail -n 4|head -n 2|xargs echo|sed -e 's/\s/../'|xargs -n 1 git log --summary"