web-dev-qa-db-fra.com

Comment diff un commit avec son parent?

En plus d'écrire un alias ou un script, existe-t-il une commande plus courte pour obtenir le diff pour un commit particulier?

git diff 15dc8^..15dc8

Si vous ne donnez que l'ID de validation unique git diff 15dc8, les différences qui commettent contre HEAD.

441
Brian L

Utilisez git show $COMMIT. Il vous montrera le message de journal pour le commit, et le diff de ce commit en particulier.

618
mipadi

Utilisation:

git diff 15dc8^!

comme décrit dans le fragment suivant de git-rev-parse (1) page de manuel (ou dans git moderne gitrevisions (7) page de manuel):

Il existe deux autres raccourcis pour nommer un ensemble formé par un commit et ses commits parents. La notation r1 ^ @ désigne tous les parents de r1. r1 ^! inclut commit r1 mais exclut tous ses parents.

Cela signifie que vous pouvez utiliser 15dc8^! comme raccourci pour 15dc8^..15dc8 n'importe où dans git où des révisions sont nécessaires. Pour diff , le git diff 15dc8^..15dc8 est compris comme git diff 15dc8^ 15dc8, ce qui signifie la différence entre le parent de commit (15dc8^) et commit (15dc8).

Remarque : la description dans git-rev-parse(1) page de manuel parle de révision , où il doit également fonctionner pour les commits de fusion, avec plusieurs parents. Alors r1^! est "r1 --not r1^@", c'est-à-dire "r1 ^r1^1 ^r1^2 ..."


Vous pouvez également utiliser git show COMMIT pour obtenir une description de validation et un diff pour une validation. Si vous voulez seulement diff, vous pouvez utiliser git diff-tree -p COMMIT

422
Jakub Narębski

Si vous savez à quelle distance en arrière, vous pouvez essayer quelque chose comme:

# Current branch vs. parent
git diff HEAD^ HEAD

# Current branch, diff between commits 2 and 3 times back
git diff HEAD~3 HEAD~2

Les commandes antérieures fonctionnent à peu près comme ceci:

# Parent of HEAD
git show HEAD^1

# Grandparent
git show HEAD^2

Vous pouvez spécifier des commits de nombreuses façons:

# Great grandparent
git show HEAD~3

Voir cette page pour plus de détails .

54
Paul Vincent Craven

Comme @mipadi le fait remarquer, vous pouvez utiliser git show $COMMIT, mais cela affiche également certains en-têtes et le message de validation. Si vous voulez un diff droit, utilisez git show --pretty=format:%b $COMMIT.

Ce n'est évidemment pas une main très courte, donc je garde cet alias dans mon .gitconfig

    [alias]
      sd = show --pretty=format:%b

Cela me permet d’utiliser git sd $COMMITto show diff.

11
Øystein Steimler

La plupart des exemples mentionnés (par exemple, git diff 15dc8^! ou git diff 15dc8^..15dc8) ne fonctionnent pas si vous utilisez zsh et que vous avez défini l'option extendedglob. Vous pouvez résoudre ce problème de l’une des manières suivantes:

  1. unsetopt extendedglob (et/ou le supprimer de .zshrc)

  2. setopt NO_NOMATCH (et/ou le définir en .zshrc)

  3. échapper au curseur et cogner à chaque fois avec une barre oblique inverse, p. ex. git diff 15dc8\^\!

5
Ville
git diff 15dc8 15dce~1

~ 1 signifie 'parent', ~ 2 'grand-parent, etc.

3

La solution de Paul ci-dessus a fait ce que j'espérais.

$ git diff HEAD^1

En outre, il est utile d’ajouter des alias tels que les tables mentionnées, si vous insérez ce qui suit dans la section [alias] de votre fichier ~/.gitconfig, vous pouvez utiliser un raccourci pour afficher les différences entre head et previous.

[alias]
    diff-last = diff HEAD^1

Puis, en exécutant $ git diff-last, vous obtiendrez votre résultat. Notez que ceci inclura également toutes les modifications que vous n'avez pas encore validées, ainsi que les différences entre les validations. Si vous voulez ignorer les modifications que vous n'avez pas encore commises, vous pouvez utiliser diff pour comparer le HEAD avec son parent directement. :

$ git diff HEAD^1 HEAD
2

Utilise des alias, donc ne répond pas à votre question avec précision, mais je les trouve utiles pour faire ce que vous voulez faire ...

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"
0
hobs