Ja i mój zespół używamy gałęzi funkcji (z git). Zastanawiam się, która strategia jest najlepsza do przeglądu kodu przed scaleniem z master.
- Sprawdzam nowy oddział w master, nazwijmy go fb_ # 1
- Popełniam kilka razy, a potem chcę scalić go z powrotem z mistrzem
- Zanim scalę, ktoś powinien dokonać przeglądu kodu
Teraz są 2 możliwości:
1. miejsce
- Scalić kapitanowi fb_ nr 1 ( nie fb_ nr 1 do opanowania), aby uczynić go jako up-to-date, jak to możliwe
- Kolega z drużyny sprawdza zmiany między głową główną a głową fb_ # 1
- Jeśli fb_ # 1 jest w porządku, łączymy fb_ # 1 z masterem
- Plusy: brak recenzji przestarzałego kodu
- Minusy: jeśli ktoś inny scali coś między „1” i „2.” jego zmiany pojawiają się w recenzji, choć należą do innej recenzji.
2. miejsce
- Kolega z drużyny sprawdza zmiany między punktem kasy (git merge-base master fb_ # 1) a głową fb_ # 1
- Plusy: widzimy dokładnie, co zostało zmienione podczas pracy nad gałęzią funkcji
- Minusy: w recenzji może pojawić się przestarzały kod.
Jak myślisz, który sposób jest lepszy i dlaczego ? Może istnieje inne bardziej odpowiednie podejście?
źródło
git show HEAD
. Ponieważ będzie to fm commit commit , wyświetli listę obojga rodziców. Tak, masz hash mm . Alternatywnie, możesz w trywialny sposób zobaczyć rodzica wgitk
dowolnej przeglądarce git3. miejsce
Państwo zmieniają bazę oddział na mistrza zarówno Make it up-to-date i zachować zmiany rozdzielić.
To tworzy nową historię oddziału. Będą to nowe wersje z nowymi identyfikatorami, które będą miały tę samą treść, ale będą pochodzić z najnowszego wzorca i nie będą łączyły się ze starymi wersjami. Stare wersje są nadal dostępne w „reflog”, jeśli musisz się do nich odwoływać, np. Ponieważ okazało się, że popełniłeś błąd przy rozwiązywaniu konfliktu. Poza tym są bezwartościowe. Domyślnie Git przycina dziennik po 3 miesiącach i odrzuca stare wersje.
Korzystasz z interaktywnego rebase (
git rebase -i
igit commit --amend
) do zmiany kolejności, edycji i czyszczenia zmian, aby każda z nich dokonała zmiany logicznie zamkniętej.To ponownie tworzy nową historię, tym razem z dodatkową korzyścią, że możesz zrestrukturyzować zmiany, aby były jak najbardziej sensowne podczas przeglądu.
Plusy:
Zwykle dodatkowa praca oznacza, że najpierw dokładnie zapoznasz się z kodem, co również spowoduje wiele problemów.
To właśnie robią Linux i Git. I nie jest niczym niezwykłym, że seria 20 do 25 łatek jest poddawana przeglądowi i wielokrotnie przepisywana w tych projektach.
W rzeczywistości Linux robił to od samego początku projektu, kiedy ich kontrola wersji z wyboru była tarballami i łatkami. Kiedy wiele lat później Linus postanowił stworzyć git, był to główny powód wdrożenia
rebase
polecenia i jego interaktywnego wariantu. Również ze względu na to git ma oddzielne pojęcie autora i committer . Autor jest pierwszym, który stworzył wersję, a osoba, która ją dotknęła, jako ostatnia. Ponieważ zarówno w systemie Linux, jak i Git łatki są nadal przesyłane pocztą elektroniczną, prawie nigdy nie są to ta sama osoba.źródło
merge --no-ff
który wyraźnie pokaże gałąź na master zamiast funkcji po prostu znikającej w pozostałych--no-ff
ma swoje zalety i wady. Osobiście uważam, że to więcej hałasu niż cokolwiek innego. YMMV.Istnieje faktycznie trzecia możliwość - i najprawdopodobniej mnóstwo innych, ponieważ GIT jest raczej implementacją środowiska SCM niż implementacją metodologii SCM. Ta trzecia możliwość oparta jest na
rebase
.rebase
GIT Komenda wykonuje serię commit (zazwyczaj z punktu rozgałęzienia do czubka swojego tematu gałęzitopic
) i odtworzyć je gdzieś indziej (zazwyczaj na końcu swojego oddziału integracyjnego, na przykładmaster
).rebase
Komenda wytwarza nowe rewizje, które daje możliwość rozmieszczanie zobowiązuje się w formie, która jest łatwiejsza do przeglądu. Daje to nową serię zatwierdzeń, podobną dotopic
poprzedniej, ale wyglądającą na zakorzenioną w górnej części gałęzi integracji. Ta nowa gałąź jest nadal wywoływanatopic
przez GIT, więc stare odwołanie jest odrzucane. Nieformalnie nazywamtopic-0
pierwotny stan twojego oddziałutopic-1
i tak dalej na temat różnych refaktoryzacji.Oto moja propozycja dla twojego
topic
oddziału:(Opcjonalny etap) można interaktywnie rebase tematu oddział
topic
na jego punkcie rozgałęzienia (zobacz--fixup
opcjęcommit
i-i
oraz--autosquash
opcjerebase
), co daje możliwość przepisać zobowiązuje w sposób, który jest łatwiejszy do przeglądu ci. To powoduje powstanie oddziałutopic-1
.Bazujesz na gałęzi tematu u góry gałęzi integracji, przypomina to scalanie, ale „nie zanieczyszcza” historii łączeniem, które jest jedynie artefaktem inżynierii oprogramowania. To powoduje powstanie oddziału
topic-2
.Wyślij
topic-2
do członka drużyny, który dokona przeglądu na końcumaster
.Jeśli
topic-2
wszystko jest w porządku, połącz je w master.UWAGA Gałęzie - gdzie gałąź odnosi się do drzewa zatwierdzeń - wszystkie będą nazywane przez GIT tak samo, więc pod koniec procesu tylko gałąź
topic-2
ma nazwę w GIT.Plusy:
Cons:
topic-0
, nie ma trzy gałęzie artefaktytopic-0
,topic-1
atopic-2
które są tworzone w commit drzewo. (Chociaż w dowolnym momencie tylko jeden z nich ma nazwę w GIT.)W twoim pierwszym scenariuszu «jeśli ktoś połączy coś między" 1 " a „2.” »oznacza czas między utworzeniem punktu rozgałęzienia a czasem, w którym zdecydujesz się połączyć. W tym scenariuszu «jeśli ktoś scalił coś między„ 1 ” a „2.” »oznacza czas między rebase a scaleniem, który zwykle jest bardzo krótki. Dlatego w przedstawionym przeze mnie scenariuszu można „zablokować”
master
gałąź na czas scalania, nie zakłócając w sposób znaczący przepływu pracy, podczas gdy w pierwszym scenariuszu jest to niepraktyczne.Jeśli przeprowadzasz systematyczne przeglądy kodu, prawdopodobnie dobrym pomysłem jest zmiana kolejności zatwierdzeń w odpowiedni sposób (krok opcjonalny).
Zarządzanie artefaktami gałęzi pośredniej stanowi trudność tylko wtedy, gdy dzielisz je między repozytoriami.
źródło
topic-0
,topic-1
itopic-2
gałęzie. W momencie zakończenia rebase poprzednia wersja nie ma znaczenia. Więc nie będzie totopic@{1}
,topic@{2}
,topic@{yesterday}
,topic@{3.days.ago}
itd., Aby zapisać swój tyłek w przypadku uznasz wkręca rozwiązywanie konfliktów w rebase.topic
. Ponieważ gałąź w git to tylko nazwa.topic
w GIT, jest zawsze jednym z oddziałów (oddział w popełnić jak drzewo, a nie w odniesieniu GIT) I oznakowanetopic-0
,topic-1
,topic-2
.