wake-up-neo.com

Unterschied zwischen git checkout - track Origin / branch und git checkout -b branch Origin / branch

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!

179
yorch

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:

  • erstelle/setze branch auf den Punkt, auf den sich Origin/branch bezieht.
  • erstellen Sie den Zweig 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 Und branch.<name>.merge) , damit git pull ordnungsgemäß aus dem Zweig für die Fernverfolgung zusammengeführt wird.
Dieses Verhalten kann über das globale Konfigurations-Flag branch.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:

  • sag git, dass er die Beziehung zwischen den beiden Zweigen in git status und git branch -v anzeigen soll.
  • weist an 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? ".

241
VonC

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

28
Robert Siemer

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.

5
Pat