Git a inne systemy kontroli wersji (svn i bzr)

Miałem okazję zapoznać się z trzema systemami kontroli wersji, Subversion, Bazaar i git (w tej kolejności). Każdy ma swoje wady i zalety, jednak ze wszystkich trzech dla mnie git jest najwygodniejszy i najsprawniejszy. Tak jak z Subversion, czy później z Bazaarem, tak i z gitem miałem początkowo problem by płynnie korzystać z jego możliwości, ale wygoda rośnie w miarę używania. Dla swojej (i być może innych) wygody, postaram się tutaj przybliżyć podstawowe komendy git'a a także odpowiedniki w dwóch pozostałych systemach kontroli wersji.

Ale najpierw zacznę od paru zdań na temat różnic pomiędzy oboma systemami. Czym różnią się od siebie te systemy?

  • Subversion, popularny svn jest scentralizowanym system. Zmiany zapisujemy w centralnym miejscu, ale zanim to zrobimy, musimy zaktualizować nasze drzewo robocze i rozwiązać konflikty. Perspektywa nieco przerażająca. Efektem tego jest praktycznie brak atomowych commitów, które zastępowane są przez zbiorcze zmiany (np. raz dziennie). Oczywiście nawet to jest niemożliwe, gdy repozytorium jest niedostępne.
  • Bazaar, popularyzowany przez Canonical i jego platformę Launchpad. Jest to już zdecentralizowany system kontroli wersji. Można spokojnie commitować tak zwane atomowe zmiany i robić w swoim własnym repozytorium, bez połączenia z centralnym. Tutaj każde repozytorium jest osobną gałęzią pomiędzy którymi możemy przenosić zmiany, łącznie z historią zmian (push & merge). Z własnego doświadczenia wiem jedno, jest wolny. Wolniejszy, jeśli używać jeszcze programu GUI (np. Bazaar Explorer).
  • A git? Git podobnie jak Bazaar jest zdecentralizowanym repozytorium. Brakuje nawet jako takiego centralnego repozytorium, choć taka architektura projektu na gicie również jest możliwa. Każde repozytorium jest jednocześnie kontenerem gałęzi, a przełączając się pomiędzy gałęziami, zmienia się struktura plików fizycznych na odpowiadające tym, z aktualnie używanej gałęzi. W projektach zauważyłem jeszcze jedno: jest szybki. Według różnych informacji tzw. zasłyszanych, nie jest wcale szybki pod Windowsem, ale... osobiście nie używam Windowsa do pracy (chyba, tylko po to, by skorzystać z Corela).

Również do commitów (zapisów zmian) te trzy systemy podchodzą różnie. O ile dobrze pamiętam, w commitach svn wszystkie zmiany są dołączane automatycznie, podobnie jest w bazaarze. Zmiany te można pominąć. Natomiast git wymaga od nas zadeklarowania zmian, które chcemy załączyć, czy to jest dodawanie, zmienianie, czy usuwanie plików. Bywa to męczące przy dużej ilości zmian, ale z drugiej strony, urokiem repozytoriów rozproszonych takich jak Bazaar, czy git, są właśnie atomowe commity, a nie zbiorcze jak w Subversion.

W gicie można wyróżnić sześć podstawowych operacji umożliwiających przenoszenie zmian pomiędzy drzewami i repozytoriami.

git init

Polecenie to tworzy nowe repozytorium. Odpowiednikiem tego polecenia w Bazarze jest bzr init (o ile mnie pamięć nie myli), a w Subversion... Subversion inicjuje się na centralnym serwerze, a lokalnie ściąga aktualną wersję za pomocą svn checkout.

git clone

Umożliwia utworzenie lokalnej kopii innego repozytorium. Polecenie to inicjuje repozytorium git we wskazanym miejscu i ściaga historię zmian z danego repozytorium "zdalnego". Odpowiednikiem w Bazarze jest bzr branch - jako, że w bazarze każde repozytorium to osobna gałąź, a w Subversion - svn checkout - kopiuje aktualną wersję kodu do wskazanego miejsca.

git merge

To polecenie służy to łączenia zmian z różnych gałęzi. Odpowiednikiem Bazaara jest bzr merge, z tym, że w bazaarze każde repozytorium jest gałęzią, natomiast Subversion... nie używałem go na tyle długo i dogłębnie, by zapamiętać. Chociaż pamiętam próbę tworzenia "gałęzi" w repozytorium svn.

git fetch

To polecenie służy do ściągnięcia informacji o stanie zdalnego repozytorium. Dzięki temu git może wyświetlić porównanie pomiędzy repozytorium lokalnym, a zdalnym, ile różnych zmian posiada każde z repozytoriów, i czy łączenie przebiegnie bezboleśnie. Odpowiedników z Bazaara brak, w Subversion tym bardziej.

git pull

Służy do ściągania zmian z repozytorium zdalnego z konkretnej gałęzi. Odpowiednikiem w Bazaarze jest podobnie bzr merge, a w Subversion svn update/svn checkout.

git push

Ostatnie z poleceń jest przydatne w przypadku scentralizowanej struktury repozytoriów. Służy ono do "popchnięcia" zmian z określonej gałęzi repozytorium lokalnego, na określoną gałąź repozytorium zdalnego (i ewentualne utworzenie gałęzi). git push umożliwia również popchnięcie tagów. Odpowiednikiem w Bazaarze jest bzr push, natomiast Subversion takiego odpowiednika nie posiada.

Komentarze

Comments powered by Disqus