Jak dotąd najbardziej myląca część git opiera się na innej gałęzi. W szczególności mylące są argumenty wiersza poleceń.
Za każdym razem, gdy chcę osadzić mały fragment jednej gałęzi na wierzchołku innego, muszę przejrzeć dokumentację git rebase i zajmuje mi to około 5-10 minut, aby zrozumieć, jaki powinien być każdy z 3 głównych argumentów.
git rebase <upstream> <branch> --onto <newbase>
Jaka jest dobra ogólna zasada, która pomaga mi zapamiętać, na co należy ustawić każdy z tych 3 parametrów, biorąc pod uwagę jakąkolwiek bazę w innej gałęzi?
Pamiętaj, że wielokrotnie przeglądałem dokumentację git-rebase, i wciąż, i wciąż, i znowu (i znowu), ale zawsze trudno to zrozumieć (jak nudna biała księga naukowa czy coś takiego). W tym momencie czuję, że muszę zaangażować innych ludzi, aby pomogli mi to zrozumieć.
Moim celem jest to, że nigdy nie powinienem sprawdzać dokumentacji tych podstawowych parametrów. Do tej pory nie byłem w stanie ich zapamiętać i już zrobiłem mnóstwo rebase'ów. Jest więc trochę niezwykłe, że do tej pory byłem w stanie zapamiętać każde inne polecenie i jego parametry, ale nie bazowałem na nim --onto
.
Odpowiedzi:
Pomińmy
--onto
na chwilę.upstream
ibranch
są dość proste, a właściwie trochę naśladującheckout
ibranch
- drugi argument jest opcjonalny:(Bok, nazwy tych argumentów
rebase
„upstream” i „branży” nie są bardzo opisywać zawartość IMO ja zwykle myśleć o nich jak peachoftree,.<start>
I<end>
, co jest, jak będę je za pomocą:git rebase <start> <end>
)Po pominięciu drugiej gałęzi wynik jest prawie taki sam, jak najpierw sprawdzenie tej gałęzi, a następnie wykonanie jej tak, jakby nie określono tej gałęzi. Wyjątkiem jest to,
branch
że nie zmienia twojej aktualnej gałęzi:Jeśli chodzi o zrozumienie, co
rebase
robi po wywołaniu, zacząłem od myślenia o tym jako o specjalnym typie scalania. To nie jest tak naprawdę, ale pomogło, gdy po raz pierwszy zaczął rozumieć bazę. Aby pożyczyć przykład peachoftree:A
git merge master
wyniki w tym:Podczas gdy
git rebase master
(podczas gdy na gałęzifeature
!) Powoduje to:W obu przypadkach
feature
zawiera teraz kod z obumaster
ifeature
. Jeśli nie jesteś włączonyfeature
, możesz użyć drugiego argumentu, aby przejść do niego jako skrótu:git rebase master feature
zrobi to samo, co powyżej.Teraz na specjalne
--onto
. Ważną częścią, o której należy pamiętać, jest domyślna wartość,<start>
jeśli nie jest określona. Tak więc powyżej, gdybym--onto
konkretnie określił , spowoduje to to samo:(Nie używam
--onto
bez sprecyzowania,<end>
ponieważ łatwiej jest przeanalizować mentalnie, nawet jeśli te dwie są takie same, jeśli już są włączonefeature
).Aby zobaczyć, dlaczego
--onto
jest przydatny, oto inny przykład. Powiedzmy, że byłem włączonyfeature
i zauważyłem błąd, który zacząłem naprawiać - alefeature
zamiast tegomaster
przez pomyłkę:Chcę przesunąć te zatwierdzenia
bugfix
, aby nie były już od nich zależnefeature
. W tej chwili jakikolwiek rodzaj scalenia lub zmiany bazy pokazany powyżej w tej odpowiedzi zajmie trzyfeature
zatwierdzenia wraz z dwomabugfix
zatwierdzeniami.Na przykład
git rebase master bugfix
jest zły. Zasięg<start>
do<end>
dzieje się zawierać wszystkie rewizje ufeature
, które są odtwarzanych na górzemaster
:To, czego tak naprawdę chcemy, to zakres zatwierdzeń od
feature
dobugfix
odtworzenia na górzemaster
. Po to--onto
jest - określenie innego celu „powtórki” niż gałąź „start”:git rebase --onto master feature bugfix
źródło
Odświeżenie polega na tym, że przebudowywanie ma miejsce głównie wtedy, gdy chcesz, aby historia zmian wyglądała liniowo, jeśli dwie gałęzie rozwinęły się niezależnie od siebie, w zasadzie przepisuje historię zmian.
tak lubię to robić
git rebase --onto <target branch> <start branch> <end branch>
gdzie
<target branch>
jest gałąź, na której się opierasz,<start branch>
zwykle jest gałęzią, z której się<end branch>
dzielisz i<end branch>
jest gałęzią, na której się opierasz.jeśli zaczniesz od
i robić
dostaniesz
Inną dobrą rzeczą, o której warto wiedzieć, jest
<target branch>
ustawienie domyślne,<start branch>
dzięki czemu można wykonać tę samą bazę, coJeśli potrzebujesz więcej pomocy, sprawdź rebase bez łez przewodnika
źródło
master
gałąź bez zmian. Po prostu dostajesz „funkcję”, aby rozgałęzić się tak, jakG--C'--D'--E'
podczas gdymaster
wciąż się zatrzymujeG
.<target branch>
i czym<start branch>
się różnią, aby pomóc czytelnikom zrozumieć najbardziej ogólny przypadek?