Z książki Git SCM :
Często, gdy pracujesz nad częścią swojego projektu, rzeczy są w nieuporządkowanym stanie i chcesz zmienić gałęzie, aby trochę popracować nad czymś innym. Problem polega na tym, że nie chcesz wykonywać częściowo wykonanej pracy, abyś mógł później wrócić do tego punktu. Odpowiedzią na ten problem jest polecenie git stash.
Składowanie przyjmuje stan „brudny” katalogu roboczego - to znaczy zmodyfikowane pliki śledzenia i zmiany etapowe - i zapisuje je na stosie niedokończonych zmian, które można ponownie zastosować w dowolnym momencie.
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.
- Utwórz nowy oddział
- Hack hack hack
- Zatwierdź uszkodzony kod
- Poleruj kod i spraw, by działał
- Zatwierdź działający kod
- Rebase and Squash
- Test
- Naciśnij, gdy testy przebiegają pomyślnie
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:
Przede wszystkim skrytka nie znajduje się poza „rozgałęzionym przepływem pracy”, ponieważ pod maską skrytka jest tylko inną gałęzią.
(na ryzyko narażenia się na gniew wielu ludzi)
Linus powiedział:
Dzięki „git stash” możesz także mieć wiele różnych ukrytych rzeczy, ale one nie ustawiają się w kolejce - są to po prostu losowe, niezależne łaty, które schowałeś, ponieważ były w pewnym momencie niewygodne.
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żywania git stash
. To jest anty-wzór.
Wyjaśnianie git rebase
Z komentarza @ RibaldEddie:
Rebasing jest bardziej podobny do wklejania kopii, a jeszcze gorzej modyfikuje popełnioną historię.
(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:
Chcę czystej historii, ale to naprawdę oznacza (a) czystą i (b) historię.
Ludzie mogą (i prawdopodobnie powinni) opierać swoje prywatne drzewa (swoją własną pracę). To jest porządek . Ale nigdy nie kodują inne narody. To „niszczyć historię”
Więc część historyczna jest dość łatwa. Jest tylko jedna główna zasada i jedno drobne wyjaśnienie:
Nigdy nie wolno NIGDY niszczyć historii innych ludzi. Nie wolno bazować na zobowiązaniach innych osób. Zasadniczo, jeśli nie ma na nim Twojego podpisu, jest poza limitem: nie możesz go zmienić, bo to nie jest twoje.
Zauważ, że tak naprawdę chodzi o historię innych ludzi , a nie o kodeks innych ludzi . Jeśli przesłali ci różne rzeczy jako łatkę przesłaną e-mailem, a ty zastosowałeś ją za pomocą „git am -s”, to jest to ich kod, ale
twoja historia.
Możesz więc zwariować na punkcie „git rebase”, nawet jeśli nie napisałeś kodu, o ile sam zatwierdzenie jest twoje prywatne.
Niewielkie wyjaśnienie zasady: po opublikowaniu Twojej historii na jakiejś stronie publicznej inne osoby mogą z niej korzystać, więc teraz nie jest to już Twoja prywatna historia.
Tak więc drobnym wyjaśnieniem jest to, że nie chodzi tylko o „twoje zatwierdzenie”, ale także o to, że jest prywatne dla twojego drzewa, a ty jeszcze go nie wypchnąłeś i nie ogłosiłeś.
...
Teraz „czysta” część jest nieco bardziej subtelna, chociaż pierwsze zasady są dość oczywiste i łatwe:
Zachowaj czytelność swojej historii
Niektórzy ludzie to robią, po prostu wypracowując sobie coś w głowie i nie popełniając błędów. ale to bardzo rzadkie i dla reszty z nas, podczas pracy nad naszymi problemami, używamy „git rebase” itp.
Więc „git rebase” nie jest zły. Ale ma rację tylko wtedy, gdy jest to TWÓJ BARDZO WŁASNY PRYWATNY drzewo git.
Nie wystawiaj swojego badziewia.
Oznacza to: jeśli nadal znajdujesz się w fazie „git rebase”, nie wypychasz go. Jeśli nie jest gotowy, wysyłasz łatki lub używasz prywatnych drzewek git (tak jak „zamiennik serii poprawek”), o których nie mówisz ogółowi społeczeństwa.
(moje podkreślenie)
Wniosek
W końcu OP ma kilku programistów, którzy robią to:
git checkout master
(edit files)
git commit -am "..."
(edit files)
git stash
git pull
git stash (pop|apply)
Istnieją tutaj dwa problemy:
- Programiści zobowiązują się do opanowania. Zablokuj to natychmiast. To naprawdę największy problem.
- Programiści stale używają
git stash
i git 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żywanie git 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.