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?

tybro0103
źródło
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!
mipadi
źródło
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
innaM
źródło
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 .

Robert Cabri
źródło
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>
mohit
źródło
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

Bradley Flood
źródło
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.

Alex N.
źródło
15

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

git fetch repo xyz:xyz
git checkout xyz
anatoly techtonik
źródło
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
Adrien Renaud
źródło
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>
prathap
źródło
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
PKV
źródło
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.

Vicky
źródło
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.

Fradely Code
źródło