Kiedy pracuję nad gałęzią funkcji, zwykle chcę wyczyścić zatwierdzenia w gałęzi za pomocą interaktywnego bazy, zanim moja praca zostanie przejrzana i zintegrowana z gałęzią główną.
Podczas opracowywania funkcji chcę przekazać moją pracę pośrednią do zdalnego repozytorium jako środek zapasowy. To znaczy, kiedy mój dysk twardy ulega awarii, nie chcę, aby cała gałąź funkcji została utracona.
Prowadzi to jednak do tego, że często muszę zrobić git push --force
zdalne repozytorium po rebase, co jest ogólnie niezadowolone. Lub, jak mówi połączona strona github:
Ponieważ zmiana historii zatwierdzeń może utrudnić wszystkim innym, którzy korzystają z repozytorium, uważanie, że zmiana bazy danych jest już zepchnięta do repozytorium, jest złą praktyką.
Czy istnieje (ogólnie akceptowana) polityka, która rozwiązuje ten konflikt?
Dlaczego nie jest to duplikat Czy git „Złota zasada Rebasing” jest tak niezbędny?
Moje pytanie tutaj dotyczy polityki rozwiązania konfliktu między chęcią wykonania kopii zapasowej pracy w zdalnym repozytorium a ponownym udostępnieniem pracy , podczas gdy inne pytanie próbuje zaprzeczyć, że istnieje konflikt, i pyta, dlaczego niektórzy uważają, że konflikt w ogóle istnieje, i dlatego pyta, dlaczego „konieczne jest, aby nie naciskać na siły?
Odpowiedzi:
Kluczowe pytanie, które należy sobie zadać:
Jeśli usuniesz gałąź zdalnych funkcji po scaleniu w master, już tracisz historię. Zakładając, że zmiażdżysz / wyodrębnisz oddział przed dokonaniem połączenia / PR, stracisz tę historię. Wszystko, co robisz w tym przypadku, pozwala na użycie github jako kopii zapasowej.
Sytuacja, w której chcesz zachować historię, a nie wymuszać wypychanie, polega na tym, że zdalny oddział utrzymuje się po scaleniu i nie istnieje tylko przez pewien czas.
Wygląda na to, że wiele osób naciska jednocześnie na tę gałąź. Oznacza to, że dbasz o historię w oddziale.
Zamiast tego możesz zrobić dla swojej pracy pośredniej rozwidlenie tej gałęzi. Możesz naciskać na to, a następnie przekształcić wszystkie swoje zatwierdzenia w jeden zatwierdzenie przed połączeniem, więc kiedy scalisz je w swoją gałąź funkcji, masz tylko 1 zatwierdzenie (z przebudowaną historią całego oddziału).
źródło
featurebranch-local
), a następnie aktywować programistę w tej gałęzi, z dowolną liczbą zatwierdzeń. Gdy chcesz scalić, zmiażdż te zatwierdzenia, a następnie połącz je z funkcją. Zasadniczo po prostu robię dev w rzeczywistej gałęzi tymczasowej, a następnie zgniatanie / scalanie w twoją funkcję.develop-feature
gałęzią. Oczywiście, prywatność odbywa się wyłącznie na podstawie konwencji i nie jest narzucona przez nic, ale może stać się częścią polityki, szczególnie jeśli zostaną do tego wprowadzone pewne konwencje nazewnictwa gałęzi. (Może jestem teraz zbyt niespokojny, a może nie :) Kombinacja z--force-with-lease
nie może boleć, chociaż nie należy na niej polegać, jak wskazano w moim innym poście.Wymieniam tutaj niektóre możliwości, które przychodzą mi do głowy.
Zawsze bazuj na nowej gałęzi
Jeśli masz brudną gałąź
some-feature
, ustaw ją na nowej gałęzi. Na przykładNastępnie
some-feature-rebase
przejrzeli i zintegrowali.Problem: Dużym minusem jest to, że, ściśle mówiąc, potrzebujesz nowej gałęzi dla każdej bazy. (Na przykład możesz mieć wiele zmian, jeśli wprowadzisz zmiany po sprawdzeniu kodu)
Posługiwać się
git push --force-with-lease
Właśnie dowiedziałem się o
git push --force-with-lease
alternatywiegit push --force
, któraProblem : Wydaje się, że poprawia się to bezpośrednio w sytuacji, w której używamy tylko
--force
, ale nadal ma pewne zastrzeżenia, szczególnie gdy robięgit fetch
zamiast zamiastgit pull
, który aktualizuje nasze lokalne oddziały powyżej, podstępnie--force-with-lease
myśląc, że nie wprowadzono żadnych zmian gałąź.źródło