Ostatnio przyglądałem się, jak ja i mój zespół korzystamy z Git i jak działają nasze przepływy pracy. Obecnie używamy przepływu pracy gałęzi funkcji, który wydaje się działać dobrze.
Widziałem także, że niektóre osoby w naszym zespole korzystają z przepływu pracy opartego na skrytce git . Przepływ pracy przebiega mniej więcej tak:
- Praca w głównej gałęzi (jak
master
) - Dokonuj zobowiązań w drodze
- Jeśli chcesz uzyskać zmiany lub zmienić gałęzie, wepchnij swoje niezaangażowane zmiany do skrytki
- Po zakończeniu aktualizacji usuń zmiany ze schowka.
Powinienem wspomnieć, że ten przepływ pracy jest używany zamiast przepływu pracy gałęzi funkcji. Zamiast brać gałąź i pracować nad nią, programiści tutaj zawsze pracują tylko nad jedną gałąź i wypychają / odrzucają stos, jeśli uznają to za stosowne.
Właściwie nie sądzę, że jest to świetny przepływ pracy, a rozgałęzianie byłoby bardziej odpowiednie niż używanie w ten sposób git stash. Widzę wartość git skrytki jako operację awaryjną, ale nie do używania jej w codziennym, regularnym przepływie pracy.
Czy regularne używanie git stash byłoby uważane za anty-wzór? Jeśli tak, jakie konkretne problemy mogą się pojawić? Jeśli nie, jakie są korzyści?
If you need to get changes or switch branches, push your uncommitted changes onto the stash
- właśnie do tego służy skrytka.Odpowiedzi:
Z książki Git SCM :
Biorąc pod uwagę ten opis, powiedziałbym, że jest to Anty Wzór. Zbyt uproszczonym wyjaśnieniem Git Stash byłoby to, że jest to „Wytnij i wklej” kontroli źródła. Bierzesz kilka zmienionych plików, „przechowujesz” je w pisaku przytrzymującym poza normalnym procesem rozgałęziania Git, a następnie ponownie stosujesz te zmiany w innym oddziale.
Cofając się nieco dalej, zobowiązanie do opanowania jest tutaj anty-wzorem . Użyj oddziałów. Do tego zostały zaprojektowane.
To naprawdę sprowadza się do tego:
Możesz wbić śrubę w ścianę, która zatrzyma obraz, ale należy użyć śrubokręta. Nie używaj młotka, gdy śrubokręt stoi tuż obok ciebie.
O zatwierdzeniu „złamanego” kodu
Chociaż jest to opinia, doszedłem do tej opinii z doświadczenia.
Popełniaj wcześnie i często popełniaj. Zatwierdź tyle uszkodzonego kodu, ile chcesz. Zobacz swoją lokalną historię zatwierdzeń jako „zapisz punkty”, gdy coś hackujesz. Po wykonaniu logicznej pracy, dokonaj zatwierdzenia. Pewnie, że może wszystko zepsuć, ale to nie ma znaczenia, dopóki nie popchniesz tych zmian. Przed pchnięciem, rozłóż bazę i zmiażdż swoje zobowiązania.
W przypadku OP ten wątek wiadomości jądra systemu Linux może być interesujący, ponieważ wydaje się, że niektórzy członkowie zespołu OP używają Git w podobny sposób.
@RibaldEddie powiedział w komentarzu poniżej:
(na ryzyko narażenia się na gniew wielu ludzi)
Linus powiedział:
Myślę, że @RibaldEddie próbuje powiedzieć, że możesz używać
git stash
w przepływie pracy gałęzi funkcji - i to prawda.git stash
Problemem nie jest wykorzystanie tego. Jest to połączenie zobowiązania do opanowania i używaniagit stash
. To jest anty-wzór.Wyjaśnianie
git rebase
Z komentarza @ RibaldEddie:
(Moje podkreślenie)
Modyfikacja historii zmian nie jest złą rzeczą, o ile jest to lokalna historia zmian . Jeśli wyreżyserujesz zatwierdzenia, które już wypchnąłeś, zasadniczo osierocisz każdego, kto korzysta z twojego oddziału. To jest złe.
Powiedzmy, że dokonałeś kilku zmian w ciągu dnia. Niektóre zmiany były dobre. Niektóre ... nie tak dobrze.
git rebase
Polecenia w połączeniu z tępienia swoich zobowiązuje to dobry sposób, aby oczyścić się z lokalnym popełnienia historię. Fajnie jest łączyć się w jednym zatwierdzeniu z oddziałami publicznymi, ponieważ pozwala to zachować historię zatwierdzeń udostępnionych oddziałów twojego zespołu w czystości. Po aktualizacji, będziesz chciał ponownie przetestować, ale jeśli testy zakończą się pomyślnie, możesz wcisnąć jedno czyste zatwierdzenie zamiast kilku brudnych.Jest jeszcze jeden interesujący wątek jądra Linux na czystej historii zatwierdzeń .
Znowu od Linusa:
(moje podkreślenie)
Wniosek
W końcu OP ma kilku programistów, którzy robią to:
Istnieją tutaj dwa problemy:
git stash
igit pull
nadrzędnie, kiedy powinni używać gałęzi funkcji.Nie ma nic złego w używaniu
git stash
- szczególnie przed ściągnięciem - ale używaniegit stash
w ten sposób jest anty-wzorem, gdy są lepsze przepływy pracy w Git.Ich użycie
git stash
czerwonego śledzia. To nie jest problem. Problemem jest zobowiązanie się do opanowania.źródło
Osobiście używam tylko
stash
do krótkich, nieoczekiwanych przerw, jak ktoś zadający pytanie, które wymaga zmiany na inny oddział. Robię to, ponieważ wcześniej zapomniałem o skrytkach, wtedy nie zastosowałyby się czysto. Regularne zatwierdzenia w gałęziach funkcji są o wiele trudniejsze do zapomnienia i łatwiejsze do scalenia, więc teraz mam tendencję do po prostu złamania zatwierdzenia, a następnie zrobieniagit reset HEAD~1
lub zmiany bazy, jeśli nie chcę tego zachować później.Jednak wielką zaletą rozproszonej kontroli wersji jest to, że ludzie mogą korzystać z preferowanego przepływu pracy we własnych repozytoriach, o ile repozytoria udostępnione spełniają standardy. Upewniłbym się, że ludzie nie korzystają tylko z
stash
przepływu pracy, ponieważ nie mają wystarczającego przeszkolenia lub świadomości alternatyw, ale jeśli nadal wybiorą przepływ pracy, który wydaje ci się nieoptymalny, zostawiłbym to.źródło
Myślę, że częścią twojego pytania, która jest anty-wzorzec, jest użycie jednej wspólnej gałęzi master . Jeśli jednak należy uwzględnić gałąź rozwijającą oprócz gałęzi głównej, a następnie użyć skrytek do obsługi własnych przełączników kontekstu w gałęzi rozwijania, nie byłoby to anty-wzorcem i bardzo ściśle odzwierciedla część przepływu pracy opisują takie organizacje jak Etsy i Facebook.
To powiedziawszy, powyższa odpowiedź @Greg Burghardt jest nieco zbyt przychylna tak zwanemu przepływowi pracy git-flow lub gałęzi funkcji. Zwykłem opowiadać się za podobną strategią, ale po uświadomieniu sobie, że dodaje ona niepotrzebnej złożoności i stwarza fałszywe poczucie bezpieczeństwa, już tego nie robię. Jest to również pozostałość po czasach zdecentralizowanych systemów kontroli wersji, takich jak subversion.
Po pierwsze, ponieważ Git jest zdecentralizowanym systemem kontroli wersji, w przeciwieństwie do subversion, lokalne repozytorium programisty jest zasadniczo gigantyczną gałęzią samego kodu. To, co jednostka rozwija lokalnie, nie ma wpływu i nie powinno mieć wpływu na innych członków zespołu, chyba że uszkodzony lub błędny kod zostanie przekazany do dowolnych gałęzi udostępnianych w repozytorium współdzielonym.
Polecenie rebase może jednak uszkodzić historię gałęzi, gdy występuje konflikt scalania w jednym z odtwarzanych zatwierdzeń. Od http://ryantablada.com/post/the-dangers-of-rebasing-a-branch
Ponadto model wielu rozgałęzień zakłada, że żadne dwa rozgałęzienia nie mogą nigdy zawierać współzależnych zmian kodu. Gdy tak się stanie, programista musi teraz żonglować jeszcze większą liczbą gałęzi, aby działać wydajnie.
Zasadniczy anty-wzorzec, który widzę, nie jest związany z gałęziami a zapasami, ale raczej z rodzajami problemów, o których niektórzy bardzo mądrzy ludzie rozmawiają od jakiegoś czasu: czy masz zaufanie do swojego kodu za pomocą testy jednostkowe i dobra architektura? Czy jesteś w stanie wprowadzać przyrostowe zmiany w kodzie, aby programiści mogli łatwo zorientować się w zmianach i zrozumieć, co zrobi zmiana? Czy Twoi programiści nawet raz uruchamiają nowy kod, aby sprawdzić, czy rzeczywiście działa? (Tak, widziałem to wcześniej).
Jeśli odpowiedź na te pytania brzmi „nie”, to tak naprawdę nie ma znaczenia, ile masz gałęzi - programiści stwierdzą, że kod jest gotowy, działa i nadaje się do produkcji, gdy tak naprawdę nie jest, i żadna liczba gałęzi nie będzie pomożemy ci, gdy ten kod i tak przejdzie do produkcji.
źródło
git stash
jest narzędziem. Sam w sobie nie jest wzorem ani anty-wzorem. To narzędzie, podobnie jak młot to narzędzie. Używanie młotka do wbijania gwoździ jest wzorem, a używanie młotka do wkręcania śrub jest anty-wzorem. Podobnie istnieją przepływy pracy i środowiska, w którychgit stash
można użyć właściwego narzędzia, oraz przepływy pracy i środowiska, w których jest ono nieprawidłowe.Przepływ pracy „wszyscy zatwierdzają i pchają do głównej linii” to taki, który działa całkiem rozsądnie tam, gdzie nie ma zmian wysokiego ryzyka. Jest często używany w środowiskach svn, gdzie jest jeden autorytatywny serwer centralny, który ma kod.
Git jednak wiąże się z jednym serwerem centralnym. Posiadające wszystkie deweloperzy robią
commit
,pull
(lubrebase
jeśli jesteś do tego),push
cały czas mogą mieć duży bałagan.Największe problemy przychodzą na myśl, że coś w toku jest zepsute i musisz popracować nad priorytetowym błędem. Oznacza to, że musisz nieco odłożyć tę pracę na bok, pobrać najnowsze, pracować nad tym bez uprzedniej pracy w toku, powodując problemy z kompilacją, którą próbujesz wykonać.
Do tego
git stash
byłoby właściwym narzędziem do użycia.Istnieje jednak większy problem czający się w centrum tego przepływu pracy. Czy to jest to wszystkie role gałęzi kontroli wersji są w jednym odgałęzieniu. Linia główna, rozwój, konserwacja, akumulacja i pakowanie są w Master. To jest problem. (Zobacz Zaawansowane strategie rozgałęziania SCM, aby uzyskać więcej informacji na temat tego podejścia do oddziałów)
I tak, powiedziałeś, że nie jest to świetny przepływ pracy i że są z tym problemy. Problem nie dotyczy jednak narzędzia
git stash
. Problemem jest brak wyraźnego rozgałęziania ról lub niezgodnych zasad .git stash
jest jednak coś, z czego korzystałem, kiedy miałem trochę czasu, kiedy budowałem, wpadłem w lepki stan, którego nie byłem pewien, czy to był właściwy ... więc ukryłem swoje zmiany a następnie zbadał inne podejście do rozwiązania problemu. Jeśli to zadziałało - świetnie, odrzuć rzeczy ze schowka i kontynuuj. Jeśli druga eksploracja stała się trudniejsza, powróć do poprzedniej zmiany i ponownie zastosuj skrytkę, aby nad tym popracować. Alternatywą byłoby zatwierdzenie, pobranie, rozgałęzienie, a następnie kontynuacja w tym nowym oddziale lub powrót i zresetowanie go. Pytanie brzmi: czy naprawdę warto umieścić to w historii, gdy jest to coś, co chcę trochę zbadać?git stash
nie jest anty-wzorem. Używaniegit stash
jako alternatywy dla rozgałęziania, podczas gdy wszyscy zobowiązują się do Mistrza, jest anty-wzorem - ale nie z powodugit stash
.Jeśli jeszcze go nie trafiłeś, poczekaj, aż pojawią się problemy z kompilacjami , gdy ktoś musi wprowadzić znaczące zmiany architektoniczne w wielu plikach (i konfliktach scalania) lub jakiś nieprzetestowany kod w toku, który wycieka do produkcji w tym celu anty-wzór, aby cię dogonić.
źródło