Ściąga z GIT i kursy GITa GIT Cheatsheets, commands and courses

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ć.

Polecenia GITa

LEGENDA:

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

Inicjalizacja i konfiguracja

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

Dziennik commitów

git log # gitlog - lista commitów
   
git log --oneline # styl jedno wierszowy
   
git log ---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=-- file # szukanie pliku z filtrem: A_dded C_opied D_eleted M_odified R_enamed
   
git log -"charakterystyczny string" # wyświetla commity które zmieniały liczbę wystąpień charakterystycznego stringu

Dodanie pliki do śledzonych

git add # Dodaje wszystkie pliki do śledzonych
   
git add file # Dodaje plik do śledzonych
   
git add -# Tryb interaktywny 'path', gdzie możesz dodać pojedynczy HUNK a nie tylko cały plik

Zatwierdzanie zmian

git commit # tworzy commit otwierając domyślny edytor
   
git commit -'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"

Wypychanie (pushowanie) zmian

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

Pobieranie zdalnych branchy

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

Wyświetlanie różnic

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

Aktualizacja lokalnego repo, np. po usunięciu brancha

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)
#

Przełączanie branchy

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

Przełączanie branchy

git merge BRANCH # merge brancha BRANCH do bieżącego 
   
git merge --no-ff BRANCH # merge bez fast-forward, wymusi stworzenie oddzielnego commita

Obsługa branchy

git branch -m nowa_nazwa # Zmienia nazwę bieżącej gałęzi
   
git branch -# listuje wszystkie branche także zdalne

Obsługa schowka

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 -'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

Cofanie zmian

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

Usuwanie nieśledzonych plików

git clean -# Usuwa nieśledzone pliki -f force dodatkowe zaabezpieczenie
   
git clean -# Lub --dry-run robi symulacje co było by usunięte
   
git clean --# usuwa także puste katalogi
   
git clean ---# usuwa nieśledzone pliki włączenie z ignorowanymi przez .gitignore
   
git clean -# tryb interaktywny

Dodawanie tagów

git tag TAG_NAME SHA # dodanie tagu light (bez opisu) o nazwie TAG_NAME 
git tag TAG_NAME SHA --'Wiadomość annotated' # dodanie tagu TAG_NAME z adnotacją/annotated
   
git tag -d TAG_NAME # kasujemy tag lokalnie

Obsługa zdalnego repozytoria

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 -# listuje szczegółowo zdalne repozytoria, możesz jeszcze użyć -vv

Ignorowanie plików

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

Listowanie plików repozytoriów

git ls-files # Lista plików w repo
   
git ls-files wc -# 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 -grep "^[[:lower:]]"

Narzędzia wizualne

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

Pozostałe operacje

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