Kennt jemand den Unterschied zwischen diesen beiden Befehlen zum Umschalten und Verfolgen eines entfernten Zweigs?
git checkout -b branch Origin/branch
git checkout --track Origin/branch
Ich denke, beide behalten den Überblick über den entfernten Zweig, damit ich meine Änderungen in den Zweig von Origin übertragen kann, oder?
Gibt es praktische Unterschiede?
Vielen Dank!
Die beiden Befehle haben den gleichen Effekt ( dank Robert Siemers Antwort für den Hinweis ).
Der praktische Unterschied ergibt sich, wenn ein lokaler Zweig mit dem Namen anders verwendet wird:
git checkout -b mybranch Origin/abranch
Erstellt mybranch
und verfolgt Origin/abranch
git checkout --track Origin/abranch
Erstellt nur 'abranch
', keinen Zweig mit einem anderen Namen.(Das heißt, wie kommentiert von Sebastian Graf , wenn der lokale Zweig schon existiert nicht.
Wenn es so wäre, bräuchten Sie git checkout -B abranch Origin/abranch
)
Hinweis: Mit Git 2.23 (Q3 2019) würde dies den Befehl neuer Befehl git switch
verwenden:
git switch -c <branch> --track <remote>/<branch>
Wenn der Zweig in mehreren Remotes vorhanden ist und einer von ihnen durch die Konfigurationsvariable
checkout.defaultRemote
Benannt ist, wird dieser Zweig zur Disambiguierung verwendet, auch wenn der<branch>
Nicht eindeutig ist alle fernbedienungen.
Stellen Sie es auf z.checkout.defaultRemote=Origin
, Um entfernte Zweige immer von dort aus auszuchecken, wenn<branch>
Nicht eindeutig ist, aber auf der 'Origin'-Fernbedienung existiert.
Hier ist '-c
' Das neue '-b
'.
Zunächst einige Hintergrundinformationen: Nachverfolgung bedeutet, dass der Upstream eines lokalen Zweigs auf einen Remote-Zweig festgelegt ist:
# git config branch.<branch-name>.remote Origin
# git config branch.<branch-name>.merge refs/heads/branch
git checkout -b branch Origin/branch
Wird:
branch
auf den Punkt, auf den sich Origin/branch
bezieht.branch
(mit git branch
) und verfolgen Sie den Remote-Tracking-Zweig Origin/branch
.Wenn ein lokaler Zweig von einem Remote-Tracking-Zweig gestartet wird, richtet Git den Zweig ein (insbesondere die Konfigurationseinträge
branch.<name>.remote
Undbranch.<name>.merge
) , damitgit pull
ordnungsgemäß aus dem Zweig für die Fernverfolgung zusammengeführt wird.
Dieses Verhalten kann über das globale Konfigurations-Flagbranch.autosetupmerge
Geändert werden. Diese Einstellung kann mit den Optionen--track
Und--no-track
Überschrieben und später mit git branch--set-upstream-to
Geändert werden.
Und git checkout --track Origin/branch
Macht dasselbe wie git branch --set-upstream-to
):
# or, since 1.7.0
git branch --set-upstream upstream/branch branch
# or, since 1.8.0 (October 2012)
git branch --set-upstream-to upstream/branch branch
# the short version remains the same:
git branch -u upstream/branch branch
Es würde auch den Upstream für 'branch
' setzen.
(Hinweis: git1.8.0 wird git branch --set-upstream
Veralten und durch git branch -u|--set-upstream-to
Ersetzen: siehe git1.8.0-rc1 announce )
Wenn eine Upstream-Niederlassung für eine lokale Niederlassung registriert ist, gilt Folgendes:
git status
und git branch -v
anzeigen soll.git pull
ohne Argumente vom Upstream zu ziehen, wenn der neue Zweig ausgecheckt ist .Weitere Informationen finden Sie unter " Wie kann ein vorhandener Git-Zweig zu einem entfernten Zweig gemacht werden? ".
Es gibt überhaupt keinen Unterschied!
1) git checkout -b branch Origin/branch
Wenn es keinen --track
Und keinen --no-track
Gibt, wird standardmäßig --track
Angenommen. Die Voreinstellung kann mit der Einstellung branch.autosetupmerge
Geändert werden.
In der Tat verhält sich 1) wie git checkout -b branch --track Origin/branch
.
2) git checkout --track Origin/branch
"Als Annehmlichkeit" impliziert --track
Ohne -b
-b
Und das Argument für -b
Wird als "Zweig" angenommen. Das Erraten wird durch die Konfigurationsvariable remote.Origin.fetch
Gesteuert.
Tatsächlich verhält sich 2) wie git checkout -b branch --track Origin/branch
.
Wie Sie sehen können: kein Unterschied.
Aber es wird noch besser:
3) git checkout branch
ist auch gleichbedeutend mit git checkout -b branch --track Origin/branch
, wenn "branch" noch nicht existiert, aber "Origin/branch"1.
Alle drei Befehle setzen den "Upstream" von "branch" auf "Origin/branch" (oder schlagen fehl).
Upstream wird als Bezugspunkt für argumentlose git status
, git Push
, git merge
Und damit git pull
Verwendet (wenn so konfiguriert) der Standard)).
Z.B. git status
Gibt an, wie weit Sie vor oder hinter dem Upstream sind, sofern einer konfiguriert ist.
git Push
Ist standardmäßig so konfiguriert, dass der aktuelle Zweig in den Upstream verschoben wird2 seit git 2.0.
1 ... und wenn "Origin" die einzige Ferne ist, die "Branch" hat
2 Durch die Standardeinstellung (mit dem Namen "einfach") wird auch erzwungen, dass beide Zweignamen gleich sind
Das Buch scheint darauf hinzudeuten, dass diese Befehle den gleichen Effekt haben:
Der einfache Fall ist das Beispiel, das Sie gerade gesehen haben und das git checkout -b [branch] [remotename]/[branch] ausführt. Wenn Sie Git Version 1.6.2 oder höher haben, können Sie auch die Kurzform --track verwenden:
$ git checkout --track Origin/serverfix
Branch serverfix set up to track remote branch serverfix from Origin.
Switched to a new branch 'serverfix'
Um eine lokale Verzweigung mit einem anderen Namen als die entfernte Verzweigung einzurichten, können Sie problemlos die erste Version mit einem anderen Namen für die lokale Verzweigung verwenden:
$ git checkout -b sf Origin/serverfix
Dies ist besonders praktisch, wenn Ihre Bash- oder Oh-My-Zsh-Git-Vervollständigungen den Namen Origin/serverfix
Für Sie ermitteln können - fügen Sie einfach --track
(Oder -t
) Hinzu, und Sie sind dabei Ihren Weg.