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.
Odpowiedzi:
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.
źródło
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?
źródło
Aby dodać inny głos:
Tak, jeśli pracujesz zgodnie z opisem, nie ma problemu z używaniem
rebase
i siłą. Krytycznym punktem jest: masz umowę w swoim zespole.Ostrzeżenia
rebase
i 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żywanierebase
i 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.
źródło
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ę.
źródło