Die beiden Befehle haben den gleichen Effekt ( dank der Antwort von Robert Siemer für den Hinweis ).
Der praktische Unterschied ergibt sich aus der Verwendung eines lokalen Zweigs mit einem anderen Namen :
git checkout -b mybranch origin/abranch
wird erstellen mybranch
und verfolgenorigin/abranch
git checkout --track origin/abranch
erstellt nur ' abranch
', keinen Zweig mit einem anderen Namen.
(Das heißt, wie von Sebastian Graf kommentiert , wenn die lokale Niederlassung noch nicht existiert hätte.
Wenn dies der Fall wäre, müssten Sie git checkout -B abranch origin/abranch
)
Hinweis: Mit Git 2.23 (Q3 2019) würde der neue Befehl verwendetgit switch
:
git switch -c <branch> --track <remote>/<branch>
Wenn der Zweig in mehreren Fernbedienungen vorhanden ist und eine davon von der checkout.defaultRemote
Konfigurationsvariablen benannt wird, verwenden wir diese zum Zwecke der Begriffsklärung, auch wenn die <branch>
nicht für alle Fernbedienungen eindeutig ist.
Setzen Sie es auf z. B., checkout.defaultRemote=origin
um entfernte Zweige von dort immer auszuchecken, wenn dies nicht <branch>
eindeutig ist, aber auf der 'Ursprungs'-Fernbedienung vorhanden ist.
Hier -c
ist das Neue -b
.
Zunächst einige Hintergrundinformationen: Tracking bedeutet, dass für einen lokalen Zweig der Upstream auf einen Remote-Zweig eingestellt ist:
# git config branch.<branch-name>.remote origin
# git config branch.<branch-name>.merge refs/heads/branch
git checkout -b branch origin/branch
werden:
- Erstellen / Zurücksetzen
branch
auf den Punkt, auf den verwiesen wird origin/branch
.
- 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 (insbesondere die Einträge branch.<name>.remote
und die branch.<name>.merge
Konfigurationseinträge) so ein, dass er git pull
ordnungsgemäß aus dem Remote-Tracking-Zweig zusammengeführt wird.
Dieses Verhalten kann über das globale branch.autosetupmerge
Konfigurationsflag geändert werden . Diese Einstellung kann durch die Verwendung des außer Kraft gesetzt werden --track
und --no-track
Optionen, und später mit git Zweig geändert --set-upstream-to
.
Und git checkout --track origin/branch
wird das Gleiche tun 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 veraltet sein git branch --set-upstream
und durch Folgendes ersetztgit branch -u|--set-upstream-to
: siehe git1.8.0-rc1-Ankündigung )
Wenn eine vorgelagerte Niederlassung für eine lokale Niederlassung registriert ist, gilt Folgendes:
- Sagen Sie git, dass er die Beziehung zwischen den beiden Zweigen in
git status
und zeigen sollgit branch -v
.
- Weist
git pull
ohne Argumente an, aus dem Upstream zu ziehen, wenn der neue Zweig ausgecheckt wird .
Weitere Informationen finden Sie unter " Wie machen Sie einen vorhandenen Git-Zweig zu einem Remote-Zweig? ".
git pull
, während einige Zweige nach einem entfernten Zweig fragten, aus dem ich ziehen konnte. Es stellt sich heraus, dass git weitergeht undbranch.<BNAME>.remote=origin
zur lokalen gitconfig hinzufügt, wenn Sie zum ersten Mal einen von Ihrem Peer erstellten Remote-Zweig auschecken. Womit Sie dann ausstellen könnengit pull
. Wenn Sie jedoch derjenige sind, der den Zweig erstelltgit checkout -b BNAME
, weiß git das natürlich nicht. Sie sollten also die Fernbedienung angeben.If <branch>
wird nicht gefunden, aber es gibt einen Tracking-Zweig in genau einer Fernbedienung (nennen Sie es<remote>
) mit einem passenden Namen, der als äquivalent zu$ git checkout -b <branch> --track <remote>/<branch>
"branch.autoSetupMerge
vonalways
führt einfach das aus, worüber wir sprechen. Diese Einstellung ist standardmäßig aktiviert. Diestrue
bedeutet, dass die Nachverfolgung nur beim Auschecken eines Remote-Zweigs durchgeführt wird.true
richtet kein Tracking für lokal erstellte Zweige ein.Es gibt überhaupt keinen Unterschied!
1)
git checkout -b branch origin/branch
Wenn nein
--track
und nein vorhanden ist--no-track
,--track
wird dies als Standard angenommen. Die Standardeinstellung kann mit der Einstellung geändert werdenbranch.autosetupmerge
.In der Tat verhält sich 1) wie
git checkout -b branch --track origin/branch
.2)
git checkout --track origin/branch
"Aus Bequemlichkeit",
--track
ohne zu-b
implizieren-b
und das Argument zu-b
wird als "Zweig" vermutet. Das Erraten wird von der Konfigurationsvariablen gesteuertremote.origin.fetch
.In der Tat 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 äquivalent zu,
git checkout -b branch --track origin/branch
wenn "Zweig" noch nicht existiert, "Ursprung / Zweig" jedoch 1 .Alle drei Befehle setzen den "Upstream" von "Branch" auf "Origin / Branch" (oder sie schlagen fehl).
Upstream wird als Bezugspunkt Argumentationslos verwendet
git status
,git push
,git merge
und somitgit pull
(wenn so konfiguriert ist ( dies ist die Standardeinstellung oder fast der Standard)).ZB
git status
sagt Ihnen, wie weit Sie vor oder vor dem Upstream sind, wenn einer konfiguriert ist.git push
ist so konfiguriert, dass der aktuelle Zweig seit Git 2.0 standardmäßig 2 nach oben verschoben wird.1 ... und wenn "Ursprung" die einzige Fernbedienung mit "Zweig"
2 ist, erzwingt die Standardeinstellung (mit dem Namen "einfach") auch, dass beide Zweignamen gleich sind
quelle
Das Buch scheint darauf hinzudeuten, dass diese Befehle den gleichen Effekt haben:
Dies ist besonders praktisch, wenn Ihre Bash- oder Oh-My-Zsh-Git-Vervollständigungen den
origin/serverfix
Namen für Sie ziehen können - fügen Sie einfach--track
(oder-t
) hinzu und Sie sind auf dem Weg.quelle
Mit diesem Befehl können Sie keinen neuen Zweig erstellen
Wenn Sie Änderungen haben, die nicht bereitgestellt werden.
Hier ist ein Beispiel:
Mit dem folgenden
git checkout -b
Befehl können Sie jedoch problemlos einen neuen Zweig mit nicht bereitgestellten Änderungen erstellen :quelle
origin/branch
) dienenorigin/new-branch
stattorigin/branch
. Ist dir das bewusst?