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?



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>

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.


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']


Znam polecenie „git checkout -b nazwa gałęzi” do utworzenia kolejnej gałęzi. To nie było pytanie!


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

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

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


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/*

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.