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?
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?
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 .
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:
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:
...
Mehr NützlichesSie 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 >
.
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? .
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.
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.
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 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.