588 Stimmen

Was sind die Unterschiede zwischen dem Doppelpunkt "..." und dem Dreifachpunkt "..." in Git-Commit-Bereichen?

Einige Git-Befehle nehmen Commit-Bereiche an und eine gültige Syntax ist es, zwei Commit-Namen mit zwei Punkten zu trennen .. , und eine andere Syntax verwendet drei Punkte ... .

Was sind die Unterschiede zwischen den beiden?

963voto

Verwendung von Commit-Bereichen mit Git Log

Wenn Sie Commit-Bereiche verwenden wie .. y ... con git log Der Unterschied zwischen ihnen besteht darin, dass für die Zweige A und B,

git log A..B

wird Ihnen zeigen alle Übertragungen, die B hat und die A nicht hat , während

git log A...B

wird Ihnen zeigen beide die Commits, die A hat und die B nicht hat, und die Commits, die B hat und die A nicht hat, oder mit anderen Worten, werden alle Commits herausgefiltert, die sowohl A als auch B gemeinsam haben, so dass nur die Commits angezeigt werden, die sie nicht beide teilen .

Visualisierung mit Venn-Diagrammen und Commit Trees

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

 "git log A..B" diagramTree 1

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

 "git log A...B" diagramTree 2

Herstellung der Triple-Dot Commit Range ... Mehr Nützliches

Sie können den Triple-Dot-Commit-Bereich ... in einem Log-Befehl nützlicher, indem man die --left-right um anzuzeigen, welche Commits zu welchem Branch 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 die Commits, die zu master sind mit dem Präfix < , während Commits, die zu origin/master sind mit dem Präfix > .

Verwendung von Commit-Bereichen mit Git Diff

Eines Tages werde ich vielleicht meine eigene Erklärung hinzufügen, wie die Commit-Bereiche mit git diff aber fürs Erste sollten Sie sich vielleicht die folgenden Seiten ansehen Was sind die Unterschiede zwischen dem Doppelpunkt "..." und dem Dreifachpunkt "..." in Git diff commit-Bereichen? .

Siehe auch

294voto

Pieter Punkte 3950

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

Um Commits auszuschließen, die von einem Commit aus erreichbar sind, wird die Präfix-Notation ^ verwendet. Z.B. ^r1 r2 bedeutet Commits, die von r2 aus erreichbar sind, schließt aber diejenigen aus, die von r1 aus erreichbar sind.

Dieser Vorgang kommt so oft vor dass es eine Kurzschrift dafür gibt. Wenn Sie zwei Commits r1 und r2 haben (benannt nach der Syntax, die in REVISIONEN ANGEBEN oben erklärt wurde), können Sie nach Commits fragen, die erreichbar sind von r2 erreichbar sind, mit Ausnahme derjenigen, die die von r1 aus erreichbar sind, mit "^r1 r2" und es kann als "r1..r2" geschrieben werden.

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

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

In der diff Fall ist es in der 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.

Das ist ein bisschen unscharf. Im Grunde bedeutet es, dass es nur die Unterschiede in diesem Zweig im Vergleich zu einem anderen Zweig anzeigt: es sucht nach dem letzten gemeinsamen Commit mit dem ersten Commit, den Sie ihm gegeben haben, und vergleicht dann den zweiten Commit mit diesem. Es ist ein einfacher Weg, um zu sehen, welche Änderungen in diesem Zweig im Vergleich zu diesem Zweig gemacht wurden, ohne nur die Änderungen in diesem Zweig zu beachten.

Le site .. ist etwas einfacher: In der git-diff Fall ist es dasselbe wie bei einer git diff A B und vergleicht einfach A mit B. In der log Fall werden alle Übertragungen angezeigt, die sich in B, aber nicht in A befinden.

30voto

TTT Punkte 13477

Ich denke, die größte Verwirrung über zwei Punkte im Vergleich zu drei Punkten entsteht dadurch, dass bei der Verwendung mit git diff Es ist gewissermaßen das Gegenteil von bei Verwendung mit git log .

Bitte lesen Sie die anderen Antworten, die aktuelle Dokumentation oder die zahlreichen Blogeinträge zum Thema genau Details, aber ich finde, dass diese einfachen Aussagen gut funktionieren, um das Richtige zu vermitteln Idee :

git log  A..B   # Show me commits only on B.
git log  A...B  # Show me commits only on A or only on B.
git diff A..B   # Show me changes only on A or only on B.
git diff A...B  # Show me changes only on B.

12voto

Alex Punnen Punkte 3960

Das ist ein bisschen verwirrend = Hier ist also ein Beispiel, wie es tatsächlich für diesen Fluss ist

      A---B---C topic
     /
D---E---F---G master

https://github.com/alexcpn/gitdiffs/pull/2/commits https://github.com/alexcpn/gitdiffs/pull/1/commits

Git-Log-Verhalten

1

> git log --oneline --graph Thema...main
* 9411a8b (HEAD -> main) G
* 3a567aa F
* aad429f (Thema) C
* 6b1eb5a B
* d65c129 A

Thema
D
E
A
B
C

Haupt
D
E
F
G

In Thema und Inhalt, aber nicht in
beide

2

git log --oneline --graph main...topic
* 9411a8b (HEAD -> main) G
* 3a567aa F
* aad429f (Thema) C
* 6b1eb5a B
* d65c129 A

Thema
D
E
A
B
C

Haupt
D
E
F
G

Gleich wie oben

3

git log --oneline --graph topic..main
* 9411a8b (HEAD -> main) G
* 3a567aa F

Thema
D
E
A
B
C

Haupt
D
E
F
G

Im Hauptteil, aber nicht im Thema

4

git log --oneline --graph main..topic
* aad429f (Thema) C
* 6b1eb5a B
* d65c129 A

Thema
D
E
A
B
C

Haupt
D
E
F
G

Im Thema, aber nicht in der Hauptsache

Git Diff-Verhalten

1

git diff topic..main
D
E
-A
-B
-C
+F
+G

Thema
D
E
A
B
C

Haupt
D
E
F
G

was ist in der Hauptsache
was nicht im Hauptvergleich enthalten ist
zum Thema

2

git diff main..topic
D
E
-F
-G
+A
+B

+C

Thema
D
E
A
B
C

Haupt
D
E
F
G

was im Thema
was nicht zum Thema gehört im Vergleich zu
Haupt

3

git diff main...topic
D
E (hier kann ein Zeilenumbruch auftreten)
+A
+B
+C

Thema
D
E
A
B
C

Haupt
D
E
F
G

Im Thema, aber nicht in der Hauptsache

4

git diff topic...main
D
E
+F
+G

Thema
D
E
A
B
C

Haupt
D
E
F
G

In der Hauptsache, aber nicht im Thema

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X