Was sind die Unterschiede zwischen den folgenden Befehlen?:
git diff foo master # a
git diff foo..master # b
git diff foo...master # c
Das Diff-Handbuch spricht darüber:
Branchen vergleichen
$ git diff topic master <1> $ git diff topic..master <2> $ git diff topic...master <3>
- Änderungen zwischen den Tipps des Themas und den Hauptzweigen.
- Das gleiche wie oben.
- Änderungen, die seit dem Start des Themenzweigs im Hauptzweig aufgetreten sind.
ist mir aber nicht ganz klar.
..
und...
ingit diff
und ihre unterschiedlichen Bedeutungen ingit log
.Antworten:
Da ich diese Bilder bereits erstellt hatte, dachte ich, dass es sich lohnen könnte, sie in einer anderen Antwort zu verwenden, obwohl die Beschreibung des Unterschieds zwischen
..
(Punkt-Punkt) und...
(Punkt-Punkt-Punkt) im Wesentlichen dieselbe ist wie in der Antwort von manojlds .Der
git diff
Befehl¹ zeigt normalerweise nur den Unterschied zwischen den Zuständen des Baums zwischen genau zwei Punkten im Festschreibungsdiagramm an. Die..
und...
Notationen ingit diff
haben folgende Bedeutung:Mit anderen Worten,
git diff foo..bar
ist genau das gleiche wiegit diff foo bar
; beide zeigen Ihnen den Unterschied zwischen den Spitzen der beiden Zweigefoo
undbar
. Auf der anderen Seitegit diff foo...bar
wird Ihnen der Unterschied zwischen der "Zusammenführungsbasis" der beiden Zweige und der Spitze von angezeigtbar
. Die "Zusammenführungsbasis" ist normalerweise das letzte gemeinsame Commit zwischen diesen beiden Zweigen. Dieser Befehl zeigt Ihnen also die Änderungen an, an denen Ihre Arbeit vorgenommenbar
hat, und ignoriert alles, wasfoo
in der Zwischenzeit vorgenommen wurde.Das ist alles, was Sie über die
..
und...
Notationen in wissen müssengit diff
. Jedoch...... eine häufige Quelle der Verwirrung ist, dass
..
und...
bedeutet subtil unterschiedliche Dinge, wenn sie in einem Befehl verwendet werdengit log
, der eine Reihe von Commits als ein oder mehrere Argumente erwartet. (Diese Befehle werden alle verwendetgit rev-list
, um eine Liste von Commits anhand ihrer Argumente zu analysieren.)Die Bedeutung von
..
und...
fürgit log
kann wie folgt grafisch dargestellt werden:So
git rev-list foo..bar
zeigt Ihnen alles , was auf dem Zweigbar
, der nicht auch auf einem Ast istfoo
.git rev-list foo...bar
Zeigt Ihnen andererseits alle Commits an, die in einemfoo
oderbar
, aber nicht in beiden enthalten sind . Das dritte Diagramm zeigt nur, dass Sie, wenn Sie die beiden Zweige auflisten, die Commits erhalten, die sich in einem oder beiden befinden.Nun, ich finde das sowieso alles ein bisschen verwirrend und ich denke, die Commit-Diagramme helfen :)
¹ Ich sage nur "typisch", da beim Lösen von Zusammenführungskonflikten beispielsweise
git diff
eine Drei-Wege-Zusammenführung angezeigt wird.quelle
git diff
Diagramme, die ich später machen werde...
und...
Gefühl umgekehrt ingit diff
( im Vergleich zugit rev-list
)!git diff foo..bar
ist genau das gleiche wiegit diff foo bar
; beide zeigen Ihnen den Unterschied zwischen den Spitzen der beiden Zweige foo und bar." Was genau meinst du mit dem "Unterschied zwischen den Spitzen der beiden Zweige"?Meine konsolidierte Version des .. vs ... mit diff vs log
quelle
..
/...
stuff verwechselt wurden. Zum Beispiellog A...B
ist darin nicht klar, ob der Befehl den Schnittpunkt (weißer Teil des Diagramms) oder den Rest der AB-Vereinigung (grün) zurückgibt. Ohne festgelegte Operanden und mit nur einer Farbe wäre es mehr auf den Punkt.diff A..B
<->log A...B
, das heißt, nicht wirklich diff mit 2 Punkten, entsprechen log (!) Mit 3 Punkten? Oder gibt es einen Tippfehler im Bild. Wenn ich sehe, wie die Punkte farbcodiert sind, scheint mir ein Tippfehler im Bild zu sein. Die untere linke Ecke:log A...B
solltelog A..B
rechts sein (?). Und loggen Sie sich einfach rechts...
nicht ein..
.git diff foo master
Unterschied zwischen den obersten (Kopf-) Commits von foo und master.git diff foo..master
Eine andere Art, dasselbe zu tun.git diff foo...master
Unterscheiden Sie sich vom gemeinsamen Vorfahren (git merge-base foo master
) von foo und master bis zur Spitze des Masters. Mit anderen Worten, zeigt nur die Änderungen an, die der Hauptzweig seit seinem gemeinsamen Vorfahren mit foo vorgenommen hat.In diesem Beispiel von GitHub wird erklärt, wann die beiden zu verwenden sind:
quelle
zeigt die Unterschiede zwischen dem Thema und dem Hauptzweig zu diesem Zeitpunkt
Dies zeigt auch die Unterschiede zwischen dem Thema und dem Hauptzweig zu diesem Zeitpunkt
Dies zeigt alle Unterschiede zwischen dem Zeitpunkt, zu dem das Thema aus dem Zweig erstellt wurde, und danach
Die ersten beiden Befehle sind also gleich und der letzte zeigt nur eine breitere Ansicht im Diff-Verlauf
quelle
Das obere Bild entspricht dem unteren Diagrammbaum
Ein Bild sagt mehr als tausend Worte, der Unterschied zwischen
..
...
^
ist unten dargestellt.quelle