Pochodząc ze środowiska SVN, jedną z najtrudniejszych rzeczy, do których należy się przyzwyczaić podczas pracy z systemami DVCS, jest sposób, w jaki wszyscy postrzegają każdą niezaangażowaną zmianę jak tykającą bombę zegarową.
W Mercurial, jeśli próbujesz pobrać zmiany i masz jakieś niezatwierdzone zmiany w kopii roboczej, musisz przeskakiwać obręcze, aby po prostu scalić nadchodzące zmiany. Chcesz zmienić gałęzie? Zmusi cię to do odłożenia wszystkiego na półkę, a następnie będziesz musiał natychmiast odłożyć to wszystko na drugim końcu. (SVN nie ma problemów z żadnym z tych scenariuszy.)
Git jest mniej więcej taki sam. Współpracuję z innym programistą przy projekcie i właśnie próbowałem wybrać jeden z jego commits do mojego widelca. Odmówił mi pozwolenia, ponieważ wprowadziłem niezatwierdzone zmiany w mojej kopii roboczej, w zupełnie innych plikach niż te zmienione w jego zatwierdzeniu. Nie ma nawet opcji scalania; najwyraźniej najpierw muszę ukryć swoje zmiany!
Gdyby ktoś traktował coś całkowicie nieszkodliwego z tak wielką ostrożnością, nazwałbym to „fobią”, irracjonalnym strachem, który należy uznać za zaburzenie psychiczne. Ale Git i Mercurial zostały zaprojektowane przez dwa różne zespoły inteligentnych, racjonalnych programistów, więc muszę się zastanawiać, czy wiedzą coś, czego nie jestem świadomy.
Czy istnieje powód techniczny, który uzasadnia takie podejście do niezaangażowanych zmian? A jeśli tak, to dlaczego wydaje się, że problem występuje tylko w DVCSes?
źródło
Odpowiedzi:
Wznawianie
To nie jest fobia, to (czasem surowe) egzekwowanie przestrzegania dobrych manier „często popełniaj” (użytkownicy SVN czasami boją się tego stylu)
I w końcu
hg qnew|qpop|qpush
jest mała uczciwa cena za porządek i porządekźródło
Kiedy scalasz lub wybierasz
git
, natychmiast tworzysz zatwierdzenie. Operacja nie jest zakończona, dopóki zatwierdzenie nie zostanie zakończone i nie będzie częścią historii.Co by się stało, gdybyś
git
pozwolił ci przerzucić niezatwierdzone zmiany w katalogu roboczym? Miałbyś (mniej lub bardziej) trudny czas na rozróżnienie między konfliktami zmian / scalania, które musisz zadbać o scalenie / wybranie cherry, a zmianami, które sam wprowadziłeś. Ponadto byłoby prawie niemożliwe przetestowanie tego, co faktycznie popełniasz.Zatem wymuszenie czystego katalogu roboczego dla sytuacji scalania pomaga zachować prostotę i łatwość zarządzania. W końcu wszystko, co musisz zrobić, to ukryć swoje niezaangażowane zmiany przed scaleniem, a następnie je schować. Pamiętaj, że w przepływie pracy
masz dwie (!) operacje scalania. Jeden, który łączy twoje ostatnie zatwierdzenie z nadchodzącymi zmianami, i ten, który łączy twoje niezatwierdzone zmiany z wynikowym zatwierdzeniem scalania. W ten sposób musisz tylko połączyć dwie rzeczy w jedną, unikając zamieszania, które wynikałoby z próby połączenia trzech rzeczy w jedną podczas jednej operacji, próbując zignorować te trzy rzeczy.
git stash
/git stash pop
Pozwala na łatwe i jednoznaczne, że ignorują swoje niezatwierdzone zmiany dla seryjnej.źródło