Was sind die Unterschiede zwischen Doppelpunkt ".." und Dreifachpunkt "..." in Git-Festschreibungsbereichen?

Antworten:

249

Dies hängt davon ab, ob Sie einen logBefehl oder einen diffBefehl verwenden. In dem logFall steht es in der man git-rev-parseDokumentation:

Um festschreibbare Commits von einem Commit auszuschließen, wird eine Präfixnotation verwendet. Zum Beispiel bedeutet ^ r1 r2 Commits, die von r2 aus erreichbar sind, aber diejenigen ausschließen, die von r1 aus erreichbar sind.

Diese Set-Operation erscheint so oft, dass es eine Abkürzung dafür gibt. Wenn Sie zwei Commits r1 und r2 haben (benannt nach der Syntax, die in SPECIFYING REVISIONS oben erläutert wurde), können Sie Commits anfordern, die von r2 aus erreichbar sind, mit Ausnahme derjenigen, die von r1 über "^ r1 r2" erreichbar sind, und es kann geschrieben werden als "r1..r2".

Eine ähnliche Notation "r1 ... r2" heißt symmetrische Differenz von r1 und r2 und ist definiert als "r1 r2 --not $ (git merge-base --all r1 r2)". Es ist die Menge von Commits, die entweder von r1 oder r2 aus erreichbar sind, aber nicht von beiden.

Dies bedeutet im Grunde, dass Sie alle Commits erhalten, die sich in einem der beiden Zweige befinden, jedoch nicht in beiden.

In dem diffFall steht es in der man git-diffDokumentation:

  git diff [--options] <commit>...<commit> [--] [<path>...]

      This form is to view the changes on the branch containing and up to
      the second <commit>, starting at a common ancestor of both
      <commit>. "git diff A...B" is equivalent to "git diff
      $(git-merge-base A B) B". You can omit any one of <commit>, which
      has the same effect as using HEAD instead.

Welches ist ein bisschen verschwommen. Grundsätzlich bedeutet dies, dass nur die Unterschiede in diesem Zweig im Vergleich zu einem anderen Zweig angezeigt werden: Es wird nach dem letzten gemeinsamen Commit mit dem ersten Committish gesucht, das Sie ihm gegeben haben, und dann nach dem zweiten Commitish. Auf diese Weise können Sie auf einfache Weise feststellen, welche Änderungen in diesem Zweig im Vergleich zu diesem Zweig vorgenommen wurden, ohne nur Änderungen in diesem Zweig zu berücksichtigen.

Das ..ist etwas einfacher: In dem git-diffFall ist es dasselbe wie a git diff A Bund unterscheidet nur A von B. In dem logFall werden alle Commits angezeigt , die in B, aber nicht in A sind.

Pieter
quelle
30
Es ist ziemlich lächerlich, wie die Bedeutung von ..und ...genau gegen log und diff getauscht wird: log A..BÄnderungen von Merge Base zu B, was diff A...B
genau
1
@phiresky Ja, das ist wirklich schlechte Benutzerfreundlichkeit. Ich empfehle, die Punktnotationen nicht für zu verwenden git diff.
wisbucky
2
Bedeutet das A...B== A..B + B..A?
Danon
2
@ Danon git logdafür ist absolut ja
Maoizm
657

Verwenden von Commit-Bereichen mit Git Log

Wenn Sie Festschreibungsbereiche wie ..und ...mit verwenden git log, besteht der Unterschied zwischen diesen darin, dass für die Zweige A und B

git log A..B

zeigt Ihnen alle Commits, die B hat, die A nicht hat , während

git log A...B

zeigt Ihnen sowohl die Commits, die A hat und die B nicht hat, als auch die Commits, die B hat, die A nicht hat, oder mit anderen Worten, es filtert alle Commits heraus, die sowohl A als auch B gemeinsam haben. Dadurch werden nur die Commits angezeigt, die nicht beide gemeinsam nutzen .

Visualisierung mit Venn-Diagrammen und Commit-Bäumen

Hier ist eine visuelle Darstellung von git log A..B. Die Commits in Zweig B, die in A nicht vorhanden sind, werden vom Commit-Bereich zurückgegeben und im Venn-Diagramm rot hervorgehoben und im Commit-Baum blau eingekreist:

 Diagramm "Git Log A..B"Baum 1

Dies sind die Diagramme für git log A...B. Beachten Sie, dass die Commits, die von beiden Zweigen gemeinsam genutzt werden, vom Befehl nicht zurückgegeben werden:

 Diagramm "Git Log A ... B"Baum 2

Machen die Triple-Punkt - Commit - Strecke ...Mehr Nützliche

Sie können den Triple-Dot-Commit-Bereich ...in einem Protokollbefehl nützlicher machen, indem Sie die --left-rightOption verwenden, um anzuzeigen, welche Commits zu welchem ​​Zweig gehören:

$ git log --oneline --decorate --left-right --graph master...origin/master
< 1794bee (HEAD, master) Derp some more
> 6e6ce69 (origin/master, origin/HEAD) Add hello.txt

In der obigen Ausgabe sehen Sie, dass den zugehörigen Commits ein masterPräfix vorangestellt ist <, während den zugehörigen Commits ein origin/masterPräfix vorangestellt ist >.

Verwenden von Commit-Bereichen mit Git Diff

Eines Tages könnte ich meine eigene Erklärung hinzufügen, wie die Festschreibungsbereiche funktionieren git diff, aber im Moment möchten Sie vielleicht herausfinden, was die Unterschiede zwischen Doppelpunkt ".." und Dreifachpunkt "..." in Git diff-Festschreibung sind Bereiche? .

Siehe auch

Gemeinschaft
quelle
35
Diese Antwort erklärt den Unterschied tatsächlich mit einem kurzen Text, Beispielen und Bildern. Ich mag es viel besser als die derzeit am besten gewählte Antwort, die nur die unklare Dokumentation zitiert. (tl; dr dank dieser Antwort verstehe ich tatsächlich den Unterschied.)
Aerique
4
@ Cupcake könntest du die Bedeutung hinzufügen ... in git diff?
Marius
1
@Marius Eigentlich, jetzt, wo Sie es ansprechen, werde ich für zukünftige Leser wie Sie auf diese andere Frage in meiner Antwort verweisen.
2
Ist das nicht das Gegenteil? dig diff a..b ist ALL diffs oder im Grunde dasselbe wie git diff a b. Während git dif a ... b NUR Änderungen sind, die b seit der Verzweigung von a vorgenommen hat.
Wejrowski
2
Zumindest für Git Log. Für Git Diff sind die Dinge vielleicht umgekehrt: stackoverflow.com/questions/7251477/…
Benjamin Atkin