it-swarm.com.de

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

Bei einigen Git-Befehlen werden Festschreibungsbereiche verwendet. Eine gültige Syntax besteht darin, zwei Festschreibungsnamen durch zwei Punkte zu trennen. .. und eine andere Syntax verwendet drei Punkte ....

Was sind die Unterschiede zwischen den beiden?

356
Pat Notz

Es hängt davon ab, ob Sie einen Befehl log oder einen Befehl diff verwenden. In dem Fall log ist es in dem Fall man git-rev-parse Dokumentation:

Um von einem Commit erreichbare Commits auszuschließen, wird eine Präfixnotation verwendet. Z.B. ^ r1 r2 bedeutet Commits, die von r2 aus erreichbar sind, schließt jedoch diejenigen aus, die von r1 aus erreichbar sind.

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

Eine ähnliche Notation "r1 ... r2" wird als symmetrische Differenz von r1 und r2 bezeichnet und als "r1 r2 - not $ (Git-Merge-Base - all r1 r2)" definiert. Es ist die Menge von Commits, die entweder von r1 oder r2 aus erreichbar sind, aber nicht von beiden.

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

Im diff Fall ist es im man git-diff Dokumentation:

  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 unscharf. 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 Commit gesucht, das Sie angegeben haben, und das zweite Commit wird danach verglichen. Auf einfache Weise können Sie feststellen, welche Änderungen in diesem Zweig im Vergleich zu diesem Zweig vorgenommen wurden, ohne Änderungen nur in diesem Zweig zu berücksichtigen.

Das .. ist etwas einfacher: In der git-diff Fall, es ist das gleiche wie ein git diff A B und unterscheidet nur A gegen B. Im Fall log werden alle Festschreibungen angezeigt, die in B, aber nicht in A enthalten sind.

222
Pieter

Verwenden von Festschreibungsbereichen mit Git Log

Wenn Sie Festschreibungsbereiche wie .. Und ... Mit git log Verwenden, besteht der Unterschied zwischen ihnen 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 beides die Commits, die A und B haben, und die Commits, die B hat dass A nicht hat, oder mit anderen Worten , es filtert alle Commits heraus, die sowohl A als auch B gemeinsam haben, und zeigt somit nur die Commits an, die sie nicht tun beide teilen .

Visualisierung mit Venn Diagrams & Commit Trees

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

"git log A..B" diagramTree 1

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

"git log A...B" diagramTree 2

Den Triple-Dot-Commit-Bereich ... Nützlicher machen

Sie können den Dreifachpunkt-Festschreibungsbereich ... In einem Protokollbefehl nützlicher machen, indem Sie die Option --left-right Verwenden, um anzuzeigen, welche Festschreibungen 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 Commits, die zu master gehören, < Vorangestellt wird, während Commits, die zu Origin/master Gehören, > Vorangestellt wird. .

Verwenden von Festschreibungsbereichen mit Git Diff

Eines Tages könnte ich meine eigene Erklärung hinzufügen, wie die Festschreibungsbereiche mit git diff Funktionieren, aber für den Moment möchten Sie vielleicht Folgendes überprüfen: Was sind die Unterschiede zwischen dem Doppelpunkt ".." und dem Dreifachpunkt ".."?) Punkt "..." in Git Diff Commit Bereichen? .

Siehe auch

560
user456814