Jak śledzić zmiany w kodzie, część 1

Systemy kontroli wersji oprogramowania są jednym z podstawowych narzędzi programisty. Dlatego już na samym początku dobrze jest się z nimi zapoznać. Główną funkcją systemów kontroli wersji (ang. Version Control Systems – VCS) jest umożliwienie śledzenia zmian w naszym kodzie.

Tworząc oprogramowanie piszemy kod, który z czasem się zmienia i ewoluuje. Dodajemy nowe funkcje, poprawiamy błędy, wprowadzamy ulepszenia. Musimy wiedzieć, kiedy wprowadziliśmy konkretną zmianę a także potrafić ją cofnąć, gdy okaże się być błędna.

Historia zmian

Wyobraźmy sobie, że stworzyliśmy stronę internetową i umieszczamy ją na publicznym serwerze, tak aby każdy mógł ją otworzyć (przyjmijmy że jest to wersja numer 1). Po tygodniu okazuje się, że popełniliśmy błąd. Poprawiamy go i całą stronę znowu publikujemy na serwerze. Jest tam więc już wersja numer 2. Jednak po kolejnym tygodniu dochodzimy do wniosku że to wersja numer 1 była lepsza i chcemy wrócić do niej.

Jeśli pracujemy na tych samych plikach (na przykład edytujemy plik index.html) to niestety został on nadpisany i musimy z pamięci cofnąć poprawki wprowadzone w wersji numer 2. Sytuacja komplikuje się, gdy nad naszą stroną pracuje kilka osób a zmiany zostały wprowadzone dawno temu. Po prostu nie pamiętamy jak nasz kod wyglądał wcześniej.

Przed systemami kontroli wersji (VCS) popularnym rozwiązaniem było tworzenie kopii zapasowych takiej strony. Po opublikowaniu strony kopiowaliśmy cały folder i nadawaliśmy mu nazwę na przykład StronaGlowna_20180501. Wprowadzając poprawki najpierw robiliśmy kopię tego folderu a po opublikowaniu poprawek kopiowaliśmy cały folder ponownie, ale już z inną nazwą: StronaGlowna_20180508. Dobrze jak pojawił się też numer wersji, na przykład StronaGlowna_v2_20180508.

Jednak takie ręczne kopiowanie (i zarządzanie) wersjami naszych programów jest bardzo uciążliwe. Tym bardziej jeśli interesowałyby nas konkretne zmiany. Musielibyśmy ręcznie porównywać pliki, aby zorientować się która linijka kodu się zmieniła. Jest to nie tylko czasochłonne ale i może generować różne błędy.

I tutaj właśnie pojawiają się systemy kontroli wersji VCS. Automatyzują one za nas ten cały proces. To znaczy, jest jakaś zewnętrzna aplikacja, która przegląda kod i wrzuca go do wirtualnego katalogu z konkretną datą i wersją. Wprowadzone zmiany natomiast porównuje z poprzednimi wersjami kodu i również zapisuje tak, aby łatwo było nam poruszać się po całej historii naszego oprogramowania.

Jest też wiele podejść do problemu jak śledzić zmiany w kodzie. Jedne systemy, tworzą lokalne kopie folderów i przenoszą pliki pomiędzy nimi. Inne systemy pracują na tym samym folderze i przechowują ukrytą historię zmian w postaci różnic pomiędzy wersjami. W ten sposób mając wersję numer 1 i listę zmian w danym pliku potrafimy uzyskać kod każdej kolejnej wersji.

Jedne systemy pracują lokalnie na naszym komputerze. Inne mają centralny serwer, na którym znajduje się tak zwane główne Repozytorium.

Współpraca wielu programistów

Chyba najważniejszą funkcją systemów VCS jest umożliwienie współpracy wielu programistów nad tym samym kodem. Bo wyobraźmy sobie sytuację, gdzie posługujemy się starym sposobem i tworzymy foldery z coraz to nowym kodem. Po pewnym czasie tych folderów jest już bardzo dużo i gdy ktoś inny wprowadzi zmiany, na przykład w wersji 3, to musi poinformować o tym innych: słuchajcie w katalogu StronaGlowna_v3_20180510 w pliku index.js w linijce 8 dodałem jeden parametr.

Trochę to nieefektywne. Dodatkowo jeżeli mamy kilka wersji kodu, który musimy wspierać powinniśmy zmianę w wersji numer 3 rozpropagować do nowszych wersji. A co w sytuacji, gdy ktoś inny dodał kilka linijek kodu przed linijką numer 8?

Na szczęście dzięki systemom VCS współpraca kilku programistów nad tym samym kodem jest prostsza. Nie jest ona bardzo prosta i czasami powoduje pewne problemy, ale są one dużo łatwiejsze do rozwiązania właśnie dzięki zastosowaniu wszystkich mechanizmów systemów VCS.

Dodatkowo systemy VCS mogą służyć nie tylko programistom. Ich główną funkcją jest śledzenie zmian dokonywanych w plikach. Jeżeli mamy na przykład pliki Word z pracą magisterską, możemy po każdym rozdziale tworzyć nowa wersję tego pliku z odpowiednim opisem (na przykład Dodałem rozdział z wynikami badań). Niestety plik Word nie jest czystym plikiem tekstowym, więc nie będziemy mogli dokładnie podejrzeć co zostało zmienione. Ale łatwo będziemy mogli przełączać się pomiędzy różnymi wersjami dokumentu bez potrzeby ręcznego tworzenia kopii.

Kiedyś nawet zaproponowaliśmy używanie systemów VCS do przechowywania ustaw polskiego prawa i wszelakich poprawek do nich, ale politycy chyba nie podchwycili pomysłu 🙁 Chyba dlatego że od razu byłoby wiadomo kto odpowiada za konkretny zapis w naszym prawie 🙂

GIT oraz GITHUB.COM

Lista różnych systemów VCS jest bardzo długa (Link do Wikipedii). Na przestrzeni lat powstało ich wiele i mają swoje własne koncepty, ale ogólna idea jest praktycznie taka sama.

Obecnie chyba najbardziej popularnym systemem VCS jest Git (Link do Wikipedii). Został stworzony już w 2005 roku i jest rozwijany do dzisiaj. Jest to rozproszony system kontroli wersji, czyli centralne repozytorium kodu nie jest wymagane. Każdy programista pracujący nad danym kodem ma swoją lokalną wersję całej historii. Zmiany wprowadza lokalnie i kiedy uzna, że nadeszła pora podzielenia się swoją pracą następuje tak zwane scalanie zmian (mergowanie).

Jednak takie rozproszone dzielenie się swoją pracą też nie jest bardzo efektywne, szczególnie gdy pracujemy nad dużym projektem. Dlatego też mimo że centralne repozytorium kodu nie jest wymagane w Git to powstały strony, które umożliwiają właśnie takie rozwiązanie. Dzięki czemu proces dzielenia się swoimi zmianami przebiega w zorganizowany sposób.

Istnieje kilka takich serwisów, na których możemy założyć sobie konto i stworzyć takie repozytoria kodu (Link do Wikipedii). Najbardziej popularnym jest strona github.com. Jest to darmowy  serwis dla Gita. Jednak darmowe repozytoria są dostępne publicznie, czyli każdy może przeglądać trzymany tam kod. Dla jednych jest to zaleta, dla innych już niekoniecznie.

Proszę nie mylić, ani nie utożsamiać serwisu github oraz systemu git. Są to dwie różne rzeczy. Github jest jedynie miejscem, które umożliwia współpracę wielu programistów w oparciu o gita.

Oprócz serwisu Github popularne są również: Bitbucket, Gitlab czy Visual Studio Team Services.

Ostatnio serwis Github został kupiony przez firmę Microsoft i widać dużą tendencję przenoszenia repozytoriów z kodem do serwisu Gitlab 🙂

Poniżej przedstawiam screen z serwisu Github z repozytorium vue.js (popularnego frameworku JavaScript do tworzenia UI).

source_tree_2

Jak widać na screenie, wiele osób wprowadzało zmiany do projektu. Możemy prześledzić całą historie zmian oraz zobaczyć szczegóły (datę, czas, kod). Widzimy różne gałęzie kodu, gdzie programiści równolegle wprowadzają zmiany dotyczące osobnych rzeczy. Dokładniej wszystkie te rzeczy omówimy w następnym poście.

Dla porównania screen z historii zmian w projekcie gry Szybkie Palce!.

source_tree_1

Jak widać jest on dużo prostszy niż poprzedni. Niemniej jednak i w takim przypadku posiadanie kodu w systemie kontroli wersji VSC przynosi wymierne korzyści.

Na koniec

Dziś dowiedzieliśmy się czym są systemy kontroli wersji (VSC) a także poznaliśmy najbardziej popularny (Git) oraz dowiedzieliśmy się, że są strony, które ułatwiają współpracę wielu programistów (najbardziej popularny to Github).

W następnym poście skupimy się na zasadzie działania systemu Git. Omówimy podstawowe pojęcia i stworzymy wspólnie repozytorium dla nowego projektu w serwisie Github.

1 reply

Trackbacks & Pingbacks

  1. […] Jak śledzić zmiany w kodzie, część 1 […]

Leave a Reply

Want to join the discussion?
Feel free to contribute!

Leave a Reply

Your email address will not be published. Required fields are marked *