Gibt es Unterschiede zwischen dem Erstellen eines Zweigs basierend auf dem Zweig foo oder bar, wenn sie auf denselben Commit in Git verweisen?

8

Sagen wir, wenn wir aus dem master Zweig einen foo Zweig und einen bar Zweig erstellen.

%Vor%

Nehmen wir nun an, wir erstellen einen Zweig wah basierend auf foo , bar oder master :

%Vor%

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?

    
太極者無極而生 10.05.2014, 19:31
quelle

4 Antworten

6

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:

%Vor%

Überprüfen, ob Zweigverweise nur Beschriftungen für Commits sind

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%

Zusätzliches Lesen

user456814 10.05.2014, 19:47
quelle
2

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:

%Vor%

... 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.

    
Yawar 10.05.2014 22:30
quelle
1

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.)

    
Eevee 10.05.2014 19:53
quelle
1

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:

%Vor%

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.)

    
Keith Thompson 10.05.2014 21:56
quelle

Tags und Links