Podczas wykonywania rebase git często mam trudności z ustaleniem, co dzieje się z „lokalnym” i „zdalnym” podczas rozwiązywania konfliktów. Czasami mam wrażenie, że zamieniają się stronami od jednego zatwierdzenia do drugiego.
Dzieje się tak prawdopodobnie (zdecydowanie) dlatego, że nadal nie rozumiem.
W przypadku zmiany bazy, kto jest „lokalny”, a kto „zdalny”?
(Używam P4Merge do rozwiązywania konfliktów)
git svn
”, tylko dla części „git rebase
”)Odpowiedzi:
TL; DR;
Podsumowując (jak komentuje Benubird ), kiedy:
local
sięB
(przebazować na )remote
jestA
I:
local
jestA
(scal w ),remote
jestB
Przełącza rebase
ours
(bieżąca gałąź przed rozpoczęciem rebase) itheirs
(gałąź, na której ma zostać dokonana rebase).kutschkem wskazuje, że w kontekście narzędzia scalającego GUI :
ours
" (gałąź upstream)theirs
" - bieżąca gałąź przed rebase.Zobacz ilustracje w ostatniej części tej odpowiedzi.
Inwersja podczas rebase
Zamieszanie może być związane z inwersją
ours
itheirs
podczas rebase .(odpowiednie fragmenty)
git rebase
strona podręcznika :Z tego powodu, gdy dochodzi do konfliktu scalania:
ours
” jest dotychczas zmienionym szeregiem zaczynającym się od<upstream>
,theirs
” to gałąź robocza. Innymi słowy, strony są zamieniane.Zilustrowana inwersja
Na fuzji
, nie zmieniamy bieżącej gałęzi 'B', więc to, co mamy, to wciąż to, nad czym pracowaliśmy (i łączymy się z inną gałęzią)
Na rebase:
Ale w przypadku rebase zmieniamy stronę, ponieważ pierwszą rzeczą, którą robi rebase, jest pobranie gałęzi upstream! (aby odtworzyć aktualne zatwierdzenia na górze)
A
git rebase upstream
najpierw zmieniHEAD
B na gałąź upstreamHEAD
(stąd zmiana „naszego” i „ich” w porównaniu do poprzedniej „bieżącej” gałęzi roboczej)., a następnie rebase odtworzy „swoje” zatwierdzenia w nowej „naszej” gałęzi B:
Uwaga: pojęcie „upstream” to referencyjny zbiór danych (all repo lub, jak tutaj, oddział, który może być oddziałem lokalnym ), z którego odczytywane są dane lub do których są dodawane / tworzone nowe dane.
„
local
” i „remote
” kontra „mine
” i „theirs
”Pandawood dodaje w komentarzach :
GUI git connectetool
Kutschkem dodaje i słusznie:
ours
" (gałąź upstream)theirs
" - bieżąca gałąź przed rebase.git mergetool
rzeczywiście wspomina o „lokalnym” i „zdalnym” :Na przykład, KDiff3 by wyświetlać rozdzielczość scalania podobnie jak :
I meld też to wyświetli :
To samo dotyczy VimDiff , który wyświetla :
źródło
git checkout A; git rebase B
lokalny jest B, zdalny jest A. Wszystko, co musiałem wiedzieć ...git checkout A; git rebase B
lokalny jest B, zdalny jest . Gdybymcheckout A
to ja jestem obecnie patrząc na plikach, ponieważ istnieje naA
, jak to jest w żaden sposób zdalny ? (Nie mówię, że Benubird się myli; mówię, że git ma głupi UX){branch A}
i{branch B}
lub podobne.Najważniejsze
git rebase
git merge
Innymi słowy, LOCAL jest zawsze oryginalnym, a REMOTE jest zawsze facetem, którego commity nie istniały wcześniej, ponieważ są scalane lub zmieniane na górze
Udowodnij to!
Na pewno. Nie wierz mi na słowo! Oto prosty eksperyment, który możesz wykonać, aby samemu się przekonać.
Po pierwsze, upewnij się, że masz poprawnie skonfigurowane narzędzie git Mergetool. (Jeśli tego nie zrobiłeś, prawdopodobnie i tak nie czytałbyś tego pytania). Następnie znajdź katalog do pracy.
Skonfiguruj swoje repozytorium:
Utwórz wstępne zatwierdzenie (z pustym plikiem):
Utwórz zmianę na gałęzi, która nie jest master:
Utwórz zmianę w gałęzi głównej:
W tym momencie Twoje repozytorium powinno wyglądać tak:
Teraz do testu rebase:
Teraz test scalania. Zamknij narzędzie Mergetool bez zapisywania zmian, a następnie anuluj rebase:
Następnie:
Twoje wyniki powinny być takie same jak u góry.
źródło
local
/remote
aspekty, z którymi się zmagałem w mojej własnej odpowiedzi powyżej (która jest bardziej o inwersjiours
vstheirs
tak czy inaczej)Nie dostałem dokładnie Twojego problemu, ale myślę, że poniższy diagram rozwiązuje Twój problem. (Rebase: Zdalne repozytorium ---> Obszar roboczy)
Źródło: My Git Workflow
źródło