GIT – system kontroli wersji, wprowadzenie
Jak czytamy na wikipedii GIT to rozproszony system kontroli wersji (jeden z wielu) udostępniany na licencji GNU GPL w wersji 2. Jednak sama definicja nie wiele mówi. Postaram się przybliżyć w tym wpisie czym jest GIT, jakie korzyści płyną z korzystania z niego oraz opis podstawowych komend, bez których korzystanie z tego systemu kontroli wersji będzie niemożliwe.
Przyjrzyjmy się na początku samej historii. GIT-a stworzył Linus Torvalds – fiński programista, który potrzebował narzędzia, które będzie kontrolowało zmiany w plikach wprowadzane przez wielu użytkowników. Ponieważ żadne z dostępnych aplikacji nie spełniało jego wymagań to 2005 roku stworzył właśnie GIT-a, który do dziś wspiera tworzenie jądra Linux-a (którego Torvalds jest autorem) i miliony innych aplikacji.
System kontroli wersji
System kontroli wersji (ang. version/revision control system, VCS) – szumnie brzmi… a czym tak na prawdę jest? Wyobraź sobie, że masz dokument (wzór), który pobrało kilka osób. Każda z nich postanowiła poprawić (ulepszyć) jeden rozdział. Następnie każda z tych osób chce wprowadzić swoje zmiany we wzorze. Aby wszystkie zmiany zostały wprowadzone muszą te osoby się porozumieć, aby każdy naniósł tylko swoje ulepszenia i nie usunął innych.
Nad tym wszystkim czuwa właśnie system kontroli wersji. GIT pozwala skopiować zdalne repozytorium (clone) – nie tylko jeden dokument (plik), a wiele. Nanieść poprawki oraz stworzyć nowe pliki (add), skomentować naniesione modyfikacje (commit) oraz wysłać je do repozytorium (push). Wszystkie zmiany są podpisane przez autora i zawsze możemy wrócić do dowolnej wersji naszego dokumentu.
GIT informuje nas również o ewentualnych problemach (kolizjach) przy wysyłaniu zmian. Tego typu problemy występują, gdy osoby zmodyfikowały ten sam fragment kodu i aplikacja nie wie, która część jest poprawna.
Korzyści płynące z używania GIT-a
- historia wszystkich zmian
- powrót do dowolnej zmiany
- wygodna praca wielu użytkowników
- pełna kontrola kolizji
- statystyki wydajności użytkowników
- backup (kopia bezpieczeństwa)
Podstawowe komendy
- git init – inicjalizujemy repozytorium w katalogu, w którym obecnie się znajdujemy
- git config --global user.name [nazwa użytkownika] – tworzymy nazwę użytkownika, który modyfikuje pliki (globalnie)
- git config --local user.name [nazwa użytkownika] – tworzymy nazwę użytkownika, który modyfikuje pliki (lokalnie, tylko w tym projekcie)
- git config --global user.email [adres email] – tworzymy email użytkownika, który modyfikuje pliki (globalnie)
- git config --local user.email [adres email] – tworzymy email użytkownika, który modyfikuje pliki (lokalnie, tylko w tym projekcie)
- git add [nazwa pliku] – dodajemy pliki do poczekalni (ang. staging area)
- git add -f [nazwa pliku] – wymuszenie dodania do poczekalni pliku zdefiniowanego w .gitignore
- git add . – dodajemy wszystkie pliki do poczekalnie znajdujące się katalogu
- git add --dry-run [nazwa pliku] – symulujemy dodanie do poczekalni, aby sprawdzić czy nie dodamy czegoś niepotrzebnie np. git add --dry-run js/*.js
- git add -p – dodajemy do poczekalni tylko część zmian
- git commit -m [komentarz] – dodajemy pliki do historii wraz z odpowiednim komentarzem
- git commit --amend [komentarz] – dodajemy zmiany do poprzedniego commita
- git commit --amend --reset-author [komentarz] – zmieniamy autora commit-a
- git status – informacja o naszym repozytorium lokalnym tj. jakie pliki dodaliśmy do poczekalni, jakie nie itp.
- git log – informacja o historii naszych zmian
- git log --oneline – informacja o historii w jednej linii
- git diff – porównuje zmiany w naszym repozytorium
- git reset HEAD [nazwa pliku] – usuwa plik z poczekalni
- git checkout -- [nazwa pliku] – usuwa modyfikacje z pliku
- git rm --cached [nazwa pliku] – usuwa plik z repozytorium, ale zostawia na dysku
- git rm --force [nazwa pliku] – usuwa plik z repozytorium i z naszego dysku
- git reset HEAD --hard – cofamy wszystkie zmiany
- git reset HEAD --hard – cofamy wszystkie zmiany
- git reabase -i – tryb interaktywny do zmian commit-ów
- git show [identyfikator commit-a] – pokazuje zmiany w danym commit-cie
Plik .gitignore
Dzięki temu plikowi umieszczonemu w katalogu głównym naszego projektu wymuszamy ignorowanie dodania do poczekalni plików, które mogły by zostać dodane za pomocą komendy git add . . Poniżej zamieszczam kilka przykładowych wykluczeń. Pamiętaj, że nie musimy używać kompletnych nazw/ścieżek.
- # ignoruj pliki o rozszerzeniu o lub a
- *.[oa]
- # ignoruj pliki zakończone znakiem ~
- *~
- # ignoruj pliki o rozszerzeniu .b
- *.b
- # ale uwzględniaj lib.b, pomimo ignorowania .b w linijce powyżej
- !lib.b
- # ignoruj plik TODO w katalogu głównym, ale nie podkatalog/TODO
- /TODO
- # ignoruj wszystkie pliki znajdujące się w katalogu build/
- build/
- # ignoruj doc/notatki.txt, ale nie doc/server/arch.txt
- doc/*.txt
Polecam dokładne zapoznanie się z dokumentacją.