Jak mogę przejść do innej gałęzi w git?

222

Która z tych linii jest poprawna?

git checkout 'another_branch'

Lub

git checkout origin 'another_branch'

Lub

git checkout origin/'another_branch'

Jaka jest różnica między tymi liniami?


Benyamin Jafari
źródło
32
git checkout [branch]dla większości użytkowników odwiedzających to pytanie
JGallardo

Odpowiedzi:

225

Jeśli another_branchjuż istnieje lokalnie i nie ma Cię w tej gałęzi, git checkout another_branchprzełącz się na gałąź.

Jeśli another_branchnie istnieje, ale istnieje origin/another_branch, git checkout another_branchoznacza to git checkout -b another_branch origin/another_branch; git branch -u origin/another_branch. To stworzyć another_branchod origin/another_branchi zestaw origin/another_branchjak górnym stanowisku another_branch.

Jeśli nie istnieje, git checkout another_branchzwraca błąd.

git checkout origin another_branchzwraca błąd w większości przypadków. Jeśli originjest wersją i another_branchjest plikiem, to sprawdza plik tej wersji, ale najprawdopodobniej nie tego się spodziewasz. originjest stosowany głównie w git fetch, git pulli git pushjako zdalny, alias adres URL do zdalnego repozytorium.

git checkout origin/another_branchpowiedzie się, jeśli origin/another_branchistnieje. Prowadzi to do stanu odłączonego HEAD, a nie do żadnej gałęzi. Jeśli dokonasz nowych zatwierdzeń, nowe zatwierdzenia nie będą dostępne z żadnych istniejących oddziałów i żaden z oddziałów nie zostanie zaktualizowany.

AKTUALIZACJA :

Wraz z wydaniem 2.23.0 możemy za jego pomocą git switchtworzyć i przełączać gałęzie.

Jeśli fooistnieje, spróbuj przełączyć na foo:

git switch foo

Jeśli foonie istnieje i origin/fooistnieje, spróbuj utworzyć fooz, origin/fooa następnie przejdź do foo:

git switch -c foo origin/foo
# or simply
git switch foo

Mówiąc bardziej ogólnie, jeśli foonie istnieje, spróbuj utworzyć fooze znanego ref lub zatwierdzenia, a następnie przejdź do foo:

git switch -c foo <ref>
git switch -c foo <commit>

Jeśli prowadzimy jednocześnie repozytorium w Gitlab i Github, lokalne repozytorium może mieć dwa piloty, na przykład origindla Gitlab i githubGithub. W tym przypadku repozytorium ma origin/fooi github/foo. git switch foobędzie narzekać fatal: invalid reference: foo, ponieważ nie wiadomo z którego ref origin/foolub github/foo, aby utworzyć foo. Musimy to określić za pomocą git switch -c foo origin/foolub git switch -c foo github/foozgodnie z potrzebą. Jeśli chcemy utworzyć gałęzie z obu zdalnych gałęzi, lepiej jest użyć nazw wyróżniających dla nowych gałęzi:

git switch -c gitlab_foo origin/foo
git switch -c github_foo github/foo

Jeśli fooistnieje, spróbuj odtworzyć / wymusić utworzenie fooz (lub zresetować foodo) znanego ref lub zatwierdzenia, a następnie przełącz się na foo:

git switch -C foo <ref>
git switch -C foo <commit>

które są równoważne:

git switch foo
git reset [<ref>|<commit>] --hard

Spróbuj przełączyć się na odłączony HEAD znanego ref lub zatwierdzić:

git switch -d <ref>
git switch -d <commit>

Jeśli chcesz po prostu utworzyć gałąź, ale nie chcesz się do niej przełączać, użyj git branchzamiast tego. Spróbuj utworzyć gałąź ze znanego ref lub zatwierdzenia:

git branch foo <ref>
git branch foo <commit>
ElpieKay
źródło
24
Ta odpowiedź jest poprawna (jak zwykle i pozytywnie oceniona), ale dodam komentarz, który może być pomocny: git checkoutmoim zdaniem polecenie robi zbyt wiele rzeczy. Dlatego jest tutaj tak wiele trybów działania. Gdyby jedyną rzeczą git checkoutbyło przełączenie gałęzi, odpowiedź byłaby prosta, ale może również tworzyć gałęzie, a nawet wyodrębniać pliki z określonych zatwierdzeń bez przełączania gałęzi.
torek
11
to jest prawidłowa odpowiedź, ale pokazuje, jak git jest popieprzony w linii poleceń. GIT Checkout, aby zmienić gałąź?
dniu
3
@thang Cóż, w wersji 2.23.0 można temu zaradzić: teraz możesz użyć git switchprzełączenia na oddział.
legends2k
Switch wydaje się nie działać dla tej wersji git. Czego używam, aby przejść do innej gałęzi w tej wersji git? C: \ widget> git --version git wersja 2.11.0.windows.3 C: \ widget> git switch master git: 'switch' nie jest poleceniem git. Zobacz „git --help”. C: \ widget>
Jan
1
Zamiast git checkouttego używaj @John dla starszych wersji, która działa również w nowoczesnych wersjach.
ElpieKay
66

Przełączanie do innej gałęzi w git. Prosta odpowiedź,

git-checkout - Przełącz gałęzie lub przywróć działające pliki drzewa

git fetch origin         <----this will fetch the branch
git checkout branch_name <--- Switching the branch

Przed zmianą gałęzi upewnij się, że nie masz żadnych zmodyfikowanych plików, w takim przypadku możesz zatwierdzić zmiany lub ukryć je.

zwisający wskaźnik
źródło
Ostatnie polecenie wprowadza mnie w stan odłączonego HEAD. Oznacza to, że nie można edytować oddziału.
2
Gałąź, którą próbujesz pobrać, nie jest pobierana, więc musisz ją pobrać przed dokonaniem transakcji. Możesz pominąć pobieranie, jeśli gałąź jest aktualna, a następnie po prostu użyj nazwy gałęzi kasy git.
danglingpointer
Czy nie wystarczy wykonać „ściągnięcie git” po przejściu na gałąź?
pull również ok, pull wykonuje pobieranie i łączy się w tle. Nie widzę żadnych różnic.
danglingpointer
17

[ git checkout "branch_name"]

to inny sposób na powiedzenie:

[ git checkout -b branch_name origin/branch_name]

w przypadku, gdy „nazwa_gałęzi” istnieje tylko zdalnie.

[ git checkout -b branch_name origin/branch_name] jest przydatne, jeśli masz wiele pilotów.

Jeśli chodzi o [ git checkout origin 'another_branch'] nie jestem pewien, czy jest to możliwe, AFAK można to zrobić za pomocą polecenia „pobierz” - [ git fetch origin 'another_branch']

Mehdi
źródło
Znam polecenie „git checkout -b nazwa gałęzi” do utworzenia kolejnej gałęzi. To nie było pytanie!
10

Od wersji Git 2.23 można git switch <branch name>przełączać gałęzie.

gkw
źródło
6

Dla mnie zadziałało:

Przejdź do potrzebnej gałęzi:

git checkout -b BranchName

A potem wyciągnąłem „mistrza” przez:

git pull origin master
Karam Qusai
źródło
6

Przydatne polecenia do pracy w życiu codziennym:

git checkout -b "branchname" ->  creates new branch
git branch                   ->  lists all branches
git checkout "branchname"    ->  switches to your branch
git push origin "branchname" ->  Pushes to your branch
git add */filename           -> Stages *(All files) or by given file name
git commit -m "commit message" -> Commits staged files
git push                     -> Pushes to your current branch
pola
źródło
5

Jeśli chcesz, aby gałąź śledziła gałąź zdalną, co jest bardzo ważne, jeśli zamierzasz zatwierdzić zmiany w gałęzi i pobrać zmiany itp., Musisz użyć opcji -t do faktycznego pobrania, np .: git checkout -t branchname

Matthew Joughin
źródło
4

Sprawdź: git branch -a

Jeśli otrzymujesz tylko jeden oddział. Następnie wykonaj poniższe czynności.

  • Krok 1 : git config --list
  • Krok 2 : git config --unset remote.origin.fetch
  • Krok 3 : git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
pavan
źródło
2
Zastanawiam się, jak ta seria poleceń zmieniłaby się na inną gałąź.
Może to być przydatne, gdy wcześniej wykonałeś płytki klon (używając depthparam) i teraz zastanawiasz się, dlaczego nie możesz pobrać innych zdalnych gałęzi, error: pathspec 'another_branch' did not match any file(s) known to gitkorzystając z poleceń sugerowanych powyżej. Z pewnością nie o to chodziło w pierwotnym pytaniu, ale może pomóc innym drapiąc się tutaj po głowach.
luciash d 'będąc
0

Używam tego, aby przełączyć jedną gałąź na drugą, każdy, kogo możesz użyć, działa dla mnie jak urok.

git switch [nazwa gałęzi] LUB git kasa [nazwa gałęzi]

np. git switch develop LUB
git checkout develop

Rohit Chaurasiya
źródło