Sagen wir, wenn wir aus dem master
Zweig einen foo
Zweig und einen bar
Zweig erstellen.
Nehmen wir nun an, wir erstellen einen Zweig wah
basierend auf foo
, bar
oder master
:
oder
%Vor%oder
%Vor% Gibt es überhaupt Unterschiede, ob wah
auf foo
, bar
oder master
basiert? Gibt es irgendwelche Git-Befehle, die sagen können, dass sie auf foo
, bar
oder master
basieren?
Es gibt keinen Unterschied . Zweige sind nur Referenzen, die auf Commits verweisen. Ich habe den Quellcode nicht überprüft, aber ich denke, man kann davon ausgehen, dass die Referenzen bei der Erstellung einer Verzweigung letztendlich zu Commit-Objekten dereferenziert werden.
Also, wenn du es tust
%Vor% Die Zweige foo
, bar
und master
beziehen sich alle auf das gleiche Commit-Objekt.
Somit ist das Folgende auch gleichwertig, da wah
sich auch auf das gleiche Commit-Objekt bezieht:
Sie können dies leicht überprüfen, indem Sie einfach den ersten Protokolleintrag für jede Verzweigung abrufen ( Notieren Sie die Festschreibungs-ID für jede ):
%Vor%Sie können dies auch überprüfen, indem Sie nur die Referenzdateien selbst betrachten. Jeder enthält eine einzelne Zeile, die den Commit sha enthält, auf den sie sich gerade beziehen:
%Vor% Nein, in dem Sinne, dass wah
auf denselben Commit zeigt, egal aus welchem der drei Zweige er in diesem Fall erstellt wurde.
Aber ja, weil git verfolgt, welche Zweige von welchen anderen stromaufwärts liegen. Wenn es darum geht, den Zweig wah
mit seinem Zweig 'upstream' zu synchronisieren, wird git 'wollen', Commits auf den Zweig zu synchronisieren, der als Upstream gilt. Mit folgendem Befehl:
... wenn wah
von master
abgezweigt wurde, möchte der Push Commits senden an (d. h. mit fusionieren) master
; falls abgezweigt foo
, dann foo
; und so weiter.
Natürlich wird, ob dies erlaubt ist oder nicht, durch eine andere Konfigurationseinstellung gesteuert: push.default
. Wenn push.default
auf upstream
gesetzt ist, funktioniert es wie oben beschrieben. Wenn es auf simple
oder matching
festgelegt ist, schlägt der Push fehl, indem Sie angeben, dass Sie Zweige nur implizit in andere Zweige mit demselben Namen verschieben können.
Eine einfache Möglichkeit, git zu bekommen, welche Zweige auf welchen anderen basieren, ist mit dem folgenden Befehl:
%Vor%Dies zeigt Ihnen jeden Zweig und seinen Zweig davor in Klammern.
Das Ergebnis ist also, dass intern ja git genau verfolgt, welchen spezifischen Zweig Sie abgezweigt haben, und dieses Wissen in einer ganz bestimmten Situation anwendet, wie oben beschrieben.
Um ein wenig zur zugrunde liegenden Frage zu erweitern: commits wissen nicht, in welchem Zweig sie erstellt wurden . Es ist nicht einmal notwendig, dass ein Commit in irgendeinem Zweig überhaupt durchgeführt wurde.
Zweige sind nichts anderes als billige Beschriftungen für die Blätter des Verlaufsgraphen - und Zweige zeigen nur beim Commit, nicht umgekehrt. Wenn Sie sich in master
befinden und ein neues Commit durchführen, verschiebt master
auf das neue Commit, und nichts verbindet das vorherige Commit mit master
, außer dass es zufällig das übergeordnete Objekt ist das neue Commit. *
(* Ich lüge ein wenig; der Reflog erinnert sich an die letzten commits master
verwendet , auf die verwiesen wird, was nützlich ist, wenn zB eine Rebase schrecklich schief gegangen ist Wofür die @{1}
-Syntax ist. Aber das ist vorübergehend und wird nicht mit anderen geteilt.)
Der Befehl:
%Vor% erstellt ab dem angegebenen Commit einen neuen Zweig. Es spielt keine Rolle, ob existing-commit
über einen Zweignamen, einen Tag-Namen oder einen sha1-Hash angegeben wird. Alles, was zählt, ist, auf was es sich bezieht.
Sie haben zuvor zwei Zweige namens foo
und bar
erstellt. Ein Zweigname bezieht sich auf den aktuellen Tipp des angegebenen Zweigs (im Gegensatz zu einem Tag-Namen, der sich auf einen bestimmten Commit bezieht und sich nur ändert, wenn Sie das Tag neu definieren). Da Sie keine neuen Commits zu foo
oder bar
hinzugefügt haben, beziehen sich beide Namen auf das gleiche Commit und auf einen der drei folgenden Befehle:
macht genau das Gleiche. (Sie können sich auch auf den gleichen Commit mit seinem SHA1-Hash beziehen.)
(Wenn Sie andererseits dem Zweig foo
ein neues Commit hinzugefügt hätten, würde das Erstellen eines neuen Zweigs über foo
den Zweig wah
a anders als machen wenn es oben auf bar
erstellt wurde.)
Tags und Links git