Trzy obszary Gita
Working Directory 1
Katalog roboczy — tu edytujesz pliki. Zmiany są niezapisane w historii Gita dopóki ich nie dodasz do Stage'a. Status: modified lub untracked.
Staging Area 2
Poczekalnia (indeks) — wybierasz tu co wejdzie do następnego commita. Dodajesz przez git add. Możesz stage'ować tylko część pliku (git add -p).
Repository 3
Historia commitów — lokalna (folder .git) i zdalna (GitHub). Dane trafiają tu przez git commit. Push synchronizuje lokalne z remote.
Kluczowe pojęcia
HEAD
Wskaźnik na aktualną pozycję w historii — zazwyczaj na ostatni commit bieżącego brancha. HEAD~1 = jeden commit wstecz, HEAD~2 = dwa commity wstecz.
Branch
Gałąź — lekki wskaźnik na commit, pozwala pracować nad funkcją/bugfixem w izolacji bez dotykania main. Scalanie przez merge lub rebase.
Merge
Łączy dwa branche tworząc merge commit. Zachowuje pełną historię. Dobry przy PR-ach, kiedy chcesz widzieć że gałąź była oddzielna.
Rebase
Przenosi commity brancha na wierzchołek innego brancha — tworzy liniową historię. Nie używaj na branchach już wypchniętych i wspólnych (przepisuje SHA).
Pull Request (PR) GitHub
Propozycja scalenia brancha — miejsce na code review, dyskusję i CI. Odpowiednik w GitLab to Merge Request (MR). Zawsze PR-uj do main/dev zamiast commitować bezpośrednio.
Fork GitHub
Kopia cudzego repo na Twoim koncie GitHub. Pozwala na swobodne zmiany i wysyłanie PR-ów do oryginału. Główny wzorzec współpracy w open source.
Stash
Tymczasowy schowek na niezacommitowane zmiany. Używasz gdy musisz szybko przełączyć branch bez commitowania niedokończonej pracy. git stash pop przywraca.
Tag
Nieruchomy wskaźnik na konkretny commit — używany do oznaczania wersji (v1.0.0). Tagi annotated (-a) zawierają wiadomość i metadane; preferowane w produkcji.
Cherry-pick
Kopiuje wybrany commit z jednego brancha na inny. Przydatne gdy chcesz przenieść tylko jeden fix bez całego brancha. Tworzy nowy SHA (kopię, nie oryginał).
Reflog
Dziennik wszystkich operacji HEAD — nawet tych usuniętych przez reset czy rebase. Twoja siatka bezpieczeństwa: git reflog → znajdź SHA → git checkout.
Fast-forward
Merge bez merge commita — możliwy gdy główna gałąź nie miała nowych commitów od momentu rozgałęzienia. Git po prostu przesuwa wskaźnik. Użyj --no-ff by wymusić merge commit.
Detached HEAD
Stan gdy HEAD wskazuje bezpośrednio na commit zamiast na branch. Commity w tym stanie mogą zginąć po przełączeniu. Utwórz branch (git switch -c nazwa) by je zachować.
.gitignore — co warto wiedzieć
Wzorce
*.log — wszystkie pliki .log
build/ — cały folder build
/config.local.js — tylko w root
!ważny.log — wyklucz z ignorowania
**/*.tmp — rekurencyjnie wszystkie .tmp
Już śledzony plik
Dodanie do .gitignore nie wystarczy gdy plik był już commitowany. Trzeba usunąć go z cache:
git rm --cached plik.txt
a potem commitować zmianę.
Globalne .gitignore
Plik ignorowania dla wszystkich repo na komputerze (np. pliki IDE). Ustaw go przez:
git config --global core.excludesfile ~/.gitignore_global
💡 Gotowe szablony .gitignore dla konkretnych języków i narzędzi znajdziesz na gitignore.io lub bezpośrednio w GitHub przy tworzeniu repo.
Conventional Commits — konwencja wiadomości
Typ Kiedy używać Przykład
feat Nowa funkcjonalność feat: add dark mode toggle
fix Naprawa błędu fix: correct VLOOKUP syntax error
docs Zmiany w dokumentacji docs: update README with setup steps
style Formatowanie, brak zmian logiki style: fix indentation in style.css
refactor Przepisanie kodu bez zmiany zachowania refactor: extract theme logic to theme.js
test Dodanie/zmiana testów test: add unit tests for SQL builder
chore Zadania pomocnicze, konfiguracja chore: update .gitignore
perf Poprawa wydajności perf: lazy load cloud tab content
ci Zmiany w CI/CD ci: add GitHub Actions workflow
💡 Format: typ(zakres): opis — np. feat(navbar): add responsive menu. Scope jest opcjonalny. Breaking change oznacz przez !: feat!: rename API endpoint.
⚙️ Inicjalizacja i konfiguracja
git init
Inicjalizuje nowe lokalne repozytorium w bieżącym folderze (tworzy .git).
git clone <url>
Klonuje zdalne repo na lokalny dysk. Automatycznie ustawia origin.
git clone <url> --depth 1
Shallow clone — pobiera tylko ostatni commit (szybsze przy dużych repo).
git config --global user.name "Jan"
Ustawia globalną nazwę autora commitów. Bez --global — tylko dla bieżącego repo.
git config --global user.email "j@m.pl"
Ustawia globalny e-mail autora. Musi zgadzać się z kontem GitHub dla prawidłowego przypisania commitów.
git config --list
Wyświetla całą aktualną konfigurację Gita (globalna + lokalna).
🔄 Podstawowy workflow
git status
Pokazuje stan plików: zmodyfikowane, staged, untracked. Używaj często.
git add <plik>
Dodaje plik do Staging Area. Możesz podać ścieżkę, wzorzec glob lub . (wszystko).
git add -p
Patch mode — interaktywnie wybierasz które fragmenty pliku stage'ować (hunk po hunku).
git commit -m "opis"
Zapisuje staged zmiany jako nowy commit z podaną wiadomością.
git commit --amend
Modyfikuje ostatni commit (wiadomość lub zawartość). Nie używaj po push na gałąź wspólną.
git diff
Różnica między Working Directory a Staging Area (niezstage'owane zmiany).
git diff --staged
Różnica między Staging Area a ostatnim commitem (co trafi do commita).
git log --oneline --graph
Historia commitów — skrócona, z grafem branchów w ASCII. Najlepsza forma podglądu.
git log -n 10
Ostatnie 10 commitów z pełnymi informacjami (autor, data, SHA, wiadomość).
git show <SHA>
Pokazuje szczegóły konkretnego commita: wiadomość + diff zmian.
🌿 Branching
git branch
Lista lokalnych branchów. -a — razem ze zdalnymi. Aktywny oznaczony *.
git switch -c <nazwa>
Tworzy nowy branch i od razu na niego przełącza. Nowoczesna alternatywa dla git checkout -b.
git switch <nazwa>
Przełącza na istniejący branch. Wymaga czystego Working Directory.
git branch -d <nazwa>
Usuwa lokalny branch (tylko gdy scalony). -D — wymusza usunięcie bez sprawdzania.
git merge <branch>
Scala podany branch do bieżącego. Tworzy merge commit jeśli nie jest fast-forward.
git merge --no-ff <branch>
Wymusza merge commit nawet jeśli możliwy fast-forward. Zachowuje widoczność gałęzi w historii.
git merge --squash <branch>
Łączy wszystkie commity brancha w jeden staged zestaw zmian — commituj ręcznie. Czyści historię.
git rebase <branch>
Przenosi bieżące commity na wierzchołek podanego brancha. Tworzy liniową historię.
git rebase -i HEAD~3
Interactive rebase — edytujesz, łączysz (squash), przenosisz lub usuwasz ostatnie 3 commity.
☁️ Remote — synchronizacja ze zdalnym repo
git remote -v
Lista skonfigurowanych zdalnych repozytoriów z adresami URL (fetch i push).
git remote add origin <url>
Podłącza lokalne repo do zdalnego pod aliasem origin.
git fetch
Pobiera zmiany ze zdalnego repo bez scalania. Bezpieczny podgląd co się zmieniło.
git pull
fetch + merge w jednym. Pobiera i scala zmiany z remote brancha.
git pull --rebase
Jak pull, ale zamiast merge — rebase. Tworzy czystszą, liniową historię.
git push origin <branch>
Wysyła lokalny branch na remote. Pierwsze push: dodaj -u by ustawić tracking.
git push -u origin <branch>
Push z ustawieniem upstream — od teraz samo git push wystarczy.
git push origin --delete <branch>
Usuwa branch ze zdalnego repo (np. po zmergowaniu PR).
git push --tags
Wysyła wszystkie lokalne tagi na remote (domyślnie push ich nie przesyła).
↩️ Cofanie zmian
git restore <plik>
Przywraca plik z Working Directory do stanu ostatniego commita. Niszczy niezapisane zmiany.
git restore --staged <plik>
Usuwa plik ze Staging Area (unstage) — zmiany w pliku zostają.
git reset --soft HEAD~1
Cofa ostatni commit — zmiany wracają do Staging Area. Commit znika, kod zostaje.
git reset --mixed HEAD~1
Cofa commit i unstage'uje — zmiany wracają do Working Directory. Domyślny tryb.
git reset --hard HEAD~1
Destrukcyjne — cofa commit i trwale usuwa zmiany z plików. Nie używaj po push.
git revert <SHA>
Tworzy nowy commit odwracający zmiany z podanego commita. Bezpieczne — nie przepisuje historii.
git clean -fd
Usuwa nieśledzone pliki i foldery. -n (dry-run) najpierw pokaże co zostanie usunięte.
🔧 Zaawansowane i przydatne
git stash
Chowa niezacommitowane zmiany do schowka. Working Directory wraca do stanu czystego.
git stash pop
Przywraca ostatnio schowane zmiany i usuwa je ze schowka.
git stash list
Lista wszystkich wpisów w schowku. Możesz mieć wiele (stash@{0}, stash@{1}…).
git cherry-pick <SHA>
Kopiuje konkretny commit na bieżący branch. Przydatne do backportowania fixów.
git tag -a v1.0.0 -m "Opis"
Tworzy annotated tag z wiadomością. Preferowany dla wersji — zawiera autora i datę.
git reflog
Historia wszystkich operacji HEAD — nawet po reset --hard. Ostatnia deska ratunku przy utraconych commitach.
git bisect start
Uruchamia binary search przez historię — pomaga znaleźć commit który wprowadził buga.
git blame <plik>
Pokazuje kto i kiedy ostatnio zmodyfikował każdą linię pliku.
git shortlog -sn
Statystyki commitów per autor (posortowane malejąco). Przydatne do analizy aktywności.
git log --author="Jan" --since="1 month ago"
Filtruje historię po autorze i zakresie dat. Obsługuje też --grep do szukania po wiadomości commita.