Git: Scal zdalnie oddział lokalnie

203

Wyciągnąłem wszystkie zdalne gałęzie przez git fetch --all. Widzę gałąź, którą chciałbym scalić, git branch -ajako piloty / pochodzenie / nazwa gałęzi. Problem polega na tym, że nie jest dostępny. Nie mogę scalić ani kasy?

micahblu
źródło

Odpowiedzi:

319

Możesz odnieść się do tych gałęzi zdalnego śledzenia ~ (wymienionych z git branch -r) nazwą ich pilota.

Musisz pobrać zdalną gałąź:

git fetch origin aRemoteBranch

Jeśli chcesz scalić jeden z tych odległych oddziałów w oddziale lokalnym:

git checkout master
git merge origin/aRemoteBranch

Uwaga 1: W przypadku dużego repozytorium z długą historią będziesz chciał dodać tę --depth=1opcję, gdy będziesz jej używać git fetch.

Uwaga 2: Te polecenia działają również z innymi zdalnymi repozytoriami, dzięki czemu możesz skonfigurować origini i upstreamjeśli pracujesz na rozwidleniu.


Scenariusz przeciwny: jeśli chcesz scalić jeden ze swoich oddziałów lokalnych ze oddziałem zdalnym (w przeciwieństwie do oddziału zdalnego do lokalnego, jak pokazano powyżej), musisz najpierw utworzyć nowy oddział lokalny na szczycie tego oddziału zdalnego:

git checkout -b myBranch origin/aBranch
git merge anotherLocalBranch

Chodzi tutaj o połączenie „jednego z lokalnych oddziałów” (tutaj anotherLocalBranch) ze zdalnym oddziałem ( origin/aBranch).
W tym celu najpierw tworzysz „ myBranch” jako reprezentację tej zdalnej gałęzi: to jest git checkout -b myBranch origin/aBranchczęść.
A potem możesz się anotherLocalBranchdo niego połączyć myBranch.

VonC
źródło
aLocalBranch? czy to literówka? Chyba znowu chciałeś napisać „myBranch”?
knocte
1
@knocte Nie: „Jeśli chcesz scalić jeden ze swoich oddziałów lokalnych w jednym ze zdalnych oddziałów”: Łączę „ aLocalBranch” z „ myBranch”, gdzie „ myBranch” oznacza oddział zdalny origin/aBranch.
VonC
Przepraszam, że przeszkadzam @VonC, w poprzednim komentarzu mówisz, że aLocalBranchto nie literówka, ale zatwierdziłeś najnowszą edycję (2 lata później!), Która poprawia tę „prawdopodobną literówkę”. Chciałem się z tobą skontaktować przed cofnięciem edycji.
rath
1
@rath Masz rację: wygląda na to, że mogłem przejrzeć tę edycję nieco pochopnie, granicząc z niedbalstwem. Zredagowałem odpowiedź, aby wyjaśnić drugi przypadek scalenia: czy możesz mi powiedzieć, czy jest to teraz jaśniejsze?
VCC
91

Za każdym razem, gdy dokonuję scalenia, wchodzę do gałęzi, w której chcę się połączyć (np. „ git checkout branch-i-am-working-in”), A następnie wykonuję następujące czynności:

git merge origin/branch-i-want-to-merge-from

Michael Dautermann
źródło
2
Myślę, że musisz zrobić git fetch origin/branch-i-want-to-merge-frompierwszy, prawda?
Hinrich
9
git fetch origin developa następniegit merge origin/develop
Olivier
2
@Olivier Masz rację, jest to właściwy sposób, aby to zrobić. git merge sam tego nie zrobi.
Sam
1
dziękuję za sprytną konwencję nazewnictwa, która pomogła mi zrozumieć
tony2tones,
1
@Akira nie jest git add .-> git commit -m <message>-> git push -u origin <branch>?
Cloud Cho
24

Najpierw pobierz gałąź zdalną z miejsca początkowego.

git fetch origin remote_branch_name

Scal zdalny oddział z oddziałem lokalnym

git merge origin/remote_branch_name
Lanil Marasinghe
źródło
1
To zadziałało, gdy zaakceptowana odpowiedź zgłosiła: Nie możemy się połączyć. W moim przypadku łączyłem się z rozwidleniem mojego repo innego użytkownika na GitHub.
SJT
Czy wymagane jest pobranie pierwszego polecenia? Czy „git merge origin / remote_branch_name” czyta ze zdalnego oddziału, a nie lokalnego. Więc nie powinienem się przejmować, czy lokalny oddział jest aktualizowany, czy nie?
Michael Freidgeim
20

Może chcesz śledzić oddział zdalny za pomocą oddziału lokalnego:

  1. Utwórz nowy oddział lokalny: git branch new-local-branch
  2. Ustaw tę nowo utworzoną gałąź, aby śledzić gałąź zdalną: git branch --set-upstream-to=origin/remote-branch new-local-branch
  3. Wejdź do tej gałęzi: git checkout new-local-branch
  4. Przeciągnij całą zawartość oddziału zdalnego do oddziału lokalnego: git pull
e18r
źródło
3

Jeśli już wykonałeś zdalny oddział i zrobisz to git branch -a,
otrzymasz coś takiego:

* 8.0
  xxx
  remotes/origin/xxx
  remotes/origin/8.0
  remotes/origin/HEAD -> origin/8.0
  remotes/rep_mirror/8.0

Następnie możesz użyć rep_mirror/8.0 do lokalnego wyznaczenia zdalnego oddziału.

Sztuka polega na tym, że remotes/rep_mirror/8.0to nie działa, alerep_mirror/8.0 działa.

Więc takie polecenie git merge -m "my msg" rep_mirror/8.0 scalanie.

(uwaga: jest to komentarz do odpowiedzi @VonC. Podaję to jako inną odpowiedź, ponieważ bloki kodu nie pasują do formatu komentarza)

herve-guerin
źródło