🐙 Git i GitHub CLI
Podstawowe i zaawansowane polecenia Git do kontroli wersji, pracy z gałęziami, repozytoriami zdalnymi, stash, tagami oraz GitHub CLI.
🔹 Podstawowe polecenia
Polecenie |
Przykład |
Opis |
|---|---|---|
git add |
Dodaj plik do obszaru staging | |
git add file.txt |
Dodaj konkretny plik do następnego commita |
|
git add . |
Dodaj wszystkie zmiany w bieżącym katalogu i poniżej |
|
git add -p |
Interaktywnie wybierz fragmenty plików do dodania (przydatne dla częściowych commitów) |
|
git clone |
Sklonuj repozytorium do nowego katalogu | |
git clone -b branch_name URL |
Sklonuj tylko wskazaną gałąź (zamiast domyślnej) |
|
git clone --depth 1 URL |
Sklonuj tylko ostatni commit, tworząc płytką kopię w celu oszczędzenia czasu i miejsca |
|
git commit |
Zapisz zmiany w repozytorium | |
git commit -m "Initial commit" |
Commit z wiadomością bez otwierania edytora |
|
git commit -a -m "Fix bugs" |
Dodaj do stagingu i zatwierdź wszystkie zmodyfikowane pliki śledzone wraz z wiadomością |
|
git commit --amend |
Zaktualizuj ostatni commit (zmień wiadomość lub dodaj więcej zmian) |
|
git commit --fixup abc1234 |
Utwórz commit typu fixup, aby później automatycznie scalić podczas interaktywnego rebase |
|
git config |
Pobierz i ustaw opcje repozytorium lub globalne | |
git config --global user.name "Name" |
Ustaw globalną nazwę użytkownika Git |
|
git config --global user.email "email@example.com" |
Ustaw globalny email Git |
|
git config --list |
Wyświetl wszystkie ustawienia Git (nazwa, email, edytor itd.) |
|
git diff |
Pokaż różnice między commitami, commitem a drzewem roboczym itd. | |
git diff HEAD |
Pokaż, co zmieniłeś od ostatniego commita (niezapisane zmiany) |
|
git diff --staged |
Pokaż, co zostanie dołączone do następnego commita |
|
git diff --word-diff HEAD~1 |
Pokaż różnice na poziomie słów |
|
git grep |
Przeszukuj pliki w repozytorium | |
git grep "functionName" |
Znajdź wszystkie wystąpienia |
|
git grep -n "TODO" |
Znajdź linie zawierające |
|
git grep -i "login" |
Wyszukaj słowo |
|
git init |
Utwórz puste repozytorium Git lub zainicjalizuj ponownie istniejące | |
git init my-project |
Zainicjuj nowe repozytorium w katalogu my-project |
|
git init --bare |
Zainicjuj repozytorium bare |
|
git log |
Pokaż logi commitów | |
git log --oneline |
Pokaż historię commitów w kompaktowym formacie jednoliniowym |
|
git log --graph --all |
Pokaż wszystkie gałęzie w wizualnym grafie commitów |
|
git log -p --stat |
Pokaż patch i statystyki zmian plików dla commitów |
|
git reset |
Usuń pliki z obszaru staging, zachowując zmiany w katalogu roboczym | |
git reset HEAD file.txt |
Usuń plik ze stagingu (zachowuje edycje) |
|
git reset --hard HEAD~1 |
Cofnij się o jeden commit i usuń wszystkie zmiany (nieodwracalne!) |
|
git reset --soft HEAD~1 |
Cofnij ostatni commit, ale zachowaj zmiany gotowe do ponownego commita |
|
git reset --mixed HEAD~1 |
Cofnij commit, ale pozostaw zmiany w katalogu roboczym (nie dodane do stagingu) |
|
git show |
Pokaż różne typy obiektów | |
git show <commit_hash> |
Pokaż zmiany i wiadomość konkretnego commita |
|
git show HEAD~1 |
Pokaż commit poprzedzający bieżący |
|
git show --stat |
Pokaż podsumowanie zmian plików dla ostatniego commita |
|
git status |
Pokaż status drzewa roboczego | |
git status -s |
Pokaż status w skróconym formacie |
|
git status -b |
Pokaż bieżącą gałąź i status plików |
🌿 Gałęzie i scalanie
Polecenie |
Przykład |
Opis |
|---|---|---|
git branch |
Utwórz, wyświetl lub usuń gałęzie | |
git branch new-feature |
Utwórz nową gałąź o nazwie |
|
git branch -d old-feature |
Usuń lokalną gałąź o nazwie |
|
git checkout |
Przełączaj gałęzie lub przywracaj pliki z innego commita | |
git checkout main |
Przełącz na gałąź |
|
git checkout -b new-branch |
Utwórz i przełącz na nową gałąź o nazwie |
|
git switch |
Przełączaj gałęzie (uproszczona alternatywa dla checkout) |
|
git switch main |
Przełącz na gałąź |
|
git switch -c feature-x |
Utwórz i przełącz na nową gałąź o nazwie |
|
git switch new-feature |
Przełącz na istniejącą gałąź o nazwie |
|
git merge |
Połącz zmiany z innej gałęzi z bieżącą | |
git merge new-feature |
Scal gałąź |
|
git merge --no-ff new-feature |
Zawsze utwórz commit scalający (nawet jeśli możliwy jest fast-forward) |
|
git merge --abort |
Anuluj scalanie i cofnij zmiany, jeśli wystąpią konflikty |
|
git rebase |
Przenieś lub ponownie zastosuj commity na nową bazę | |
git rebase main |
Zastosuj commity z twojej gałęzi na szczycie gałęzi |
|
git rebase -i HEAD~3 |
Interaktywnie edytuj ostatnie 3 commity |
|
git rebase --abort |
Zatrzymaj i cofnij trwający rebase |
|
git rebase -i --autosquash HEAD~5 |
Automatycznie squashuj commity oznaczone jako fixup lub squash podczas interaktywnego rebase |
|
git cherry-pick |
Zastosuj wybrane commity z innej gałęzi | |
git cherry-pick <hash> |
Zastosuj konkretny commit (po hashu) do bieżącej gałęzi |
|
git cherry-pick --continue |
Kontynuuj cherry-pick po rozwiązaniu konfliktów |
|
git cherry-pick A^..B |
Zastosuj zakres commitów od |
📡 Repozytoria zdalne
Polecenie |
Przykład |
Opis |
|---|---|---|
git remote |
Zarządzaj linkami do repozytoriów zdalnych (np. GitHub) | |
git remote -v |
Pokaż nazwy zdalnych repozytoriów i ich adresy URL |
|
git remote add origin URL |
Dodaj repozytorium zdalne o nazwie |
|
git pull |
Pobierz i automatycznie scal zmiany ze zdalnej gałęzi | |
git pull origin main |
Pobierz i scal zmiany ze zdalnej gałęzi |
|
git pull --rebase origin main |
Pobierz i zrób rebase swojej bieżącej gałęzi na szczycie zdalnej zamiast scalania |
|
git push |
Wyślij swoje lokalne zmiany do repozytorium zdalnego | |
git push origin main |
Wypchnij swoją lokalną gałąź |
|
git fetch |
Pobierz zmiany ze zdalnego repozytorium bez scalania | |
git fetch origin |
Pobierz wszystkie aktualizacje ze zdalnego |
|
git fetch origin main |
Pobierz tylko gałąź |
|
git fetch --all |
Pobierz aktualizacje ze wszystkich zdalnych repozytoriów |
|
git fetch --prune |
Wyczyść usunięte gałęzie — usuń lokalne referencje do gałęzi, które zostały usunięte zdalnie |
|
git fetch --dry-run |
Pokaż, co zostałoby pobrane, bez rzeczywistego pobierania |
|
git fetch origin +main |
Wymuś aktualizację lokalnej gałęzi śledzącej ( |
📦 Stash i czyszczenie
Polecenie |
Przykład |
Opis |
|---|---|---|
git stash |
Tymczasowo zapisz niezacommitowane zmiany (praca w toku) | |
git stash |
Zapisz zmodyfikowane i dodane pliki, a następnie przywróć katalog roboczy do ostatniego commita |
|
git stash apply |
Ponownie zastosuj ostatnie zmiany ze stash (stash pozostaje zapisany) |
|
git stash pop |
Ponownie zastosuj i usuń ostatni stash |
|
git stash list |
Pokaż listę wszystkich zapisanych zmian (stash) |
|
git stash branch feature-fix |
Utwórz nową gałąź i zastosuj do niej ostatni stash |
|
git clean |
Trwale usuń nieśledzone pliki (nie w Git) | |
git clean -f |
Usuń nieśledzone pliki w bieżącym katalogu |
|
git clean -fd |
Usuń nieśledzone pliki i foldery |
|
git clean -n |
Pokaż, co zostanie usunięte (suchy run) |
🏷️ Tagi
Polecenie |
Przykład |
Opis |
|---|---|---|
git tag |
Utwórz, wyświetl lub usuń tagi oznaczające konkretne punkty w historii (np. wydania) | |
git tag -a v1.0 -m "Version 1.0" |
Utwórz tag adnotowany |
|
git tag -d v1.0 |
Usuń lokalny tag o nazwie |
|
git push |
Wyślij commity, gałęzie i tagi z lokalnego do repozytorium zdalnego | |
git push origin --tags |
Wypchnij wszystkie lokalne tagi do zdalnego (przydatne po otagowaniu wielu wersji) |
|
git push origin v1.0 |
Wypchnij konkretny tag (np. |
|
git push origin :refs/tags/v1.0 |
Usuń zdalny tag |
🛠️ Rozwiązywanie konfliktów
Polecenie |
Przykład |
Opis |
|---|---|---|
git mergetool |
Otwórz wizualne narzędzie do rozwiązywania konfliktów scalania | |
git mergetool --tool=meld |
Użyj konkretnego narzędzia do scalania (np. Meld), aby rozwiązać konflikty |
|
git rerere |
Pozwól Git zapamiętać, jak wcześniej rozwiązałeś konflikty scalania | |
git config --global rerere.enabled true |
Włącz automatyczne ponowne użycie wcześniejszych rozwiązań konfliktów |
|
git rerere status |
Pokaż, które pliki mają zapisane rozwiązania konfliktów |
|
git rerere diff |
Pokaż, jakie zmiany Git zapisał do ponownego użycia |
⚙️ Zaawansowane polecenia
Polecenie |
Przykład |
Opis |
|---|---|---|
git bisect |
Użyj wyszukiwania binarnego, aby znaleźć commit, który wprowadził błąd | |
git bisect start |
Rozpocznij wyszukiwanie binarne między znanym dobrym a złym commitem, aby zlokalizować błąd |
|
git bisect bad |
Oznacz bieżący commit jako “zły” (zawiera błąd) |
|
git bisect good <commit> |
Oznacz znany “dobry” commit, w którym błąd nie występował |
|
git blame |
Pokaż, kto ostatnio zmodyfikował każdą linię pliku, wraz z rewizją i autorem | |
git blame file.txt |
Pokaż autora i informacje o commicie dla każdej linii pliku |
|
git blame -L 10,20 file.txt |
Pokaż informacje blame tylko dla linii 10–20 |
|
git blame --show-email file.txt |
Pokaż adresy e-mail autorów obok zmian w liniach |
|
git reflog |
Wyświetl i zarządzaj logiem referencji (reflog) ruchów gałęzi i HEAD | |
git reflog show main@{1.week.ago} |
Zobacz, gdzie wskazywała gałąź |
|
git reflog expire --expire=30.days --dry-run |
Pokaż, które wpisy reflog starsze niż 30 dni można wyczyścić (bez zmian) |
|
git reflog delete HEAD@{2} |
Usuń konkretny wpis reflog (ostrożnie, może wpłynąć na odzyskiwanie) |
|
git submodule |
Dodaj, zainicjuj, zaktualizuj lub sprawdź submoduły (repozytoria wewnątrz repozytoriów) | |
git submodule add URL path |
Dodaj zewnętrzne repozytorium jako submoduł w określonej ścieżce |
|
git submodule update --init |
Zainicjuj i pobierz wszystkie submoduły wymienione w repozytorium |
|
git submodule foreach git pull |
Uruchom |
|
git submodule sync --recursive |
Zsynchronizuj adresy URL submodułów po zmianach w pliku |
|
git submodule update --remote --merge |
Zaktualizuj submoduły do najnowszego commita z ich zdalnych gałęzi |
|
git archive |
Utwórz archiwum (zip, tar itp.) plików z konkretnego commita lub gałęzi | |
git archive --format=zip HEAD > archive.zip |
Utwórz archiwum ZIP bieżących plików projektu w HEAD |
|
git archive -o release.tar.gz HEAD |
Utwórz skompresowane archiwum |
|
git archive --format=tar --prefix=project/ HEAD \| gzip > project.tar.gz |
Utwórz skompresowane archiwum |
|
git gc |
Wyczyść niepotrzebne pliki i zoptymalizuj repozytorium pod kątem wydajności | |
git gc --aggressive |
Przeprowadź dokładne czyszczenie i optymalizację (może być wolne, ale skuteczne) |
|
git gc --prune=now |
Usuń wszystkie nieosiągalne obiekty natychmiast (niebezpieczne, jeśli nie masz pewności) |
|
git shortlog |
Szybkie podsumowanie autorów i ich commitów | |
git shortlog -e |
Pokaż listę autorów z ich adresami e-mail (np. do analizy, kto i ile wniósł) |
|
git shortlog -s -n |
Pokaż, ile commitów zrobił każdy autor, posortowane według liczby commitów |
|
git shortlog -sne |
To samo, ale zawiera także imiona i adresy e-mail — przydatne do szczegółowego śledzenia aktywności |
|
git revert |
Utwórz nowy commit, który cofa zmiany z poprzedniego commita bez przepisywania historii | |
git revert HEAD |
Cofnij ostatni commit, tworząc nowy commit odwracający jego zmiany |
|
git revert <commit_hash> |
Cofnij konkretny commit po jego hashu, bezpiecznie dodając nowy commit odwracający |
🐙 GitHub CLI
ghpozwala zarządzać GitHubem z poziomu terminala.
Polecenie |
Przykład |
Opis |
|---|---|---|
gh auth login |
Uwierzytelnij się w hostingu GitHub, aby umożliwić poleceniom CLI interakcję z Twoim kontem | |
gh auth login --with-token < mytoken.txt |
Uwierzytelnij się przy użyciu personal access token zapisanego w pliku ( |
|
gh auth login --hostname enterprise.internal |
Uwierzytelnij się w serwerze GitHub Enterprise (nie github.com) |
|
gh repo clone |
Sklonuj repozytorium GitHub na swoją maszynę lokalną | |
gh repo clone user/repo |
Sklonuj repozytorium |
|
gh repo clone cli/cli -- --depth=1 |
Sklonuj repozytorium, ale pobierz tylko najnowszy commit dla szybszej i mniejszej kopii |
|
gh repo clone cli/cli workspace/cli |
Sklonuj repozytorium do niestandardowego folderu |
|
gh issue list |
Wyświetl listę zgłoszeń (issues) w repozytorium GitHub, opcjonalnie filtrowanych według różnych kryteriów | |
gh issue list --assignee "@me" |
Wyświetl zgłoszenia przypisane do Ciebie |
|
gh issue list --state all |
Wyświetl zgłoszenia niezależnie od stanu (otwarte lub zamknięte) |
|
gh issue list --search "error no:assignee sort:created-asc" |
Wyświetl zgłoszenia pasujące do frazy “error”, nieprzypisane, posortowane według daty utworzenia rosnąco |
|
gh pr create |
Utwórz pull request na GitHub przez CLI | |
gh pr create --title "..." |
Utwórz pull request z podanym tytułem |
|
gh pr create --project "Roadmap" |
Powiąż pull request z projektem GitHub o nazwie “Roadmap” |
|
gh pr create --base develop --head monalisa:feature |
Utwórz PR z gałęzi |
|
gh repo create |
Utwórz nowe repozytorium GitHub z poziomu CLI | |
gh repo create my-project |
Utwórz nowe repozytorium o nazwie |
|
gh repo create my-project --public --clone |
Utwórz repozytorium publiczne i sklonuj je lokalnie |
|
gh repo create my-project --private --source=. --remote=upstream |
Utwórz prywatne repozytorium zdalne z bieżącego folderu i dodaj zdalne o nazwie |
💡 Aliasy Git (przydatne skróty)
Skonfiguruj wygodne aliasy, aby przyspieszyć często używane polecenia Git:
git config --global alias.br branch # skrót dla: git branch
git config --global alias.ci commit # skrót dla: git commit
git config --global alias.co checkout # skrót dla: git checkout
git config --global alias.graph "log --oneline --graph --all --decorate" # ładny wykres historii
git config --global alias.last "log -1 HEAD" # pokaż ostatni commit
git config --global alias.st status # skrót dla: git status🚀 Zaawansowane polecenia Git dla profesjonalistów
Polecenie |
Przykład |
Opis |
|---|---|---|
git filter-repo |
Potężne i wydajne narzędzie do przepisywania historii Git w celu usunięcia lub modyfikacji plików, autorstwa lub ścieżek; zastępuje git filter-branch z większą szybkością i bezpieczeństwem | |
git filter-repo --path secret.txt --invert-paths |
Wydajnie przepisz historię repozytorium, aby usunąć wrażliwe pliki lub katalogi bez problemów wydajnościowych |
|
git filter-repo --replace-text replacements.txt |
Masowo zastępuj ciągi lub wzorce w całej historii (np. czyszczenie danych uwierzytelniających) |
|
git filter-repo --subdirectory-filter src |
Wyodrębnij historię podkatalogu do nowego repozytorium, zachowując metadane commitów |
|
git worktree |
Zarządzaj wieloma katalogami roboczymi powiązanymi z jednym repozytorium, umożliwiając równoległą pracę nad różnymi gałęziami bez klonowania | |
git worktree add ../feature feature-branch |
Utwórz dodatkowy katalog roboczy powiązany z tym samym repozytorium, umożliwiając równoległe sprawdzanie gałęzi bez klonów |
|
git worktree list |
Wyświetl wszystkie aktywne worktree, ich ścieżki i powiązane gałęzie |
|
git worktree remove ../feature |
Usuń powiązane worktree, gdy nie jest już potrzebne, bezpiecznie czyszcząc katalogi robocze |
|
git replace |
Utwórz tymczasowe referencje zastępujące istniejące obiekty, umożliwiając nieniszczącą lokalną manipulację historią i testowanie | |
git replace <old_commit> <new_commit> |
Tymczasowo podmień jeden commit na inny w swoim repo lokalnym — przydatne do testowania lub łatki historii bez jej przepisywania |
|
git replace --list |
Pokaż wszystkie aktywne referencje zastępcze |
|
git replace -d <replace_ref> |
Usuń określoną referencję zastępczą, aby przywrócić poprzednie zachowanie |
|
git stash |
Tymczasowo zapisz niezacommitowane zmiany na stosie, umożliwiając przełączanie kontekstu bez commitowania niedokończonej pracy | |
git stash push -p |
Interaktywnie wybierz fragmenty zmian do zapisania w stash, zapewniając szczegółową kontrolę |
|
git stash push -m "WIP selective stash" |
Utwórz stash z własną wiadomością dla łatwiejszej identyfikacji |
|
git stash apply stash@{2} |
Zastosuj konkretny stash z listy stash, bez jego usuwania |
|
git rebase |
Ponownie zastosuj commity na szczycie innej bazy, ułatwiając czystą, liniową historię projektu oraz interaktywną edycję historii | |
git rebase --interactive --autosquash |
Rozpocznij interaktywną sesję rebase, która automatycznie zmienia kolejność i scala commity oznaczone jako fixup lub squash, upraszczając historię |
|
git rebase -i --autosquash HEAD~10 |
Automatycznie zmień kolejność i połącz commity oznaczone jako fixup lub squash, czyszcząc historię commitów przed wypchnięciem |
|
git commit --fixup <commit> |
Utwórz commit typu fixup, który zostanie scalony automatycznie podczas interaktywnego rebase |
|
git commit --squash <commit> |
Utwórz commit typu squash, aby połączyć go z określonym commitem podczas rebase |
|
git bisect |
Narzędzie wyszukiwania binarnego do wydajnej identyfikacji commita, który wprowadził błąd, poprzez testowanie kolejnych commitów i zawężanie wadliwej zmiany | |
git bisect run |
Zautomatyzuj proces bisect, uruchamiając określony skrypt testowy na każdym commicie, aby szybko zidentyfikować commit wprowadzający błąd bez ręcznej interwencji |
|
git bisect start; git bisect bad; git bisect good v1.0; git bisect run ./test.sh |
Automatyzuj bisekcję, uruchamiając skrypt testowy na każdym commicie, znacznie przyspieszając identyfikację błędu |
|
git bisect visualize |
Otwórz narzędzie graficzne do wizualizacji procesu bisekcji |
|
git bisect reset |
Zakończ tryb bisect i wróć do oryginalnego HEAD |
|
git commit |
Zapisz zmiany w repozytorium z zaawansowanymi opcjami amend, sign, fixup i dostosowania wiadomości w celu utrzymania wysokiej jakości historii projektu | |
git commit --gpg-sign |
Utwórz commit podpisany kluczem GPG, aby zapewnić kryptograficzną weryfikację autentyczności i autorstwa |
|
git commit -S -m "Signed commit" |
Kryptograficznie podpisz swoje commity kluczem GPG, zapewniając integralność i weryfikację autorstwa |
|
git config --global user.signingkey <key_id> |
Skonfiguruj klucz GPG używany do podpisywania commitów globalnie |
|
git log --show-signature |
Zweryfikuj i wyświetl informacje o podpisach GPG commitów |
|
git reflog |
Prowadź log aktualizacji HEAD i gałęzi, niezbędny do odzyskiwania utraconych commitów i zrozumienia lokalnych ruchów historii | |
git reset --hard HEAD@{3} |
Zresetuj bieżącą gałąź do wcześniejszego stanu z reflog, aby odzyskać lub cofnąć zmiany |
|
git reflog expire --expire=now --all |
Natychmiast wygaś wszystkie wpisy reflog, czyszcząc historię reflog (ostrożnie) |
🧰 Wskazówki profesjonalne i automatyzacja pracy
Temat |
Polecenia / Przykład |
Wyjaśnienie i wskazówki |
|---|---|---|
Agresywne czyszczenie repozytorium |
git gc --aggressive --prune=now |
Wykonuje głęboką kolekcję śmieci i natychmiast usuwa nieosiągalne obiekty w celu optymalizacji repozytorium. Używaj w czasie konserwacji |
Równoległe worktree gałęzi |
git worktree add ../feature-branch feature |
Utrzymuj wiele katalogów roboczych dla równoczesnego rozwoju funkcji, unikając kosztów klonowania |
Czysta, liniowa historia |
git rebase -i --autosquash |
Przed wypchnięciem wykonaj interaktywny rebase z autosquash, aby zachować historię czystą i czytelną |
Bezpieczne commity |
git commit -S |
Podpisuj commity kluczem GPG, aby zwiększyć wiarygodność w repozytoriach współdzielonych; wymagane w wielu środowiskach korporacyjnych |
Automatyczne bisekcje |
git bisect run ./test-script.sh |
Automatyzuj wyszukiwanie błędów, uruchamiając skrypt testowy na każdym kandydacie podczas bisect |
Pamięć podręczna rozwiązywania konfliktów |
git config --global rerere.enabled true |
Włącz ponowne użycie rozwiązań konfliktów, aby przyspieszyć rozwiązywanie powtarzających się konfliktów podczas rebase lub merge |
Wspólne aliasy i hooki |
Przechowuj wspólne aliasy Git i hooki commitów w repozytorium współdzielonym lub pipeline CI, aby egzekwować standardy zespołu i zwiększać produktywność |
Dodatkowe zasoby
🧠 Wskazówka
Nie próbuj zapamiętywać wszystkiego. Używaj --help, eksploruj i regularnie ćwicz:
git help <command>
git status🌐 Przydatne linki
📘 Oficjalna dokumentacja Git — szczegółowy podręcznik wszystkich poleceń Git:
https://git-scm.com/docs
📙 Learn Git Branching — interaktywny wizualny samouczek do opanowania koncepcji gałęzi:
https://learngitbranching.js.org
📕 Książka Pro Git (darmowa, autorzy: Scott Chacon i Ben Straub):
https://git-scm.com/book
📗 Git Cheatsheet (oficjalna zwięzła ściągawka):
https://education.github.com/git-cheat-sheet-education.pdf