Jak zmienić bazę lokalną za pomocą zdalnego sterownika głównego

932

Mam sklonowany projekt z gałęzi master ze zdalnego repozytorium remote_repo. Tworzę nowy oddział i zobowiązuję się do tego oddziału. Inni programiści pchnęli do remote_repogałęzi master.

Muszę teraz przenieść moją gałąź RB na remote_repomaster.

Jak to zrobić? Jakie polecenia pisać na terminalu?

Damir
źródło
14
Dla mnie to pytanie jest dwuznaczne, ponieważ „z” może oznaczać wycofanie w dowolnym kierunku. Patrząc na odpowiedzi widzę, że celem jest przeniesienie gałęzi na zdalne urządzenie nadrzędne, a nie na odwrót. Wspominam o tym na wypadek, gdyby ktoś podążał za odpowiedzią poniżej i dostał odwrotność tego, czego chce.
Glenn Lawrence
8
@GlennLawrence Myślę, że lepiej jest edytować oryginalne pytanie niż dodawać komentarz. Jest to również wspierane przez przepełnienie stosu. Poza tym przeniesienie master na RB prawdopodobnie i tak się nie powiedzie, ponieważ RB zależy od historii master.
Daniel Kullmann

Odpowiedzi:

1244

Najpierw pobierz nowego wzorca z repozytorium nadrzędnego, a następnie oprzyj na nim swoją gałąź pracy:

git fetch origin            # Updates origin/master
git rebase origin/master    # Rebases current branch onto origin/master

Aktualizacja : zapoznaj się z odpowiedzią Paula Drapera, aby uzyskać bardziej zwięzły sposób na zrobienie tego samego - najnowsze wersje Git zapewniają prostszy sposób wykonywania odpowiednika powyższych dwóch poleceń.

Frerich Raabe
źródło
16
to jedyna odpowiedź, która faktycznie spełnia to, o co pytano
kayaker243
5
@ kayaker243 Nie, to jest to samo, co odpowiedź Paula Drapersa, ale myślę, że w długiej formie.
erik
7
@erik Zauważ, że Paul Draper napisał swoją odpowiedź około pół roku po komentarzu kayaker243 (i prawie dwa lata po tej odpowiedzi).
Frerich Raabe,
3
Dostaję następujące: Your branch and 'origin/b1' have diverged, # and have 3 and 2 different commits each, respectively.Wydaje się, że git pullpotrzebny jest inny . Czy to prawda, czy coś mi tu brakuje?
Dror,
2
@RGC Nie, git rebase masternie wykona tego samego zadania co drugie polecenie ( git rebase origin/master) masteri origin/mastermoże wskazywać na różne zatwierdzenia (zwłaszcza biorąc pod uwagę, że pierwsze polecenie było git fetch origin, które może się modyfikować origin/master).
Frerich Raabe
812
git pull --rebase origin master
# where --rebase[=(false|true|merges|preserve|interactive)]
Paul Draper
źródło
19
(Odpowiednik odpowiedzi Frericha)
Paul Draper
12
czy to nie różni się nieznacznie od odpowiedzi Frericha, ponieważ spowoduje to dokonanie zmian z wzorca nadrzędnego na wzorzec lokalny, podczas gdy odpowiedź Frericha pozostawia wzorzec lokalny nietknięty? (pull vs. fetch)
Jimmy Huch
7
Nie, w odpowiedzi Frericha rebase modyfikuje lokalnego mistrza. Pull --rebase to to samo, co pobranie, po którym następuje rebase
adhominem 14.04.16
9
FYI możesz robić interaktywne rebase zgit pull --rebase=interactive origin master
emmby
14
@adhominem - sprawdziłem dokumentację git-pull i nie widzę niczego, co potwierdzałoby twierdzenie, że lokalny wzorzec jest modyfikowany. Jeśli jestem w gałęzi o nazwie devi uruchomionej git pull --rebase origin master, tylko gałąź devbędzie modyfikowana, a nie master. Dokumentacja --rebaseflagi mówi, że próbuje rebase the current branch on top of the upstream branch after fetchingi nie ma nic na temat modyfikowania lokalnych gałęzi śledzenia.
Przywróć Monikę 2331977
226

Po zatwierdzeniu zmian w swoim oddziale, sprawdź masteri wyciągnij go, aby uzyskać najnowsze zmiany z repozytorium:

git checkout master
git pull origin master

Następnie sprawdź swój oddział i wprowadź zmiany w bazie master:

git checkout RB
git rebase master

... lub ostatnie dwa polecenia w jednym wierszu:

git rebase master RB

Podczas próby wypchnięcia z powrotem origin/RBprawdopodobnie wystąpi błąd; jeśli pracujesz jako jedyny RB, możesz wymusić wypychanie:

git push --force origin RB

... lub w następujący sposób, jeśli odpowiednio skonfigurowałeś git:

git push -f
CharlesB
źródło
4
podczas próby wypchnięcia z powrotem do origin / RB prawdopodobnie wystąpi błąd. Jeśli jesteś jedynym, który działa na RB, możesz użyć RB push - force origin. źródło: stackoverflow.com/questions/8939977/…
Joey Baruch
1
Ach .... mam dokładnie to. mój „RB” jest ponownie bazowany poprawnie, ale dostaję niekończące się błędy, gdy próbuję wcisnąć go po rebase. Czy oprócz „push - force origin RB” istnieje „lepszy” (niewymuszony) sposób na zrobienie tego? Po prostu staram się tutaj zrozumieć percepcję gitsa - i to mi się nie udaje.
Motti Shneor,
2
@MottiShneor Nie, nie ma dobrego sposobu. Jeśli ktoś w międzyczasie pcha do oddziału, jego zmiany zostaną utracone! Jeśli chcesz być miły w historii zatwierdzeń git, powinieneś raczej połączyć master do swojej gałęzi, co jest bezpieczne (możesz tego zrobić git pushbez -f).
Daniel Kullmann
109

Uwaga: Jeśli masz już szeroką wiedzę na temat rebase, użyj poniżej jednego linera do szybkiego rebase. Rozwiązanie: Zakładając, że pracujesz w oddziale i jesteś jedyną osobą pracującą nad nim.

git fetch && git rebase origin/master

Rozwiązuj wszelkie konflikty, testuj kod, zatwierdzaj i wypychaj nowe zmiany do zdalnego oddziału.

                            ~:   For noobs   :~

Poniższe kroki mogą pomóc każdemu, kto jest nowy git rebasei chciał to zrobić bezproblemowo

Krok 1: Zakładając, że w tym momencie w YourBranch nie ma żadnych zmian i zmian, które należy wprowadzić. Odwiedzamy YourBranch.

git checkout YourBranch
git pull --rebase

Co się stało? Wyciąga wszystkie zmiany dokonane przez innych programistów pracujących w twoim oddziale i nakłada na niego zmiany.

Krok 2: Rozwiąż wszelkie pojawiające się konflikty.

Krok 3:

git checkout master
git pull --rebase

Co się stało? Pobiera wszystkie najnowsze zmiany ze zdalnego sterownika głównego i zmienia na lokalnym urządzeniu głównym lokalnego. Zawsze dbam o to, by zdalny master był czysty i gotowy do wydania! I wolę pracować tylko lokalnie na master lub oddziałach. Polecam to robić, dopóki nie dostaniesz pomocy w zmianach gita lub zatwierdzeniach. Uwaga: Ten krok nie jest potrzebny, jeśli nie utrzymujesz lokalnego wzorca, zamiast tego możesz wykonać pobieranie i zmianę bazy zdalnego wzorca bezpośrednio w oddziale lokalnym. Jak wspomniałem na początku w jednym kroku.

Krok 4: Rozwiąż wszystkie pojawiające się konflikty.

Krok 5:

git checkout YourBranch
git rebase master

Co się stało? Zdarza się Rebase on master

Krok 6: Rozwiąż wszelkie konflikty, jeśli występują konflikty. Służy git rebase --continuedo kontynuowania bazy po dodaniu rozwiązanych konfliktów. W dowolnym momencie możesz użyć, git rebase --abortaby przerwać rebase.

Krok 7:

git push --force-with-lease 

Co się stało? Przekazywanie zmian do zdalnego YourBranch. --force-with-leaseupewni się, czy w trakcie dokonywania zmian wprowadzane są jakiekolwiek inne zmiany dla YourBranch od innych programistów. Jest to bardzo przydatne, a nie wymuszone. W przypadku jakichkolwiek nadchodzących zmian pobierz je, aby zaktualizować lokalny YourBranch przed wprowadzeniem zmian.

Dlaczego muszę wprowadzać zmiany? Aby ponownie napisać komunikat zatwierdzenia w zdalnej YourBranch po prawidłowej zmianie bazy lub Jeśli występują jakieś konflikty rozwiązane? Następnie musisz przekazać zmiany rozwiązane w lokalnym repozytorium do zdalnego repozytorium YourBranch

Yahoooo ...! Udało ci się ukończyć z powodzeniem.

Możesz także chcieć:

git checkout master
git merge YourBranch

Kiedy i dlaczego? Połącz swój oddział w master, jeśli zostanie to zrobione ze zmianami dokonanymi przez Ciebie i innych programistów. Co sprawia, że ​​YourBranch jest na bieżąco z masterem, gdy chcesz później pracować w tym samym oddziale.

                            ~:   (๑ơ ₃ ơ)♥ rebase   :~
bh4r4th
źródło
Do czego to służy: „Pobiera wszystkie najnowsze zmiany z wzorca i przestawia wzorzec na najnowszy wzorzec.”. Rebase master on master? Nie potrzebujesz po prostu pobrać najnowszego mistrza?
John Little,
@JohnLittle Dzięki za wskazanie. Mam na myśli Pulls latest changes from remote master to local master. I always prefer keeping remote master clean and release ready always!. Zaktualizuję mój opis.
bh4r4th
21

Krok 1:

git fetch origin

Krok 2:

git rebase origin/master

Krok 3: (Napraw, jeśli występują konflikty)

git add .

Krok 4:

git rebase --continue

Krok 5:

git push --force
GauthamManivannan
źródło
5
Brak wyjaśnienia, od której gałęzi zacząć. Nie dobra odpowiedź.
Karl Morrison
12

1. Najpierw aktualizacja Master ...

git checkout [master branch]
git pull [master branch]

2. Teraz podstawowa gałąź źródłowa z bazą master

git checkout [source branch]
git rebase [master branch]
git pull [source branch] (remote/source branch)
git push [source branch]

JEŻELI gałąź źródłowa jeszcze nie istnieje na pilocie, to:

git push -u origin [source branch]

"zrobione..."

N Djel Okoye
źródło
Podoba mi się charakter tej odpowiedzi krok po kroku. Pomaga rozbić to, co się dokładnie dzieje.
Dave Liu
6

git fetch origin master:master pobiera najnowszą wersję master bez konieczności jej sprawdzania.

Wszystko czego potrzebujesz to:

git fetch origin master:master && git rebase master 👌

Naz
źródło
Czy nie git fetchaktualizuje wzorca bez konieczności jego sprawdzania? Tyle że aktualizacje git fetchnie są git mergew porządku? Więc jeśli kasy, masternie będzie mieć najnowszych aktualizacji. Więc nie jest to krótszy zrobić podczas fabularnego oddziału, git fetchnastępnie git rebase origin/master? Nie możemy tego zrobić, git rebase masterponieważ będzie to próba zmiany bazy masterw obszarze roboczym, musimy origin/masterwydostać się z nie połączonego, ale siedzącego na miejscu.
Noitidart