GIT to rozproszony system kontroli wersji, dzięki któremu mamy możliwość rejestracji zmian w plikach w czasie. Pozwala on na przywrócenie całego projektu do poprzedniego stanu, porównanie zmian w czasie, sprawdzenie kto ostatni modyfikował pliki.
Korzystanie z GITa oznacza również, że jeśli coś zepsujesz lub stracisz pliki, możesz je łatwo odzyskać.
SHA - hash wg. algorytmu SHA1 w postaci 40 znaków: zawartość + rodzic + data + autor + message
WC - Working Copy - aktualny stan plików w lokalnym folderze z repozytorium
HEAD - jeden konkretny commit będący źródłem aktualnej working copy
@ to alias HEAD; sprawdź: git show HEAD | @
tip - ostatnie commity w gałęziach/branczach
tagi, head - to referencje
branch, HEAD - to referencje
head - referencja na tip, wskaźnik na ostatni najnowszy commit w gałęzi; tyle jest head ile gałęzi
Detached HEAD - gdy HEAD nie wskazuje na tip
git init # inicjije repozytorum; tworzy ukryty folder .git
#
# Klonowanie do bieżącego (.) folderu
git clone ssh://git@gitlab.example.com/group/repository.git .
# Klonowanie z redukcją głębokości --depth 5 lub bez całej historii --depth 1
git clone --depth 5 --no-single-branch --no-tags ssh://git@[...]/repository.git .
# --depth 1 # Kolonowanie repo bez całej historii
# --no-single-branch - ściąga wszystkie branche inaczej tylko bieżący
# --no-tags - bez tagów
# --filter=blob:limit=<n>[kmg] omija duże plik blobs powyżej n bytes.
# Jednostki: k, m, g lub KiB, MiB, GiB np: blob:limit=1k to to samo co blob:limit=1024
# Sprawdź największy plik PNG, JPG, WEBP i ustaw taki limit!
#
git config --list # wyświetla całą konfigurację
# Zakresy:
# --system - systemowa raczej nie używać;
# --global - globalna dla usera: ~/.gitconfig
# --local - lokalna dla danego repo .git/config
git config --global --list # wyświetla ustawienia globalne gita
git config <klucz> <wartość> # ustawia konfigurację dla klucza
git config --global user.name 'Jan Kowalski' # ustawia globalnie NAZWĘ właściciela repo
git config --global user.email jan.kowalski@gmail.com # ustawia glob. EMAIL właściciela repo
git config push.followTags true # ustawia pusha że tagi annotated będą wysyłane automatycznie
git config <klucz> # wyświetla konfigurację dla klucza
git config --global user.name # Np. wyświetla globalnego usera
git config --unset <klucz> # czyści konfigurację dla podanego klucza
git config --local --unset user.email # Np. kasuje lokalny email
git config --edit # edycja lokalnego pliku konfiguracyjnego
git config --edit --global # edycja globalnego pliku konfiguracyjnego
git config --edit --system # edycja systemowego pliku konfiguracyjnego
git config --edit # --local # edycja pliku konfiguracyjnego dla bieżącego repo
# Tworzy plik wspólnej/wersjonowanej konfiguracji dla wszystkich pracowników
git config --file .gitprjconfig <grupa>.<klucz> <wartość>
git config --file .gitprjconfig push.followTags true
git config include.path ../.gitprjconfig # Skonfiguruje lokalną konfigurację .git/config stąd ..
# Warunkowe inkludowanie konfiguracji z dodatkowego pliku
git config --global includeif.gitdir:/C/VHOST/project/.path .gitconfig.roll
git log # gitlog - lista commitów
git log --oneline # styl jedno wierszowy
git log -4 --oneline # 4 ostatnie komity jednowierszowo
git log --graph --oneline # log z narysowanymi branchami
git log --oneline >plik_comm.txt # przekierowanie gitloga do pliku
git log --oneline | grep -i sql # szukanie słowa 'SQL' w gitlogu case insensitive
git log | grep -i sql # jak wyżej w wersji pełnej
git log --diff-filter=A -- file # szukanie pliku z filtrem: A_dded C_opied D_eleted M_odified R_enamed
git log -S "charakterystyczny string" # wyświetla commity które zmieniały liczbę wystąpień charakterystycznego stringu
git add . # Dodaje wszystkie pliki do śledzonych
git add file # Dodaje plik do śledzonych
git add -p # Tryb interaktywny 'path', gdzie możesz dodać pojedynczy HUNK a nie tylko cały plik
git commit . # tworzy commit otwierając domyślny edytor
git commit -m 'treść tytułu commita' # tworzy commit dodając tytuł commitia z parametru -m
git commit --amend # poprawka treści commita, możesz zmienić -m "nowy komentarz"
git push --force # wymuszony push np. po --amment (nie rób na wspólnych branchach)
git push -u origin master # lub --set-upstream pushowanie brancha na zdalne repo
git push -u origin MOJ_BRANCH:Nowak_branch # pushowanie brancha ze zmianą nazwy z którą zmapowana jest nazwa lokalna
git push --tags # wysyła zmiany włączając WSZYSTKIE tagi (nie zalecane/zaśmieci tagami repo)
git push --follow-tags # wysyła zmiany TYLKO z tagami annotated czyli onotowanymi (z adnotacją)
git push origin TAG_NAME # wysyła tag do zdalnego repo
git push origin --delete MOJ_BRANCH # kasuje zdalny branch
git push origin :Nowak_branch # kasuje zdalny branch(2)
git push origin :TAG_NAME # kasuje zdalny tag
git push --mirror origin # wysyła wszystkie branche i tagi, jak backup lokalnego repo
git pull # pobiera zdalny brancz integrując z lokalnym repo, jest jak git fetch + merge
git pull --rebase # pobiera zdalnych zmian integrując z wykorzystaniem funkcji rebase
#
git fetch # pobiera zdalny branch nie integrując z lokalnym repo
git fetch --no-tags # ściąga bez tagów
git fetch --prune -prune-tags # usuwa lokalnie tagi które wcześniej usunięto ze zdalnego repo
git diff # pokazuje różnice pomiędzy WC a aktualnym commitem
git diff --word-diff # pokazuje zmiany obok siebie a nie pod spodem
git diff SHA1 SHA2 # pokazuje zmiany pomiędzy danymi commitami
git diff SHA1 SHA2 --name-only # pokazuje tylko zmienione pliki pomiędzy danymi commitami
git diff --no-index old_file new_file # porównanie plików których jeszcze nie ma w index/stage/cache
git diff --cached # pokazuje zmiany tylko w plikach które zostały dodane do indexu/stage/cache
git fetch --prune
# lub
git remote update origin --prune
git fetch --prune -prune-tags # usuwa lokalne tagi które usunięto ze zdalnego repo
git fetch --no-tags # pobiera repo bez tagów (gdy repo z niepewnego źródła)
#
git checkout <branch> # przechodzimy do danego brancha
git chackout SHA # przechodzimy do danego commita
git checkout - # powraca na poprzednią gałąź a dokładnie na poprzedni HEAD
git checkout SHA -- path/plik # Pobieranie pojedynczego pliku z innego commita
git merge BRANCH # merge brancha BRANCH do bieżącego
git merge --no-ff BRANCH # merge bez fast-forward, wymusi stworzenie oddzielnego commita
git branch -m nowa_nazwa # Zmienia nazwę bieżącej gałęzi
git branch -a # listuje wszystkie branche także zdalne
git stash # chowa bieżące zmiany do schowka pozostawiając "czyste" WC
git stash list # wyświetla listą schowków (ostatni ma nr zerowy)
git stach pop # wprowadza zmiany z powrotem ze schowka, usuwa schowek
git stash save -u 'Nazwa schowka' # chowa bieżące zmiany do schowka nazywając te zmiany
git stach apply # podobnie jak pop wstawia zmiany ale nie usuwa schowka
git stach drop # porzuca zmiany które mamy w schowku
git reset # zeruje/czyści zmiany w indexie
git reset --hard # zeruje zmiany do ostatniego commita na danym branchu
git reset SHA # zeruje zmiany do commita SHA
git reset --hard SHA # zeruje zmiany do SHA, kasując nieskomitowane??nieśledzone pliki z WC
git clean -f # Usuwa nieśledzone pliki -f force dodatkowe zaabezpieczenie
git clean -n # Lub --dry-run robi symulacje co było by usunięte
git clean -d -f # usuwa także puste katalogi
git clean -x -d -f # usuwa nieśledzone pliki włączenie z ignorowanymi przez .gitignore
git clean -i # tryb interaktywny
git tag TAG_NAME SHA # dodanie tagu light (bez opisu) o nazwie TAG_NAME
git tag TAG_NAME SHA -a -m 'Wiadomość annotated' # dodanie tagu TAG_NAME z adnotacją/annotated
git tag -d TAG_NAME # kasujemy tag lokalnie
git remote # pokazuje zdalne repozytoria przypisane do naszego
git remote add gitlab ssh://gitlab.domena.pl:5023/remote_repo.git # przypisuje etykietę do zdalnego repo
git remote remove gitlab # usuwa zdalny remote
git remote rename origin gitlab # zmienia nazwę etykiety zdalnego repo
git remote -v # listuje szczegółowo zdalne repozytoria, możesz jeszcze użyć -vv
git check-ignore <plik> # Sprawdzenie czy dany plik jest ignorowany, jeśli go zwróci to jest ignorowany!
#
git update-index --assume-unchange <plik> # Git nie będzie widział zmian w pliku który już jest w repo
git update-index --no-assume-unchange <plik> # Usunięcie flagi assume-unchange
git ls-files # Lista plików w repo
git ls-files | wc -l # Policzenie lini/plików
# Wyświetlenie plików wraz ze statusem h/H - małe h to znaczy że jest ignorowany przez assume-unchange
git ls-files -v
# Pokaże status+pliki zaczynające się z małej litery czyli ignorowane przez assume-unchange
git ls-files -v | grep "^[[:lower:]]"
gitk # Commit viewer - Graficzne narzędzie do przeglądania commitów
gitk --all # Graficzne narzędzie w trybie wszystkich plików
#
git gui # włącza narzędzie git-gui do przeglądania zmian
git blame /path/file # wypisze kto jest autorem każdej linijki w pliku
git reflog # log z referencjami
git cherry-pick SHA # kopiuje commit z innego brancha na bieżący; utworzony commit ma inny/nowy SHA
Materiał przygotował dla Was:
Andrzej EZNAWCA Mazur
Zapraszam na moje strony:
LekcjePHP.pl
Eznawca.pl