Git ściągnij określoną gałąź z GitHub


630

Mam projekt z wieloma oddziałami. Naciskałem je na GitHub , a teraz, gdy ktoś inny pracuje nad projektem, muszę pobrać ich gałęzie z GitHub. Działa dobrze w trybie master. Ale powiedz, że ktoś utworzył oddział xyz. Jak mogę pobrać gałąź xyzz GitHub i scalić ją xyzz moją gałęzią localhost?

Właściwie mam tutaj swoją odpowiedź: pchaj i ciągnij gałęzie w Git

Ale pojawia się błąd „! [Odrzucony]” i coś o „nie przewijaniu do przodu”.

Jakieś sugestie?


3
jakie jest twoje aktualne polecenie?
Alex N.

1
Jest to pobieranie, które może się nie powieść z komunikatem „non fast forward”. Czy zmodyfikowałeś gałąź zdalnego śledzenia (origin / xyz), czy też gałąź została przewinięta / przepisana w zdalnym repozytorium? Być może trzeba użyć „ git fetch origin --force”, ale należy przeczytać dokumentację przed wykonaniem tej czynności.
Jakub Narębski

Odpowiedzi:


755

Ale pojawia się błąd „! [Odrzucony]” i coś o „nie przewijaniu do przodu”

Wynika to z faktu, że Git nie może scalić zmian z gałęzi z bieżącym mistrzem. Załóżmy, że sprawdziłeś gałąź masteri chcesz połączyć się ze zdalną gałęzią other-branch. Kiedy to zrobisz:

$ git pull origin other-branch

Git robi to w zasadzie:

$ git fetch origin other-branch && git merge other-branch

To znaczy, a pullpo nim fetchnastępuje merge. Jednak, gdy pull-ing, Git będzie tylko scalić other-branch jeśli można to wykonać szybko naprzód seryjnej. Fast-forward seryjnej jest scalanie, w której szef oddziału, który próbujesz scalić jest bezpośrednim potomkiem szefa oddziału chcesz scalić. Na przykład, jeśli masz to drzewo historii, scalenie other-branchspowoduje szybkie scalenie:

O-O-O-O-O-O
^         ^
master    other-branch

Nie byłoby to jednak szybkie przewijanie do przodu:

    v master
O-O-O
\
 \-O-O-O-O
         ^ other-branch

Aby rozwiązać problem, najpierw pobierz gałąź zdalną:

$ git fetch origin other-branch

Następnie połącz go z bieżącym oddziałem (zakładam, że to master) i napraw wszelkie konflikty scalania:

$ git merge origin/other-branch
# Fix merge conflicts, if they occur
# Add merge conflict fixes
$ git commit    # And commit the merge!

Nie, problem dotyczy pobierania, a nie kroku scalania.
Jakub Narębski

3
Zwykle piloty są skonfigurowane w taki sposób, że pobieranie jest wymuszane, nawet jeśli nie powoduje zatwierdzenia szybkiego przewijania do przodu, więc nie powinno to nastąpić przy pobieraniu, chyba że OP zmieni coś ze zwykłą konfiguracją. Problem z przewijaniem do przodu może wystąpić podczas pobierania lub scalania. Co sprawia, że ​​mówisz, że problemem jest zdecydowanie pobieranie, a nie łączenie?
mipadi

Wykonuję następujące kroki (pobierz, scal). Git mówi mi, że nie ma nic do roboty. Kiedy próbuję dokonać, przewraca się narzekanie na szybkie przewijanie.
Jean Jordaan,

1
@mipadi Miałem ten sam problem co Jean i chociaż nie mogę powiedzieć, że pilot jest skonfigurowany w sposób inny niż domyślny, o którym wspomniałeś, mogę powiedzieć, że używanie git fetch -fnaprawiło mój problem! Dzięki!
cregox

1
To łączy oddział zdalny z oddziałem xzylokalnym master, czego nie sugerowało pierwotne pytanie; „Jak mogę pobrać gałąź xyz z GitHub i scalić go z gałęzią xyz na moim komputerze lokalnym?”
user5359531,

301

Wystarczy jawnie śledzić zdalne gałęzie, a prosty git pullzrobi dokładnie to, co chcesz:

git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name

Ta ostatnia jest operacją lokalną.

Lub jeszcze bardziej pasuje do dokumentacji GitHub na temat rozwidlania :

git branch -f new_local_branch_name upstream/remote_branch_name

39
Jeśli pojawi się komunikat „Nieprawidłowa nazwa obiektu:” origin / remote_branch_name ”, najpierw„ git fetch origin ”.
Martin Konicek,

130

Możesz przeciągnąć gałąź do gałęzi za pomocą następujących poleceń.

git pull {repo} {remotebranchname}:{localbranchname}

git pull origin xyz:xyz

Gdy jesteś w gałęzi master, możesz również najpierw pobrać gałąź taką jak:

git checkout -b xyz

Spowoduje to utworzenie nowej gałęzi „xyz” z poziomu głównego i bezpośrednie sprawdzenie.

Następnie wykonujesz:

git pull origin xyz

Spowoduje to przyciągnięcie nowego oddziału do xyzoddziału lokalnego .


1
Doskonały! Po prostu nie znałem tej składni: git pull {repo} {remotebranchname}: {localbranchname}. Pytanie, jeśli to pull nie działa (może ktoś zaktualizował gałąź i wystąpiłyby konflikty scalania), jakie są moje opcje?
Costa

7
Głosuję za tym, ponieważ próbuje połączyć zdalną gałąź z bieżącą gałęzią (np. Master). To nie jest to, co większość ludzi chce robić, i nie o to prosił PO. Odpowiedź @mohit to właściwy wybór.
Phrogz

1
Phrogz - wygląda na to, że to zachowanie zmieniło się w ostatnich wersjach Gita. Użyłem tego wcześniej i działało to doskonale.
Pawan

88

Najlepszym sposobem jest:

git checkout -b <new_branch> <remote repo name>/<new_branch>

1
Po utworzeniu nowej gałęzi „dev” na github i wypróbowaniu powyższego, otrzymałem następujący komunikat o błędzie: „fatal: origin / dev nie jest zatwierdzeniem i nie można z niego utworzyć gałęzi„ dev ”. Rozwiązanie polegało na„ git fetch ”poniżej rozwiązania Bradleya Flooda, a następnie ponownie uruchom odpowiedź Mohita.
TomEberhard

46

git fetch pobierze najnowszą listę oddziałów.

Teraz możesz git checkout MyNewBranch

Gotowy :)


Aby uzyskać więcej informacji, zobacz dokumentacja: git fetch


37

Nie jestem pewien, czy w pełni rozumiem problem, ale ściąganie istniejącej gałęzi odbywa się w ten sposób (przynajmniej działa dla mnie :)

git pull origin BRANCH

Zakłada się, że lokalny oddział utworzono na podstawie źródła / ODDZIAŁU.


15

Pomogło mi to uzyskać zdalny oddział przed połączeniem go z innymi:

git fetch repo xyz:xyz
git checkout xyz

8

Mówiąc wprost, jeśli chcesz pobrać z GitHub oddział the_branch_I_want:

git fetch origin
git branch -f the_branch_I_want origin/the_branch_I_want
git checkout the_branch_I_want

3
git pull <gitreponame> <branchname>

Zwykle jeśli masz tylko repo przypisane do swojego kodu, to gitreponame będzie pochodzić.

Jeśli pracujesz na dwóch repozytoriach, tak jak jedno jest lokalne, a drugie dla pilota, możesz sprawdzić listę repo z git remote -v . pokazuje to, ile repozytoriów jest przypisanych do twojego bieżącego kodu.

BranchName powinna istnieć w odpowiedniej gitreponame.

możesz użyć następujących dwóch poleceń, aby dodać lub usunąć repozytorium

git remote add <gitreponame> <repourl>
git remote remove <gitreponame>

2

możesz również zrobić

git pull -r origin master

naprawić ewentualne konflikty scalania

git rebase --continue

-r jest dla bazy. W ten sposób utworzysz strukturę oddziału

        v  master       
o-o-o-o-o
     \o-o-o
          ^ other branch

do

        v  master       
o-o-o-o-o-o-o-o
              ^ other branch

Doprowadzi to do czystszej historii. Uwaga: W przypadku, gdy już wypchnąłeś swoją drugą gałąź do źródła (lub innego pilota), być może będziesz musiał wymusić wypchnięcie swojej gałęzi po zmianie bazy.

git push -f origin other-branch

1

Zrobiłem

git branch -f new_local_branch_name origin/remote_branch_name

Zamiast

git branch -f new_local_branch_name upstream/remote_branch_name

Zgodnie z sugestią @innaM. Kiedy użyłem wersji nadrzędnej, było napisane „fatal: Niepoprawna nazwa obiektu:„ upstream / remote_branch_name ””. Nie zrobiłem git fetch originjako komentarz sugeruje, ale zamiast po prostu zastąpić upstreamz origin. Myślę, że są równoważne.


0

do ściągnięcia gałęzi z GitHub możesz użyć

git checkout --track origin/the-branch-name

Upewnij się, że nazwa oddziału jest dokładnie taka sama.

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.