Podejrzewam, że jesteś zdezorientowany, ponieważ jest to zasadniczo mylące. Co gorsza, cała nasza / ich rzeczy zmieniają role (stają się zacofane), kiedy robisz rebase.
Ostatecznie, w czasie git merge
, w „nasz” oddział odnosi się do oddziału jesteś łączących się :
git checkout merge-into-ours
a gałąź „ich” odnosi się do (pojedynczej) gałęzi, którą scalasz:
git merge from-theirs
a tutaj „nasz” i „ich” ma jakiś sens, ponieważ mimo że „ich” i tak prawdopodobnie należy do ciebie, „ich” nie jest tym, w którym byłeś podczas biegu git merge
.
Chociaż używanie rzeczywistej nazwy oddziału może być całkiem fajne, rozpada się w bardziej złożonych przypadkach. Na przykład zamiast powyższego możesz wykonać:
git checkout ours
git merge 1234567
gdzie scalasz według surowego identyfikatora zatwierdzenia. Gorzej, możesz nawet to zrobić:
git checkout 7777777 # detach HEAD
git merge 1234567 # do a test merge
w takim przypadku nie są zaangażowane żadne nazwy oddziałów!
Wydaje mi się, że jest to mało pomocna, ale w rzeczywistości w gitrevisions
składni można odwoływać się do indywidualnej ścieżki w indeksie według numeru podczas scalania
git show :1:README
git show :2:README
git show :3:README
Etap nr 1 jest wspólnym przodkiem plików, etap nr 2 to wersja gałęzi docelowej, a etap nr 3 to wersja, z której się łączysz.
Powodem, dla którego zmieniają się pojęcia „nasze” i „ich”, rebase
jest to, że rebase działa, wykonując serię wiśniowych wyborów, w anonimowej gałęzi (odłączony tryb HEAD). Oddział docelowy jest oddziałem anonimowym, a oddział scalania z jest oddziałem pierwotnym (przedrebase): więc „--ours” oznacza, że buduje się anonimowy rebase, podczas gdy „--heirs” oznacza „rebasing naszej gałęzi” .
Jeśli chodzi o wpis gitattributes: może to mieć skutek: „nasz” naprawdę oznacza „użyj etapu nr 2” wewnętrznie. Ale, jak zauważysz, nie jest on w tym czasie na miejscu, więc nie powinien mieć tutaj wpływu ... no cóż, chyba że skopiujesz go do drzewa roboczego przed rozpoczęciem.
Nawiasem mówiąc, dotyczy to wszystkich zastosowań naszego i ich, ale niektóre są na poziomie całego pliku ( -s ours
dla strategii scalania; git checkout --ours
podczas konfliktu scalania), a niektóre są na zasadzie kawałek po kawałku ( -X ours
lub -X theirs
podczas -s recursive
łączyć). Co prawdopodobnie nie pomaga w żadnym zamieszaniu.
Jednak nigdy nie wymyśliłem dla nich lepszej nazwy. I: zobacz odpowiedź VonC na inne pytanie, gdzie git mergetool
wprowadza jeszcze więcej nazw, nazywając je „lokalnymi” i „zdalnymi”!
„ Nasz ” w Git odnosi się do oryginalnej gałęzi roboczej, która ma autorytatywną / kanoniczną część historii git.
Do „ ich ” odnosi się do wersji, która posiada pracę w celu rebased (zmiany do być odtwarzane na obecnym oddziale).
Może się to wydawać zamienione na ludzi, którzy nie są świadomi, że dokonywanie zmiany zasad (np.
git rebase
) Faktycznie wstrzymuje twoją pracę (która jest ich ), aby powrócić do kanonicznej / głównej historii, która jest nasza , ponieważ zmieniamy naszą zmienia się jako praca strony trzeciej.Dokumentacja
git-checkout
została wyjaśniona w Git> = 2.5.1 zgodnie zf303016
zatwierdzeniem :Na
git-merge
to wytłumaczyć w następujący sposób:Ponadto wyjaśniono, jak z nich korzystać:
Czasami może to być mylące, na przykład:
git pull origin master
gdzie-Xours
jest nasz lokalny,-Xtheirs
jest ich (zdalny) oddziałgit pull origin master -r
gdzie-Xours
jest ich (zdalnie),-Xtheirs
jest naszeTak więc drugi przykład jest przeciwny do pierwszego, ponieważ opieramy naszą gałąź na zdalnym, więc nasz punkt początkowy jest zdalny, a nasze zmiany są traktowane jako zewnętrzne.
Podobne dla
git merge
strategii (-X ours
i-X theirs
).źródło
git merge
, alegit pull
igit checkout
jako przykład. Jeśli chcesz użyć tego parametrugit merge
, powinieneś użyć-X ours
. Nadal możesz używać--ours
składni dlagit checkout
. Wyjaśniłem odpowiedź jeszcze bardziej.Wiem, że udzielono odpowiedzi, ale ten problem pomieszał mnie tak wiele razy, że założyłem małą stronę referencyjną, aby pomóc mi zapamiętać: https://nitaym.github.io/ourstheirs/
Oto podstawy:
Łączy:
Jeśli chcesz wybrać wersję w
master
:Jeśli chcesz wybrać wersję w
feature
:Rebases:
Jeśli chcesz wybrać wersję w
master
:Jeśli chcesz wybrać wersję w
feature
:(Dotyczy to oczywiście kompletnych plików)
źródło
Więc jeśli jesteś na oddział uwalniania / 2,5 i scalić gałąź funkcji / New-przyciski do niego, wtedy zawartość, jak znaleźć w wydaniu / 2.5 jest to, co nasz odnosi się do i treści, jak znaleźć na fabularnych / nowych przycisków jest to, co ich dotyczy do. Podczas akcji scalania jest to dość proste.
Jedynym problemem, na który wpada większość ludzi, jest przypadek rebase . Jeśli wykonasz zmianę bazy zamiast normalnego scalenia, role zostaną zamienione. Jak to? Jest to spowodowane wyłącznie sposobem działania bazowania. Pomyśl o rebase, aby działał w ten sposób:
Oczywiście nie o to tak naprawdę chodzi, ale jest to dla mnie miły model umysłu. A jeśli spojrzysz na 2 i 3, zrozumiesz, dlaczego role zostały teraz zamienione. Od 2, twoja obecna gałąź jest teraz gałęzią z serwera bez żadnych twoich zmian, więc to jest nasza (gałąź, w której się znajdujesz). Wprowadzone zmiany znajdują się teraz w innej gałęzi, która nie jest twoja ( BranchX ), a zatem zmiany te (mimo że są zmianami, które wprowadziłeś) należą do nich (druga gałąź używana w twojej akcji).
Oznacza to, że jeśli się połączysz i chcesz, aby twoje zmiany zawsze wygrywały, powiedziałbyś gitowi, aby zawsze wybierał „nasze”, ale jeśli zrobisz bazowanie i chcesz, aby wszystkie twoje zmiany zawsze wygrywały, mówisz gitowi, aby zawsze wybierał „ich”.
źródło
Wiem, że to nie wyjaśnia znaczenia, ale zrobiłem sobie mały obrazek, aby przypomnieć, którego użyć:
Mam nadzieję, że to pomoże!
PS - sprawdź także link w odpowiedzi Nitay 🙂
źródło
Zamieszczę tutaj moją notatkę, ponieważ muszę tu wracać raz po raz.
SCENARIUSZ 1. Zwykły programista: jesteś programistą, który nie może się łączyć
master
i musi graćfeature
tylko z oddziałami.Przypadek 1: mistrz jest królem. Chcesz odświeżyć
feature
gałąź (= rebase tomaster
), ponieważmaster
zawiera nowe aktualizacje zależności i chcesz zastąpić swoje skromne zmiany.Przypadek 2: jesteś królem. Chcesz zmienić swój
feature
oddział namaster
zmiany. Ale zrobiłeś więcej niż koledzy i chciałeś wykorzystać własne zmiany w pierwszej kolejności.WAŻNE: Jak widać, normalni programiści powinni preferować
rebase
i powtarzać go każdego ranka jak ćwiczenia / kawę.SCENARIUSZ 2. Scalanie sensei: Jesteś liderem zespołu i chcesz połączyć inne gałęzie i przekazać scalony wynik bezpośrednio do mistrza.
master
to gałąź, którą zmienisz.Przypadek 1: mistrz jest królem Chcesz połączyć oddział firmy zewnętrznej, ale
master
jest priorytetem.feature
to gałąź, którą zrobił twój senior.Przypadek 2: nowe zmiany są królem Gdy twój starszy programista wydał fajne
feature
i chcesz zastąpić stare s ** t wmaster
oddziale.PAMIĘTAJ: Aby zapamiętać w północy, który z nich wybrać:
master
jestours
ZAWSZE. Itheirs
tofeature
właśnie zrobili.źródło
Z
git checkout
użycia:Podczas rozwiązywania konfliktów scalania można to zrobić
git checkout --theirs some_file
igit checkout --ours some_file
zresetować plik odpowiednio do bieżącej wersji i wersji przychodzących.Jeśli zrobiłeś
git checkout --ours some_file
lubgit checkout --theirs some_file
chciałbyś zresetować plik do wersji 3-kierunkowej, możesz to zrobićgit checkout --merge some_file
.źródło