Czy git „Złota reguła Rebasing” jest tak niezbędny?

22

Niedawno odbyłem dyskusję z ludźmi, którzy całkowicie sprzeciwiali się strategii bazowania gałęzi fabularnych na GIT. Wydaje się, że jest to przyjęty wzorzec korzystania z bazy tylko dla lokalnych, prywatnych oddziałów, ale nigdy nie używaj jej, gdy kilka osób pracuje nad tą samą funkcją i gałęzią, zgodnie z tak zwaną „Złotą Regułą Rebasingu” (jak wyjaśniono tutaj: https : //www.atlassian.com/git/tutorials/merging-vs-rebasing/conceptual-overview )

Jestem tylko zaskoczony, że istnieje konsensus w tej sprawie. Pracowałem 3 lata przy pełnej strategii rebasingu, z około 20 programistami pracującymi razem i zgadnijcie, co zadziałało.

Proces jest w zasadzie:

  • Tworzysz gałąź funkcji, nazwijmy ją „myfeature” i pchnij ją do origin / myfeature
  • Inne osoby mogą to sprawdzić i nad tym popracować
  • Czasami możesz bazować na bazie master: z „myfeature”, git rebase origin / master ; a następnie tak, trzeba to naciskać.
  • Co dzieje się, gdy inni ludzie chcą forsować swoje zobowiązania? Po prostu to zmieniają : git rebase origin / myfeature . Są teraz w trybie szybkiego przewijania do przodu i mogą je przesuwać bez użycia siły.

Jedyną zasadą, którą należy szanować, jest to, że gałąź funkcji jest własnością kogoś . Tylko właściciel może naciskać.

Przyznaję: jak tylko pojawi się siła nacisku, istnieje ryzyko popełnienia błędów. To prawda. Ale jest też wiele sposobów na odzyskanie po błędach, a tak naprawdę, w ciągu 3 lat rozwoju nie widziałem wielu błędów popychających siłę, a kiedy to się stało, zawsze znajdowaliśmy sposób na prawidłowe odzyskanie.

Dlaczego więc „Złota Reguła Rebazy” jest tak szeroko akceptowana? Czy jest coś jeszcze za czym tęskniłem? Rozumiem, że wymaga minimum organizacji (każda strategia wymaga pewnej organizacji), ale działa.

Joel
źródło
Coś, o czym zapomniałem powiedzieć, ale ma to swoje znaczenie: w moim poprzednim doświadczeniu używaliśmy gerrit jako narzędzia do sprawdzania kodu. Oznacza to, że jeśli ktoś wypchnie zatwierdzenie, gdy właściciel oddziału wykonuje zmianę bazy, nie ma ryzyka, że ​​zatwierdzenie zostanie zgubione, ponieważ jest ono wypychane do gerrit zamiast bezpośrednio do repozytorium źródłowego. A ponieważ właściciel oddziału jest jedynym, który ma prawo do składania zleceń od gerrit, ryzyko popełnienia błędów było bardzo niskie.
Joel
co jeśli połączę gałąź funkcji innej osoby z moją własną?
Winston Ewert
Jeśli twoja funkcja jest zależna od innej, to myślę, że możesz zmienić swoją bazę od drugiej: git rebase origin / otherFeature (mówię raczej, bazowanie, niż scalanie, ponieważ celem jest utrzymanie historii liniowej). Przyznaję, że złożoność wszystkiego, co znacznie wzrasta, gdy wprowadzasz coraz więcej zależności między gałęziami.
Joel

Odpowiedzi:

10

Problem z wypychaniem wymuszonym nie dotyczy twojej gałęzi funkcji i wzorca, ale spychania twojego wzorca do wzorca innej osoby - ta synchronizacja zastąpi swojego wzorca zmianami, ignorując cokolwiek, co jest na ich wskazówce.

Biorąc pod uwagę to niebezpieczeństwo, istnieje powód, dla którego nie powinieneś go w ogóle używać, chyba że wszystko się popsuło i absolutnie, całkowicie musisz go użyć, aby dokonać napraw. System SCM nie powinien być nigdy zmuszany w taki sposób, jeśli tak się dzieje, ponieważ coś poszło bardzo źle (a moim pierwszym podejściem w takich przypadkach byłoby przywrócenie kopii zapasowych i powtórzenie operacji, aby zachować nienaruszoną historię).

Więc może pytanie brzmi, dlaczego w ogóle się opierasz? Czy „czysta” historia przy przywracaniu funkcji do opanowania? Jeśli tak, wyrzucasz całą dobrą historię dotyczącą rozgałęziania z powodów czysto stylowych. Szybkie łączenie do przodu IMHO również nie jest najlepszą praktyką, powinieneś zachować całą historię, aby zobaczyć, co naprawdę zrobiłeś, a nie odkażoną wersję później.

gbjbaanb
źródło
Mógłbyś oczywiście pociągnąć za master, rebase, a następnie wymusić push, ale to nie jest atomowe.
Kevin,
@ gbjbaanb masz całkowitą rację, strategia zmiany bazuje na motywach stylu / bardziej czytelnej historii. Nie próbuję argumentować, że jest lepiej, czy nie. Ale można to zrobić i właśnie o to chcę podnieść. Oczywiście nie mówiłem o naciskaniu na master, ale tylko na gałęziach fabularnych.
Joel
4
IMHO cecha zarówno łączenia bazy jak i szybkiego przewijania była błędem. SCM polega na przechowywaniu historii, abyś mógł zobaczyć, co się stało, kiedy jest to potrzebne, i robić migawki dla odpowiednich punktów na czas. Przynajmniej tego pragnie większość ludzi. Myślę, że Linus chciał, aby historia była dla niego jak najłatwiejsza do odczytania i dlatego umieścił je na swoją korzyść. IMHO powinien był włożyć więcej wysiłku w to, by różnice między 2 wersjami były łatwiejsze w zarządzaniu (tj. Umożliwienie prostszego widoku, a nie podstawowej historii)
gbjbaanb
2
Kiedy publikujesz artykuł, czy publikujesz pierwszy szkic? Czy istnieje jakieś prawo, które mówi, że narzędzia, których używasz do napisania pierwszego szkicu, nie mogą być użyte do edycji go do publikacji? Git to narzędzie programistyczne. Jeśli chcesz w sposób niezawodny i weryfikowalny zachować serię, zachowaj ją. Jeśli chcesz zamiast tego edytować go do publikacji, edytuj go. Git jest gwiezdny przy obu zadaniach.
jthill
5

Rebase nie jest niezbędny, ponieważ, jak mówisz, jest on głównie kosmetyczny. Czasami jest to o wiele prostsze niż scalenie. Może mieć więc pewną „rzeczywistą” wartość, ale tylko „czasami”

Niewłaściwe użycie bazy może być kosztowne. Jest mało prawdopodobne, aby stracić dane, jeśli wiesz wystarczająco dużo, aby nie panikować i sprawdzać procedur odzyskiwania, ale „hej, nikt nie naciska przez chwilę, muszę naprawić ...” nie jest świetne. Nikt też nie spala czasu na regenerację i testowanie badań, gdy mógł dodawać funkcje lub rozwiązywać błędy (lub dom z rodziną).

Dzięki temu kompromisowi wyniki „bardzo niewielu osób wykonuje operacje bazowe i wymuszone wypychanie” nie są niczym zaskakującym.

Niektóre przepływy pracy mogą zmniejszyć ryzyko, na przykład zredukować je do „zera, o ile pamiętasz, które gałęzie możesz wymusić, a które nie”. W rzeczywistości mogą być wystarczająco bezpieczne, aby uzasadnić ryzyko, ale ludzie często dokonują wyborów w oparciu o większy folklor. Z drugiej strony w rzeczywistości korzyści są dość małe, więc jak małe naprawdę musi być ryzyko?

Paski
źródło
3
„hej, nikt nie naciska przez jakiś czas, muszę naprawić ...” .. brzmi jak dawne czasy używania Visual Source Safe. Myślałem, że git jest lepszy.
gbjbaanb
Tak, w ten sposób ludzie ustalają zasady takie jak: „nie baw się ostrymi narzędziami! (Force push)”, aby uniknąć leczenia ran, których można uniknąć!
Stripes
2
@gbjbaanb Tak, Git jest lepszy - jeśli używasz go poprawnie. Narzekanie na to, że Git nie jest w stanie elegancko poradzić sobie z równoczesnym rozwojem, gdy ciągle się zmieniasz i zmieniasz skróty zatwierdzania wszystkiego, jest jak narzekanie na samochody gorsze od wagonów, ponieważ są one znacznie cięższe dla konia. To nie wina, że ​​ludzie upierają się przy niewłaściwym używaniu ...
Idan Arye
4
Cóż, to w pewnym sensie wina narzędzia. Git odsłania DUŻO ostrych krawędzi i chociaż czasami zauważa, że ​​są ostre, często nie. Jeśli porównasz to z CVS, w którym wszystkie ostre bity znajdują się w POJEDYNCZEJ podkomendie („cvs admin”? Ma to trochę czasu ...), co nie pozwala powiedzieć „to może cię zranić, nie rób tego” używaj go, chyba że masz pilną potrzebę ”. Lub inne systemy kontroli wersji, które pomijają możliwości, które mogą zaszkodzić.
Stripes
4
Nie oznacza to, że git nie dokonał prawidłowych wyborów projektowych (funkcja powiązana z grupami według podkomendy i woli pozwolić gitowi rozwiązywać bardziej złożone rzeczy we właściwych rękach) ... ale są to WYBORY i można być krytycznym wobec wybór posiadania tak wielu ostrych krawędzi, podobnie jak jeden może być krytyczny przy wyborze innych VCS, aby pominąć tak wiele przydatnych funkcji „tylko dlatego, że ktoś może zostać zraniony”.
Stripes
2

Aby dodać inny głos:

Tak, jeśli pracujesz zgodnie z opisem, nie ma problemu z używaniem rebasei siłą. Krytycznym punktem jest: masz umowę w swoim zespole.

Ostrzeżenia rebasei znajomi dotyczą przypadku, w którym nie ma specjalnego porozumienia. Zwykle git chroni Cię automatycznie, na przykład nie zezwalając na przesuwanie nie do przodu. Używanie rebasei pchanie siłą unieważnia to bezpieczeństwo. W porządku, jeśli masz coś innego na swoim miejscu.

W moim zespole czasami bazujemy na gałęziach funkcji, jeśli historia stała się nieuporządkowana. Usuwamy starą gałąź i tworzymy nową z nową nazwą lub po prostu koordynujemy nieformalnie (co jest możliwe, ponieważ jesteśmy małym zespołem i nikt inny nie pracuje w naszym repozytorium).


Zauważ, że sam projekt git również robi coś podobnego: mają gałąź integracji, która jest regularnie odtwarzana, zwana „pu” („proponowane aktualizacje”). Udokumentowano, że gałąź ta jest regularnie odtwarzana i nie należy na niej opierać nowej pracy.

Śleske
źródło
1

Przyznaję: jak tylko pojawi się siła nacisku, istnieje ryzyko popełnienia błędów. To prawda. Ale jest też wiele sposobów na odzyskanie po błędach, a tak naprawdę, w ciągu 3 lat rozwoju nie widziałem wielu błędów popychających siłę, a kiedy to się stało, zawsze znajdowaliśmy sposób na prawidłowe odzyskanie.

Powodem, dla którego użytkownicy Git zwykle unikają wspólnej historii zmian, jest to, że nie ma automatycznego unikania lub naprawy tych problemów. Musisz wiedzieć, co robisz, i musisz wszystko naprawić ręcznie, jeśli się zepsujesz. Zezwalanie dokładnie jednej osobie na użycie siły jest nieintuicyjne i sprzeczne z rozproszonym projektem Git. Co się stanie, jeśli osoba ta pojedzie na wakacje? Czy ktoś tymczasowo jest właścicielem oddziału? Skąd wiesz, że nie będą chodzić po wszystkim, co robił pierwotny właściciel? A co w świecie open source, co się stanie, jeśli właściciel oddziału stopniowo odejdzie od społeczności, nie oficjalnie odchodząc? Możesz stracić dużo czasu, czekając na przekazanie własności oddziału innej osobie.

Ale prawdziwy problem jest następujący: jeśli popsuniesz i nie od razu zdasz sobie z tego sprawę, stare zobowiązania ostatecznie znikną po upływie wystarczającego czasu. W tym momencie problem może być nieodwracalny (lub przynajmniej potencjalnie bardzo trudny do odzyskania, w zależności od tego, jak wygląda historia tworzenia kopii zapasowych - czy tworzysz kopie zapasowe starych kopii repozytorium Git, tj. Nie tylko klonów?).

Porównaj to z pracą ewolucyjną Changeset Mercurial (która, co należy zauważyć, nie jest jeszcze ukończona lub stabilna). Każdy może dokonywać dowolnych zmian w historii, które mu się podobają, pod warunkiem, że zestawy zmian nie są oznaczone jako publiczne. Te poprawki i zmiany mogą być popychane i wyciągane z całkowitą bezkarnością, bez potrzeby posiadania właściciela oddziału. Żadne dane nigdy nie są usuwane; całe lokalne repozytorium jest tylko dołączane. Zestawy zmian, które nie są już potrzebne, są oznaczone jako przestarzałe, ale przechowywane na czas nieokreślony. Wreszcie, gdy popsuniesz swoją historię (która jest traktowana jako normalna część codziennego przepływu pracy), istnieje sprytne polecenie, aby automatycznie ją wyczyścić. Tego oczekują ludzie UX, zanim zaczną modyfikować wspólną historię.

Kevin
źródło
Zgadzam się z tą „filozofią git” i myślę, że filozofie czasem można zhakować :). Co ważniejsze, jak powiedziałem w komentarzach, to teraz 3 lata temu, miałem szczególny przypadek posiadania gerrit jako narzędzia do przeglądu kodu, które działało jak de facto narzędzie do tworzenia kopii zapasowych, zapobiegając tak potencjalnej dramatycznej stracie. Teraz nadal uważam, że rebase jest OK, kiedy na pewno „kontrolujesz” gałąź. Nawet w projekcie typu open source, jeśli rozwijam funkcję i otwieram żądanie ściągnięcia, „posiadam” ten PR, uważam, że mam prawo do zmiany jego gałęzi, to ode mnie nie popieprzenie własnej pracy podczas bazowania ... (1/2)
Joel
... i jeśli niektórzy ludzie chcą wprowadzić modyfikację do tego PR, uważam, że powinni mi najpierw powiedzieć, i to jest kwestia komunikacji. (2/2)
Joel
PS: dzięki za link do ewolucji Changeset, to ciekawe
Joel
W rzeczywistości rebase jest jak powiedzenie: „przepiszmy całą moją pracę od zera (od najnowszego wzorca), usuwając całą moją poprzednią pracę”. Jeśli możesz to zrobić, możesz dokonać zmiany bazy.
Joel