Oba polecenia mają ten sam efekt ( dzięki odpowiedzi Roberta Siemera za wskazanie go ).
Praktyczna różnica wynika z używania oddziału lokalnego o innej nazwie :
git checkout -b mybranch origin/abranch
utworzy mybranch
i będzie śledzićorigin/abranch
git checkout --track origin/abranch
utworzy tylko „ abranch
”, a nie gałąź o innej nazwie.
(To znaczy, jak skomentował przez Sebastiana Graf , jeśli lokalny oddział czy nie istnieje.
Jeśli tak, to trzeba git checkout -B abranch origin/abranch
)
Uwaga: w przypadku Git 2.23 (III kwartał 2019 r.) Można by użyć nowego poleceniagit switch
:
git switch -c <branch> --track <remote>/<branch>
Jeśli gałąź istnieje w wielu pilotach, a jeden z nich jest nazwany przez checkout.defaultRemote
zmienną konfiguracyjną, użyjemy tego do celów ujednoznacznienia, nawet jeśli <branch>
nie jest on unikalny dla wszystkich pilotów.
Ustaw na np., checkout.defaultRemote=origin
Aby zawsze kasował zdalne gałęzie stamtąd, jeśli <branch>
jest niejednoznaczny, ale istnieje na zdalnym źródle.
Tutaj -c
„jest nowy -b
”.
Po pierwsze, pewne tło: Śledzenie oznacza, że gałąź lokalna ma swój górny segment ustawiony na gałąź zdalną:
# git config branch.<branch-name>.remote origin
# git config branch.<branch-name>.merge refs/heads/branch
git checkout -b branch origin/branch
będzie:
- utwórz / zresetuj
branch
do punktu, do którego odnosi się origin/branch
.
- utwórz gałąź
branch
(za pomocą git branch
) i śledź gałąź zdalnego śledzenia origin/branch
.
Kiedy gałąź lokalna jest uruchamiana z gałęzi zdalnego śledzenia, Git konfiguruje gałąź (szczególnie wpisy branch.<name>.remote
i branch.<name>.merge
konfiguracyjne), aby git pull
odpowiednio połączyć się z gałęzią zdalnego śledzenia.
To zachowanie można zmienić za pomocą branch.autosetupmerge
flagi konfiguracji globalnej . Że ustawienie może być zmienione za pomocą przycisków --track
i --no-track
opcji, a później zmienić za pomocą git oddział --set-upstream-to
.
I git checkout --track origin/branch
zrobi to samo co 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
Ustawiłoby to również upstream dla „branch
”.
(Uwaga: git1.8.0 przestanie obowiązywać git branch --set-upstream
i zastąpi go git branch -u|--set-upstream-to
: zobacz komunikat git1.8.0-rc1 )
Po zarejestrowaniu oddziału wyższego szczebla dla oddziału lokalnego:
- powiedz git, aby pokazał związek między dwiema gałęziami w
git status
igit branch -v
.
- kieruje
git pull
bez argumentów, aby pobierać z góry, gdy nowy oddział jest wyewidencjonowany .
Zobacz „ Jak sprawić, aby istniejąca gałąź git śledziła gałąź zdalną? ”, Aby uzyskać więcej.
git pull
, podczas gdy niektóre prosiłyby o wyciągnięcie zdalnej gałęzi. Okazuje się, że jeśli po raz pierwszy sprawdzasz zdalną gałąź, którą utworzył twój rówieśnik, git kontynuuje i dodajebranch.<BNAME>.remote=origin
do lokalnego gitconfig. Który następnie pozwala na wydaniegit pull
. Jednak jeśli to ty tworzysz gałąźgit checkout -b BNAME
, git - oczywiście - nie wie. Więc powinieneś określić jego zdalny.If <branch>
nie znaleziono, ale istnieje dokładnie gałąź śledzenia w jednym pilocie (nazwij ją<remote>
) o pasującej nazwie, traktuj jako odpowiednik$ git checkout -b <branch> --track <remote>/<branch>
”branch.autoSetupMerge
abyalways
po prostu preform, co mówimy o. Domyślnie jest to ustawienietrue
, co oznacza, że śledzenie będzie wykonywane tylko podczas sprawdzania zdalnej gałęzi.true
nie konfiguruje śledzenia lokalnie utworzonych oddziałów.Nie ma żadnej różnicy!
1)
git checkout -b branch origin/branch
Jeśli nie ma
--track
i nie--no-track
,--track
przyjmuje się , że jest domyślna. Ustawienie domyślne można zmienić za pomocą ustawieniabranch.autosetupmerge
.W efekcie 1) zachowuje się jak
git checkout -b branch --track origin/branch
.2)
git checkout --track origin/branch
„Dla wygody”
--track
bez-b
implikacji,-b
a argumentem-b
domniemanym jest „gałąź”. Zgadywanie jest zależne od zmiennej konfiguracyjnejremote.origin.fetch
.W efekcie 2) zachowuje się jak
git checkout -b branch --track origin/branch
.Jak widać: bez różnicy.
Ale robi się jeszcze lepiej:
3)
git checkout branch
jest również równoważne,
git checkout -b branch --track origin/branch
jeśli „gałąź” jeszcze nie istnieje, ale „pochodzenie / gałąź” ma wartość 1 .Wszystkie trzy polecenia ustawiają „upstream” „branch” na „origin / branch” (lub zawodzą).
Górę jest używany jako punkt odniesienia argumentu mniej
git status
,git push
,git merge
a zatemgit pull
(jeśli jest skonfigurowana tak (który jest domyślnym lub prawie domyślny)).Np.
git status
Mówi ci, jak daleko jesteś lub do przodu, jeśli jesteś skonfigurowany.git push
jest skonfigurowany do wypychania bieżącej gałęzi w górę 2 domyślnie od git 2.0.1 ... a jeśli „origin” jest jedynym pilotem mającym „gałąź”
2, domyślna nazwa („prosta”) wymusza również równość obu nazw gałęzi
źródło
Książka wydaje się wskazywać, że te polecenia dają taki sam efekt:
Jest to szczególnie przydatne, gdy twoje kompilacje bash lub oh-my-zsh git są w stanie wyciągnąć
origin/serverfix
nazwę dla ciebie - wystarczy dołączyć--track
(lub-t
) i jesteś na dobrej drodze.źródło
Za pomocą tego polecenia nie można utworzyć nowego oddziału
jeśli masz zmiany, które nie są wprowadzane.
Oto przykład:
Możesz jednak łatwo utworzyć nowy oddział z nieetapowymi zmianami za pomocą
git checkout -b
polecenia:źródło
origin/branch
)origin/new-branch
zamiastorigin/branch
. Czy jesteś tego świadomy?