Jak połączyć zdalny master z lokalnym oddziałem

238

Mam lokalny oddział projektu („configUpdate”), który rozwidliłem z projektu innej osoby i wprowadziłem wiele zmian w nim i chciałbym scalić zmiany, które wprowadzili w moim lokalnym oddziale.

próbowałem

git pull --rebase origin configUpdate

ale nie uchwycił najnowszych zmian - jak połączyć te dwa elementy? (także dla punktów bonusowych, co zrobiłem z pull --rebasepoleceniem?)

Martyn
źródło
Możliwy duplikat Git: Połącz lokalnie zdalny oddział
Michael Freidgeim

Odpowiedzi:

354

Z gałęzi funkcji (np. configUpdate) Uruchom:

git fetch
git rebase origin/master

Lub krótsza forma:

git pull --rebase

Dlaczego to działa:

  • git merge branchnamepobiera nowe zatwierdzenia z oddziału branchnamei dodaje je do bieżącego oddziału. W razie potrzeby automatycznie dodaje górne zatwierdzenie „Scal”.

  • git rebase branchnamepobiera nowe zatwierdzenia z oddziału branchnamei wstawia je „pod” zmianami. Dokładniej, modyfikuje historię bieżącej gałęzi, tak aby opierała się na wskazówce branchname, a wszelkie zmiany, które wprowadziłeś, były na jej podstawie.

  • git pulljest w zasadzie taki sam jak git fetch; git merge origin/master.

  • git pull --rebasejest w zasadzie taki sam jak git fetch; git rebase origin/master.

Dlaczego więc chcesz użyć git pull --rebasezamiast git pull? Oto prosty przykład:

  • Zaczynasz pracować nad nową funkcją.

  • Zanim będziesz gotowy do wprowadzenia zmian, inni deweloperzy wypchnęli kilka zatwierdzeń.

  • Jeśli ty git pull(który używa scalania), twoje zmiany zostaną pochowane przez nowe zatwierdzenia, oprócz automatycznie utworzonego zatwierdzenia scalania.

  • Jeśli git pull --rebasezamiast tego, git szybko prześle twojego mistrza do upstream, a następnie zastosuj zmiany na górze.

Joey Adams
źródło
Zrobiłem to we właściwej gałęzi, ale nadal widzę różnice między moimi lokalnymi plikami a zdalną główną gałęzią oryginalnego projektu (chociaż mówi, że wszystko jest aktualne!) Może źle skonfigurowałem projekt? Jakikolwiek sposób na sprawdzenie?
Martyn
1
@Martyn: Różnice powinny dotyczyć lokalnych zmian. Zrób kolejny rozwidlenie zdalnej gałęzi i sprawdź, czy ma prawidłową zawartość pliku.
ZeissS
4
Wiem, że to stara odpowiedź, ale pamiętaj, że wolisz wykonać MERGE zamiast rebase. Nie chcesz robić bazy, jeśli będziesz musiał później połączyć się ze zdalnym repozytorium, które już zawiera niektóre z twoich zmian.
Domino,
1
Co powiesz na (zakładając, że jesteś na gałęzi configUpdate) ... git pull jest w zasadzie taki sam jak git fetch; git merge origin / master. <- NIE PRAWDA
Chris
@Chris: W jakim sensie to nie jest prawda? Założenie o pochodzeniu / kapitale jako nadrzędny? A może zmieniono git pull?
Joey Adams,
81

Dowiedziałem się, że to:

$ git fetch upstream
$ git merge upstream/master
Martyn
źródło
6
Więc jeśli jeszcze tego nie rozgryzłeś, pull --rebasenie działałeś, ponieważ originwskazywał na twój widelec. Gdybyś to zrobił, zadziałałoby git pull --rebase upstream/master.
Karl Bielefeldt,
3
Spróbuj: git merge origin / master
Chris
Brakowało mi pobrania, ta odpowiedź rozwiązała dla mnie.
nurettin
38

Przejdź do lokalnego oddziału

> git checkout configUpdate

Scal zdalne urządzenie nadrzędne z oddziałem

> git rebase master configUpdate

W przypadku jakichkolwiek konfliktów popraw je i dla każdego konfliktu pliku wykonaj polecenie

> git add [ścieżka_do_pliku / plik konfliktu] (np. git add app / asset / javascripts / test.js)

Kontynuuj rebase

> git rebase - kontynuuj

Serge Seletskyy
źródło
nie obawiaj się korzystać z rebase zamiast scalania poświęć trochę czasu na sprawdzenie różnicy, jeśli poczujesz lukę w tych pytaniach
Serge Seletskyy
13

git rebase nie działał dla mnie. Po uruchomieniu git rebase, gdy próbuję wypchnąć zmiany do mojego lokalnego oddziału, ciągle pojawia się błąd („wskazówka: Aktualizacje zostały odrzucone, ponieważ końcówka twojego obecnego oddziału znajduje się za jego zdalnym odpowiednikiem. Zintegruj zdalne zmiany (np.„ Git pull). .. ') przed ponownym pchnięciem. ") nawet po ściągnięciu gita. To, co w końcu zadziałało, to git merge.

git checkout <local_branch>
git merge <master> 

Jeśli jesteś początkujący jak ja, oto dobry artykuł na temat git merge vs. git rebase. https://www.atlassian.com/git/tutorials/merging-vs-rebasing

AJC
źródło