it-swarm.com.de

Wie kann man ein Commit mit seinem Elternteil unterscheiden?

Gibt es neben dem Schreiben eines Alias ​​oder eines Skripts einen kürzeren Befehl zum Abrufen des Diffs für ein bestimmtes Commit?

git diff 15dc8^..15dc8

Wenn Sie nur die einzelne Festschreibungs-ID angeben, git diff 15dc8, es gibt Unterschiede, die gegen HEAD begehen.

441
Brian L

Verwenden git show $COMMIT. Es zeigt Ihnen die Protokollnachricht für das Festschreiben und den Unterschied dieses bestimmten Festschreibens.

618
mipadi

Verwenden:

git diff 15dc8^!

wie im folgenden Fragment von git-rev-parse (1) manpage (oder in modernem git gitrevisions (7) manpage) beschrieben:

Es gibt zwei weitere Abkürzungen zum Benennen einer Menge, die aus einem Commit und den übergeordneten Commits besteht. Die r1 ^ @ -Notation bedeutet alle Eltern von r1. r1 ^! Beinhaltet Commit R1, schließt jedoch alle übergeordneten Elemente aus.

Dies bedeutet, dass Sie 15dc8^! Als Abkürzung für 15dc8^..15dc8 Überall in Git verwenden können, wo Überarbeitungen erforderlich sind. Für den Befehl diff wird der git diff 15dc8^..15dc8 Als git diff 15dc8^ 15dc8 Verstanden, dh der Unterschied zwischen dem übergeordneten Element von commit (15dc8^) Und commit (15dc8).

Hinweis : Die Beschreibung in der Manpage git-rev-parse(1) handelt von der Revision range, wo es auch für Merge-Commits mit mehr als einem übergeordneten Element funktionieren muss. Dann ist r1^! "r1 --not r1^@", D. H. "r1 ^r1^1 ^r1^2 ...".


Sie können auch git show COMMIT Verwenden, um eine Commit-Beschreibung und ein Diff für ein Commit abzurufen. Wenn Sie nur diff wollen, können Sie git diff-tree -p COMMIT

422
Jakub Narębski

Wenn Sie wissen, wie weit zurück, können Sie Folgendes ausprobieren:

# Current branch vs. parent
git diff HEAD^ HEAD

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

Vorherige Commits funktionieren in etwa so:

# Parent of HEAD
git show HEAD^1

# Grandparent
git show HEAD^2

Es gibt viele Möglichkeiten, wie Sie Commits angeben können:

# Great grandparent
git show HEAD~3

Siehe diese Seite für Details .

54

Wie @mipadi betont, können Sie git show $COMMIT, aber dies zeigt auch einige Header und die Commit-Nachricht. Wenn Sie ein Straight Diff wollen, verwenden Sie git show --pretty=format:%b $COMMIT.

Dies ist offensichtlich keine sehr kurze Hand, daher behalte ich diesen Alias ​​in meiner .gitconfig

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

Dies ermöglicht es mir, git sd $COMMITto show diff.

11

Viele der genannten Beispiele (z. B. git diff 15dc8^! Oder git diff 15dc8^..15dc8) Funktionieren nicht, wenn Sie zsh verwenden und die Option extendedglob festgelegt haben. Sie können es auf eine der folgenden drei Arten beheben:

  1. unsetopt extendedglob (Und/oder aus .zshrc entfernen)

  2. setopt NO_NOMATCH (Und/oder setze es in .zshrc)

  3. entkomme dem Caret und knalle jedes Mal mit einem Backslash, z. git diff 15dc8\^\!

5
Ville
git diff 15dc8 15dce~1

~ 1 bedeutet "Eltern", ~ 2 "Großeltern" usw.

Die obige Lösung von Paul hat das getan, was ich mir erhofft hatte.

$ git diff HEAD^1

Es ist auch nützlich, Aliase wie die genannten hinzuzufügen. Wenn Sie Folgendes in den Abschnitt [alias] Ihrer ~/.gitconfig-Datei einfügen, können Sie den Unterschied zwischen head und previous mit der Kurzform anzeigen.

[alias]
    diff-last = diff HEAD^1

Wenn Sie dann $ git diff-last ausführen, erhalten Sie Ihr Ergebnis. Beachten Sie, dass dies auch include alle Änderungen betrifft, die Sie noch nicht festgeschrieben haben, sowie den Unterschied zwischen Festschreibungen. Wenn Sie ignorieren Änderungen vornehmen möchten, die Sie noch nicht festgeschrieben haben, können Sie diff verwenden, um HEAD direkt mit dem übergeordneten Element zu vergleichen:

$ git diff HEAD^1 HEAD
2

Verwendet Aliase, also beantwortet Ihre Frage nicht genau, aber ich finde diese nützlich, um das zu tun, was Sie vorhaben ...

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