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^..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
^!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 $COMMITpara 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 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\^\!
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"