Próbując osiągnąć nirwanę git, spędzam dzień na uczeniu się, jak wykorzystać rebase w sytuacjach, w których obecnie się łączę.
Podczas przechodzenia przez coś, co uważam za przepływ git 101 (który przeliteruję poniżej), muszę push --force
cofać zmiany do źródła.
Nie jestem jedyny - wiem, że to teren zakryty (patrz 1 , 2 , 3 , 4 , 5 ) i rozumiem techniczne powody, dla których siła jest konieczna. Mój problem jest następujący - jest wiele (wiele) wpisów na blogu wychwalających rebase i tego, jak zmieniło to ich życie (zobacz 1 , 2 , 3 , 4, aby wymienić kilka), ale żaden z nich nie wspomina, że push --force
jest to część ich przepływ. Jednak prawie każda odpowiedź na istniejące pytania dotyczące przepełnienia stosu brzmi: „tak, jeśli zamierzasz zmienić bazę, musisz użyć push --force
”.
Biorąc pod uwagę liczbę i religijność zwolenników rebase, muszę wierzyć, że stosowanie metody „push --force” nie jest nieodłączną częścią przepływu rebase i że jeśli ktoś często musi zmuszać ich do popychania, robi coś złego .
push --force
to zła rzecz .
Więc oto mój flow. W jaki sposób mógłbym osiągnąć takie same wyniki bez użycia siły?
Prosty przykład
Dwie gałęzie:
- v1.0 - gałąź wydania, zawiera tylko poprawki
- master - wszystko do następnego dużego wydania.
Mam kilka zatwierdzeń poprawek i kilka zmian na następne wydanie.
Chciałbym włączyć poprawki do mojego mastera, aby nie zostały utracone w następnym wydaniu. Przed oświeceniem po prostu:
git checkout master
git merge v1.0
Ale teraz próbuję
git checkout master
git rebase v1.0
Więc teraz jestem tutaj:
Czas na:
git push
Nie ma kości.
źródło
@CodeGnome ma rację. Nie należy ponownie bazować na gałęzi v1.0, ale na gałęzi v1.0 na master, to zrobi różnicę.
Utwórz nową gałąź wskazującą na wersję 1.0, przenieś tę nową gałąź na górę nadrzędną, a następnie zintegruj nową wersję poprawek wersji 1.0 z gałęzią główną. Otrzymasz coś takiego:
Ten sposób korzystania z rebase jest zalecany w oficjalnej dokumentacji git .
Myślę, że masz rację
git push --force
: powinieneś go używać tylko wtedy, gdy popełniłeś błąd i popchnąłeś coś, czego nie chciałeś.źródło
master
z samą gałęzią funkcji i nie mają nic przeciwko scaleniu samej gałęzi funkcji, można to zrobić za pomocą:git checkout my-branch; git rebase master; git checkout master; git merge my-branch
Musisz wymusić push, jeśli zmienisz bazę i już opublikowałeś swoje zmiany, prawda?
Używam rebase całą masę, ale albo publikuję na czymś prywatnym, gdzie wymuszenie nie ma znaczenia (np. Mój własny klon na GitHub, jako część żądania ściągnięcia), albo rebase przed pierwszym push.
To jest serce przepływu pracy, w którym używasz rebase, ale nie wymuszaj zbyt dużego nacisku: nie publikuj rzeczy, dopóki nie będą gotowe, nie zmieniaj bazy po naciśnięciu.
źródło
rebase
nowy pociągnął zmiany do swojego tematu oddział, ale kiedy już zakończone zmian tego oddziału, cimerge
z tyłu oddziału do głównej gałęzi rozwojowej.Myślę, że istnieje dobry przypadek użycia tego wzorca rebase-następnie-wymuszenie, który nie jest wynikiem błędnego naciśnięcia: samodzielnej pracy nad gałęzią funkcji z wielu lokalizacji (komputerów). Robię to często, ponieważ czasami pracuję w biurze na moim komputerze stacjonarnym, a czasami z domu / klienta na laptopie. Muszę od czasu do czasu zmienić bazę, aby nadążyć za główną gałęzią i / lub aby scalenia były czystsze, ale muszę też naciskać na siłę, gdy zostawiam jedną maszynę, aby pracować na innej (gdzie po prostu ciągnę). Działa jak urok, o ile tylko ja pracuję w branży.
źródło
Oto, czego używam (zakładając, że nazwa twojego oddziału to foobar ):
źródło
git
nie jest pozbawiony osobowościgit merge -s ours origin/<branch>
to naprawiło to dla nastl; dr łączenie ze współdzielonymi gałęziami, ponowne bazowanie na poszczególnych gałęziach.
--force-with-lease
jest bezpieczniejszą alternatywą dla siły i powinien pomóc ci osiągnąć wspomnianą git nirwanę bez destrukcyjnej natury siły.Ogólna praktyczna zasada, którą widziałem, sprawdza się w przepływach pracy różnych zespołów, polega na używaniu jej
merge
dla współdzielonych gałęzi (tj., Master lub develop) i używaniurebase
podczas pracy nad własną gałęzią funkcji. Oto typowy cykl życia gałęzi funkcjiProsta angielska wersja tego, co tutaj zrobiliśmy:
force-with-lease
Czwarty krok jest NAPRAWDĘ ważny i jest jednym z głównych powodów, dla których zacząłem opowiadać się za używaniem rebase.
force-with-lease
sprawdza pilota, aby zobaczyć, czy zostały dodane nowe zatwierdzenia. Jeśligit push
okaże się, że jest destrukcyjny, nie będzie naciskał!Mam nadzieję, że to da komuś większą pewność siebie podczas korzystania z rebase.
źródło