Po wielu latach z CVS (Coyote) i SVN (sporo różnych projektów) przyszedł czas na oswojenie Gita.
O ile te pierwsze z czasem okazały się logiczne, o tyle Git po plus/minus miesiącu użytkowania nadal wydaje mi się całkowicie nielogiczny, a biorąc pod uwagę jego popularność wina musi leżeć między klawiaturą a krzesłem. A ponieważ zaczynam go używać prawie co dzień, to czas dopytać o szczegóły zanim się zniechęcę.
Wkręciłem się w pewien open sourcowy projekt hostowany na Google Code. Wbiłem na ten projekt i zrobiłem sobie prywatnego forka. W przeciwieństwie do SVN, Git trzyma informację o tym, że jest to fork i pozwala na synchronizację.
Do obsługi używam TortoiseGit, bo jestem mocno przyzwyczajony do TortoiseSVN.
Przeczytałem od deski do deski ten tutorial ze wspomnianego wcześniej projektu.
Do rzeczy. Generalnie jakoś udaje mi się wysyłać poprawki do swojego repo, część została już wcielona do głównego repo, ale...
Przedstawię w kolejności kroki, które wykonuję, bo tak zrozumiałem tego tutoriala.
- zmieniam kod na localu
- komituję lokalnie (inaczej się nie da)
- używając okna Git Sync...
3 a) fetch&rebase z oryginalnego repo - ten krok jak dobrze zrozumiałem jest po to, by swoje lokalne poprawki nanieść niejako na najnowszy kod, a nie ten, z którym zacząłem pracę w punkcie 1
3 b) tutaj Git jedzie od początku stworzenia mojego forka, za każdym razem (wg mnie powinien od ostatniej pobranej rewizji w poprzednim fetchu)
3 c) niestety, za każdym razem pokazuje te same konflikty w tych samych plikach - co ciekawe, niektórych nigdy nie ruszałem, więc nie ma mowy o lokalnych zmianach!
3 d) po każdym rozwiązanym konflikcie muszę nacisnąć "commit"
3 e) po ręcznym rozwiązaniu konfliktów (niedługo będę znał je na pamięć) pora na pulla...
3 f) push do mojego repo nie przechodzi, każe mi zrobić najpierw pull (po grzyba? przecież tylko ja tam pushuję, więc powinien widzieć, że ostatnia rewizja na repo się nie zmieniła, nie kumam)
3 g) Git wymusza na mnie kolejnego commita, tym razem w opisie commita wypełnia mi message jako:
Merge branch 'master' of https://code.google.com/r/maroonedmb-ardupilot
Conflicts:
<lista plików>
No files affected
3 h) "No files affected" ?! to dlaczego twierdził, że rozwiązałem jakieś konflitky? jedziemy dalej...
3 i) dopiero w tym punkcie mam możliwość zrobić push by moje zmiany z commita z punktu 2) poszły na repo na google code
Bardzo długi proces jak na prostą zmianę paru plików i wysłanie do repo. W SVN fakt, że nie ma tego fetch&rebase bo repo nie są połączone, ale to są 2 kroki!
Na koniec wiśniówka na torcie. Zobaczcie na tego screena:
Zaznaczyłem wybraną zmianę. Dlaczego za każdym razem są te same z innymi hashami? Z jednej strony to ta sama zmiana, z drugiej inny hash podpowiada, jakoby to były inne commity/pushe.
Przyznaję wprost, że totalnie nie rozumiem tego systemu i stawiam browca w Pozku temu, kto mnie oświeci i ułatwi pracę (czyli brak tych samych konfliktów przy każdej próbie wysłania swoich zmian do repo).
Ugh... damn you Linus!