[GIT] Podręczny zestaw niezbędnych komend dla każdego webdevelopera i nie tylko
W tworzeniu różnego rodzaju oprogramowania zdarzają się sytuacje, gdy trzeba naprawić istniejące bugi/błędy lub zacząć współpracę z innymi programistami nad tym samym kawałkiem kodu. To są przykładowe sytuacje w których bardzo pomocnymi narzędziami pracy są repozytoria kodu, które zapewniają możliwie najaktualniejszy kod dla wszystkich programistów.
Typy repozytoriów
W chwili obecnej można się spotkać repozytoriami typu SVN, GIT czy CVS. Każdy z nich ma swoje wady i zalety, lecz najlepszym systemem repozytoriów, w mojej opinii i nie tylko, jest system GIT.
Dostęp do repozytoriów GITa można bardzo często spotkać w Internecie, chociażby ze względu na bardzo popularny serwis/hosting aplikacji Open Source - Github, gdzie można spotkać się z wieloma bardzo ciekawymi i użytecznymi projektami, nie wspominając chociażby o projekcie Twitter Bootstrap czy Backbone.js.
Zalety systemu GIT
W tym wpisie zamierzam się skupić na systemie GIT.
Do jego zalet można zaliczyć kilka rzeczy, takich jak:
- Łatwość tworzenia repozytoriów kodu, nie trzeba żadnej konfiguracji.
- Szybkość działania, dzięki czemu zmiany są widoczne w głównym repozytorium o wiele szybciej.
- Łatwe rozwiązywanie konfliktów w plikach (chociaż i tak bywa to trudne czasem).
- Łatwość rozbicia zmodyfikowanego kodu na małe porcje, np. zmiany w jednym pliku można rozdzielić na wiele commitów w których znajdują się tylko wybrane zmodyfikowane linie kodu z pliku.
- Tworzenie lokalnych branchy z kodem (lokalnych kopii kodu) na których można pracować bez zakłócania pracy innych programistów.
- Znacząco usprawnia workflow tworzenia oprogramowania.
- Każda zmiana w kodzie ma swoje własne oznaczenie, dzięki czemu usuwanie/zmienianie niepoprawnego kodu jest proste.
- Można przygotować wiele mniejszych commitów i wysłać je za jednym razem.
GIT ma też wady, nic nie jest idealne. Można do nich zaliczyć:
- Brak możliwości pobierania tylko części repozytorium, np. jednego folderu z całości. Pobierane jest wszystko.
- Brak śledzenia pustych folderów, czyli nie można sobie najpierw przygotować struktury folderów (bez plików w nich) i "zacommitować".
Te zalety i wady spotykam w codziennym użytkowaniu systemu GIT. Być może są też inne występujące w szczególnych przypadkach.
Lista przydatnych komend GIT
- git init
- Inicjalizuje repozytorium GIT w danym katalogu
- git add [nazwa_pliku]
- Dodaje zmiany we wskazanym pliku do commita
- git add .
- Dodaje wszystkie zmienione pliki do commita
- git add -p [nazwa_pliku]
- Udostępnia możliwość dodania wybranych linii w zmodyfikowanym pliku do commita
- git commit -m "[treść_commita]"
- Dodaje opis do commita. Dobrym zwyczajem jest opisanie co ta zmiana wprowadza do kodu w zakresie funkcjonalnym
- git add origin [adres_repozytorium, np. https://github.com/username/moje-repozytorium.git]
- Ustawia konkretny adres zdalnego repozytorium jako główne repozytorium
- git push origin master
- Wysłanie zmian do branacha zdalnego
- git push -f
- Wysłanie zmian do zdalnego repozytorium ignorując konflikty, to znaczy, że jeśli wystapią konflikty to pliki zostaną nadpisane właśnie wysłaną wersją. Trzeba stosować to bardzo ostrożnie.
- git checkout [nazwa_brancha]
- Zmienia aktywny branch na wybrany przez użytkownika
- git checkout [nazwa_pliku]
- Usuwa zmiany w wybranym pliku
- git checkout .
- Usuwa zmiany we wszystkich zmienionych plikach
- git checkout -b [nazwa_brancha]
- Tworzenie nowego brancha z aktywnego brancha i przełączenie się na niego
- git rebase master
- Zaciągnięcie zmian z brancha głównego do brancha aktywnego
- git push origin :[nazwa_brancha]
- Usunięcie zdalnego brancha
- git branch -d [nazwa_brancha]
- Usuwanie brancha lokalnie. Nie można usunąć w ten sposób aktywnego brancha
- git stash
- Dodanie zmienonych plików do pamięci/stosu i usunięcie ich z aktywnego brancha
- git pull --rebase
- Pobranie najnowszych zmian z aktywnego brancha zdalnego
- git stash pop
- Przywrócenie zmodyfikowanych plików z pamięci/stosu
- git stash clear
- Czyszczenie pamięci/stosu
- git remote prune origin
- Pobranie aktualizacji o usuniętych branchach zdalnych
- git fetch --all
- Pobranie listy zdalnych branchy
- git branch
- Wyświetlenie listy lokalnych branchy
- git branch -r
- Wyświetlenie listy zdalnych branchy
- git status
- Wyświetlenie listy zmienionych plików
- git diff [nazwa_pliku]
- Szczegółowe wyświetlenie zmian w wybranym pliku
- git reset HEAD
- Resetowanie przygotowanych commitów (przed wysłaniem). Zmodyfikowane pliki są dostępne do ponownego dodania.
- git reset HEAD --hard
- usuwanie wszystkich zmian z brancha lokalnego i przywrócenie zmian z brancha zdalnego
- git reset HEAD^ --hard
- Usuwanie ostatniego commita z brancha
- git reset HEAD^^
git reset HEAD~2 - Obydwie komendy usuwają ostatnie 2 zmiany z brancha. Im więcej daszków (^) tym więcej commitów zostanie usuniętych.
- git rebase -i HEAD~3
- Interaktywne zmienianie zawartości, opisów commitów. Commity mozna łączyć wtedy w jeden duży, zmienić jego opis, itd.
Powyższe polecenia stosujemy w terminalu lub wierszu poleceń. Nie oznacza to jednak, że jesteśmy zmuszeni korzystać z GITa w sposób tekstowy. Istnieją różne nakładki graficzne na interfejs GITa, dzięki czemu korzystanie z niego jest przyjemniejsze. Dla systemów Windows istnieją aplikacje: GIT GUI lub aplikacja z GitHuba.
Powyższa lista komend na pewno nie wyczerpuje listy dostępnych komend, ale pozwala w zadowalający sposób pracować z tym system repozytoriów. Jeśli znasz jeszcze inne ciekawe komendy, które można wykorzystać w codziennej pracy, to zapraszam do dzielenia się nimi w sekcji komentarzy.