To zabrzmi sprzecznie z intuicją, ale wysłuchaj mnie:
Zachęć ich, aby zaczęli eksperymentować z git
Jedną z interesujących rzeczy w git jest to, że zaskakująco łatwo jest zapewnić bezpieczeństwo każdej lokalnej operacji. Kiedy zacząłem używać git, jedną z rzeczy, które przyszło mi do głowy, było spakowanie całego katalogu jako kopii zapasowej na wypadek, gdyby coś spieprzyłem. Później odkryłem, że jest to ogromna kludge i prawie nigdy nie jest konieczna do ochrony twojej pracy, ale ma tę zaletę, że jest bardzo bezpieczna i bardzo prosta, nawet jeśli nie wiesz, co do cholery robisz i jak polecenie, które chcesz spróbować, okaże się. Jedyną rzeczą, której musisz unikać, kiedy to robisz, jest push
. Jeśli niczego nie naciskasz, jest to w 100% bezpieczny sposób wypróbowania wszystkiego, co chcesz.
Strach przed próbowaniem rzeczy jest jedną z największych przeszkód w nauce gita. To daje tak wiele kontroli nad wszystkim, że jest to swego rodzaju trudne. Rzeczywistość jest taka, że możesz trzymać się kilku bardzo bezpiecznych operacji przez większość codziennego użytku, ale znalezienie poleceń, które one są, zajmuje trochę czasu.
Dając im poczucie bezpieczeństwa , będą znacznie chętniej próbować wymyślić, jak to zrobić samodzielnie. Będą oni znacznie bardziej upoważnieni do znalezienia osobistego przepływu pracy na lokalnej maszynie, która będzie dla nich działać. A jeśli nie każdy robi to samo lokalnie , to jest w porządku, o ile są one zgodne z normami, co oni naciskać . Jeśli trzeba skompresować całe repozytorium przed wykonaniem operacji, aby poczuli się w ten sposób, nie ma sprawy; mogą wybierać lepsze sposoby robienia rzeczy na bieżąco i próbować różnych rzeczy. Coś, co sprawi, że zaczniesz próbować różnych rzeczy i zobaczysz, co to robi.
To nie znaczy, że trening jest bezwartościowy. Wręcz przeciwnie, szkolenie może pomóc ci zapoznać się z funkcjami, wzorami i normami. Ale to nie zastąpi siedzenia i robienia rzeczy w codziennej pracy. Ani git, ani SVN nie są rzeczami, na które możesz po prostu pójść na zajęcia i wtedy wiesz wszystko. Musisz ich użyć , aby rozwiązać problemy, aby się z nimi zapoznać i które funkcje są odpowiednie dla których problemów.
Przestań ich zniechęcać do poznawania tajników git
Wspomniałem, że nie pcham niczego, co jest sprzeczne z jedną z rzeczy, których ich uczysz: zawsze „Commit & Push”. Uważam, że powinieneś przestać im mówić, aby to zrobili i powiedzieć im, żeby zaczęli robić odwrotnie. Git ma w zasadzie 5 „miejsc”, w których można wprowadzić zmiany:
- Na dysku, niezaangażowane
- Zainscenizowane, ale nie zaangażowane
- W lokalnym zatwierdzeniu
- W lokalnej skrytce
- Zdalne repozytoria (tylko zatwierdzenia i tagi są zawsze wypychane i przenoszone między różnymi repozytoriami)
Zamiast zachęcać ich do ciągnięcia i pchania wszystkiego w jednym kroku, zachęć ich do wykorzystania tych 5 różnych miejsc. Zachęcaj ich do:
To zachęci ich do sprawdzenia swojej pracy, zanim zostanie ona publicznie udostępniona wszystkim, co oznacza, że wcześniej złapią swoje błędy. Zobaczą zatwierdzenie i pomyślą: „Poczekaj, nie tego chciałem”. W przeciwieństwie do SVN, mogą wrócić i spróbować ponownie, zanim zaczną naciskać.
Po przyzwyczajeniu się do zrozumienia, gdzie są ich zmiany, mogą zacząć decydować, kiedy pomijać kroki i łączyć określone operacje (kiedy wyciągać, ponieważ już wiesz, że chcesz pobrać + scalić lub kiedy kliknąć tę opcję Zatwierdź i pchnij) .
Jest to w rzeczywistości jedna z ogromnych zalet git nad SVN, a git został zaprojektowany z myślą o tym wzorcu użytkowania. Natomiast SVN zakłada centralne repozytorium, więc nic dziwnego, jeśli narzędzia dla git nie są tak zoptymalizowane dla tego samego przepływu pracy. W SVN, jeśli twoje zatwierdzenie jest błędne, jedynym realnym wyjściem jest nowe zatwierdzenie, aby cofnąć błąd.
Takie postępowanie w naturalny sposób doprowadzi do kolejnej strategii:
Zachęć ich do korzystania z lokalnych oddziałów
Lokalne oddziały w rzeczywistości ułatwiają wiele problemów związanych z pracą na udostępnianych plikach. Mogę wprowadzić wszystkie potrzebne zmiany we własnym oddziale i nigdy nie wpłyną one na nikogo, ponieważ ich nie naciskam. Potem, gdy nadejdzie czas, mogę korzystać ze wszystkich tych samych strategii scalania i rebase'u, tylko łatwiej:
- Mogę zmienić bazę mojego lokalnego oddziału, co sprawia, że scalenie go w master jest banalne.
- Mógłbym użyć zwykłego scalenia (utworzyć nowy zatwierdzenie) w master, aby wprowadzić w nim zmiany mojego oddziału lokalnego.
- Mogę połączyć wszystkie moje lokalne oddziały w jedno zatwierdzenie master, jeśli uważam, że mój oddział jest zbyt wielkim bałaganem do odzyskania.
Korzystanie z lokalnych oddziałów to także dobry początek do opracowania systematycznej strategii rozgałęziania. Pomaga użytkownikom lepiej zrozumieć ich własne potrzeby rozgałęziania, dzięki czemu możesz wybrać strategię opartą na potrzebach i bieżącym poziomie zrozumienia / umiejętności zespołu, a nie tylko spadek Gitflow, ponieważ wszyscy o nim słyszeli.
Podsumowanie
W skrócie, git nie jest SVN i nie można go tak traktować. Musisz:
- Wyeliminuj strach, zachęcając do bezpiecznych eksperymentów.
- Pomóż im zrozumieć, czym różni się git, aby mogli zobaczyć, jak to zmienia ich normalny przepływ pracy.
- Pomóż im zrozumieć dostępne funkcje, które pomogą im łatwiej rozwiązać problemy.
To wszystko pomoże ci stopniowo dostosować lepsze wykorzystanie git, aż osiągniesz punkt, w którym możesz zacząć wdrażać zestaw standardów.
Specyficzne funkcje
W najbliższym czasie pomocne mogą być następujące pomysły.
Rebase
Wspomniałeś o bazie zwrotnej i że tak naprawdę nie rozumiesz jej w swoim pytaniu. Oto moja rada: wypróbuj to, co właśnie opisałem. Wprowadź zmiany lokalnie, podczas gdy ktoś inny wprowadzi zmiany. Zatwierdź zmiany lokalnie . Spakuj katalog repozytorium jako kopię zapasową. Pobierz zmiany drugiej osoby. Teraz spróbuj uruchomić polecenie rebase i zobacz, co stanie się z twoimi zatwierdzeniami! Możesz czytać niekończące się posty na blogu lub szkolić się na temat rebase i tego, jak powinieneś lub nie powinieneś go używać, ale nic z tego nie zastąpi oglądania go na żywo. Więc spróbuj go.
merge.ff=only
To będzie kwestia osobistego gustu, ale polecam go przynajmniej tymczasowo, ponieważ wspomniałeś, że masz już problemy z rozwiązywaniem konfliktów. Polecam ustawienie merge.ff
naonly
:
git config --global merge.ff only
„ff” oznacza „przewijanie do przodu”. Szybkie łączenie do przodu ma miejsce, gdy git nie musi łączyć zmian z różnych zatwierdzeń. Po prostu przesuwa wskaźnik gałęzi do nowego zatwierdzenia wzdłuż linii prostej na wykresie.
W praktyce uniemożliwia to gitowi automatyczne próbowanie tworzenia zatwierdzeń scalania. Więc jeśli popełniam coś lokalnie, a następnie ściągam czyjeś zmiany, zamiast próbować utworzyć zatwierdzenie scalania (i potencjalnie zmuszając użytkownika do radzenia sobie z konfliktami), scalanie po prostu się nie powiedzie. W efekcie git wykona tylko fetch
. Jeśli nie masz żadnych lokalnych zatwierdzeń, scalanie przebiega normalnie.
Daje to użytkownikom możliwość sprawdzenia różnych zatwierdzeń przed próbą ich scalenia i zmusza ich do podjęcia decyzji o tym, jak najlepiej sobie z nimi poradzić. Mogę dokonać zmiany bazy, kontynuować scalanie (używając git merge --no-ff
do ominięcia konfiguracji), lub nawet po prostu odłożyć scalenie moich zmian na razie i obsłużyć je później. Myślę, że ten niewielki wzrost prędkości pomoże Twojemu zespołowi uniknąć błędnych decyzji dotyczących fuzji. Możesz pozwolić swojemu zespołowi wyłączyć tę funkcję, gdy zaczną one lepiej radzić sobie z fuzjami.