Polecenia z tego poradnika zostały uruchomione 6 października 2026 w czystym systemie (Ubuntu 24.04.5 LTS, Node.js 24.21.0, Python 3.12.3). Wyniki pod poleceniami pochodzą z tego uruchomienia.

Git zapisuje historię zmian w projekcie, a GitHub pozwala przechowywać online repozytoria, czyli projekty wraz z zapisaną historią, i współpracować nad nimi. Żeby zacząć, zainstaluj Git, utwórz repozytorium, wybierz pliki do zapisania i wykonaj commit, czyli zapis określonego stanu projektu. Następnie wyślij go na GitHub. Ten git tutorial przeprowadzi cię przez cały proces na małym projekcie tekstowym, bez konieczności pisania programu.

Po drodze nauczysz się sprawdzać zmiany, pracować na osobnej gałęzi (ang. branch), czyli oddzielnej linii rozwoju projektu, i proponować ich połączenie. Polecam przejść przykład od początku do końca, zanim zastosujesz polecenia do ważnego projektu.

W skrócie

  • Git odpowiada za historię projektu na komputerze.
  • GitHub przechowuje repozytoria i umożliwia omawianie zmian.
  • Podstawowy rytm pracy to: edycja, sprawdzenie, przygotowanie, commit i wysłanie.
  • Polecam zaczynać od osobnego projektu ćwiczeniowego i przechowywać sekrety poza historią Git.

Git, GitHub i najważniejsze pojęcia

Scalenie, czyli merge, włącza zmiany z jednej gałęzi do drugiej. GitHub opisuje te pojęcia w swoim słowniku repozytoriów.

Pojęcie Co oznacza Przykład w poradniku
Git System kontroli wersji, czyli zapisywania historii zmian Zapisujesz kolejne wersje opisu projektu
GitHub Platforma do przechowywania repozytoriów i współpracy Wysyłasz projekt na swoje konto
Commit Zapis przygotowanego stanu projektu „Dodaj opis projektu”
Gałąź Osobna linia rozwoju rozbudowa-opisu
Repozytorium zdalne Repozytorium dostępne poza twoim komputerem Projekt na GitHub
Pull request Propozycja scalenia zmian między gałęziami Prosisz o sprawdzenie nowego opisu

Przed commitem zmiany przechodzą przez staging area, czyli obszar przygotowania, nazywany też indeksem. Edytujesz pliki w katalogu roboczym, wybierasz ich wersje do następnego zapisu, a potem tworzysz commit. Tak działa podstawowy proces pracy w Git.

Poniższy schemat pokazuje lokalny zapis oraz późniejsze wysłanie zmian, opisane w dokumentacji git push:

flowchart TD
    A[Edytujesz pliki] --> B[Sprawdzasz zmiany]
    B --> C[Przygotowujesz zapis]
    C --> D[Tworzysz commit lokalnie]
    D --> E[Wysyłasz na GitHub]

Czego potrzebujesz przed rozpoczęciem

Ścieżka instalacji poniżej dotyczy Ubuntu Desktop 24.04 LTS. Przygotuj terminal, czyli okno do wpisywania poleceń, edytor tekstu, przeglądarkę oraz dostęp do internetu. Do instalacji potrzebujesz możliwości użycia sudo, czyli wykonania polecenia z uprawnieniami administratora.

Do części z GitHub przygotuj konto z potwierdzonym adresem e-mail. Jeśli już je masz, wykorzystaj istniejące.

Polecam ćwiczyć na dwóch krótkich plikach. Dzięki temu łatwiej zobaczysz, co zostało zapisane, zamiast analizować od razu setki plików wygenerowanej aplikacji.

Git tutorial krok po kroku: pierwszy projekt

1. Zainstaluj Git i GitHub CLI

Otwórz terminal. Zainstaluj Git zgodnie ze ścieżką instalacji dla Ubuntu:

terminal
sudo apt-get update
sudo apt-get install git

git --version
Wynik w czystym systemie:
sudo: unable to send audit message: Operation not permitted
Hit:1 http://security.ubuntu.com/ubuntu noble-security InRelease
Hit:2 https://cli.github.com/packages stable InRelease
Hit:3 https://packages.microsoft.com/repos/code stable InRelease
Hit:4 https://deb.nodesource.com/node_24.x nodistro InRelease
Hit:5 http://archive.ubuntu.com/ubuntu noble InRelease
Hit:6 http://archive.ubuntu.com/ubuntu noble-updates InRelease
Hit:7 http://archive.ubuntu.com/ubuntu noble-backports InRelease
Reading package lists...
sudo: unable to send audit message: Operation not permitted
…
git version 2.43.0

Oczekiwany wynik ostatniego polecenia to nazwa Git oraz numer zainstalowanej wersji. Nie porównuj numeru z przypadkowym zrzutem ekranu w internecie.

GitHub CLI to narzędzie do obsługi GitHub z terminala; uruchamia się je poleceniem gh. Zainstaluj je z oficjalnego źródła pakietów. Poniższy blok dodaje źródło pakietów do konfiguracji systemu i instaluje narzędzie:

terminal
(type -p wget >/dev/null || (sudo apt update && sudo apt install wget -y)) \
  && sudo mkdir -p -m 755 /etc/apt/keyrings \
  && gh_key_file=$(mktemp) \
  && wget -nv -O "$gh_key_file" https://cli.github.com/packages/githubcli-archive-keyring.gpg \
  && cat "$gh_key_file" | sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg > /dev/null \
  && sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg \
  && sudo mkdir -p -m 755 /etc/apt/sources.list.d \
  && echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null \
  && sudo apt update \
  && sudo apt install gh -y
Wynik w czystym systemie:
sudo: unable to send audit message: Operation not permitted
2026-10-06 20:07:27 URL:https://cli.github.com/packages/githubcli-archive-keyring.gpg [4528/4528] -> "/tmp/tmp.zhCCwNTtb4" [1]
sudo: unable to send audit message: Operation not permitted
sudo: unable to send audit message: Operation not permitted
sudo: unable to send audit message: Operation not permitted
sudo: unable to send audit message: Operation not permitted
sudo: unable to send audit message: Operation not permitted

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

…
0 upgraded, 0 newly installed, 0 to remove and 2 not upgraded.

Poczekaj na zakończenie instalacji. Jeśli pojawi się błąd, zatrzymaj się na tym etapie zamiast wykonywać dalsze polecenia.

2. Utwórz repozytorium i ustaw autora

W terminalu przejdź do miejsca, w którym chcesz przechowywać projekty. Wybierz lokalizację, w której nie istnieje jeszcze folder git-start:

terminal
mkdir git-start
cd git-start
git init -b main
Wynik w czystym systemie:
Initialized empty Git repository in ~/git-start/.git/

git init tworzy repozytorium, a -b main nadaje początkowej gałęzi nazwę main. Powstaje katalog .git z danymi repozytorium. Od teraz wykonuj polecenia w folderze git-start, chyba że instrukcja wyraźnie każe z niego wyjść.

Ustaw nazwę autora oraz adres e-mail. Konfiguracja --global dotyczy wszystkich repozytoriów twojego użytkownika na tym komputerze.

Polecam użyć adresu noreply udostępnianego przez GitHub, aby zachować prywatność osobistego e-maila. Znajdziesz ustawienia pod zdjęciem profilu, następnie Settings i Emails. Dokumentacja wyjaśnia ustawianie adresu używanego w commitach.

Zastąp oba przykładowe teksty własnymi danymi przed wykonaniem poleceń:

terminal
git config --global user.name "Twoja nazwa autora"
git config --global user.email "TWOJ_ADRES_NOREPLY"
git config --global user.name
git config --global user.email

Ostatnie polecenia powinny wypisać ustawione wartości. Ta konfiguracja opisuje autora zmian; logowanie do GitHub wykonasz osobno.

3. Przygotuj pliki i zasady ignorowania

Najpierw wykonaj kroki 1–2: musisz mieć zainstalowany Git, utworzone repozytorium i ustawione dane autora. Poniższe bloki uruchom w terminalu, pozostając w folderze git-start. Polecenie cat odczytuje podany tekst, a przekierowanie > zapisuje go do pliku; jeśli plik już istnieje, jego dotychczasowa zawartość zostanie nadpisana.

W terminalu utwórz plik README.md:

terminal
cat > README.md <<'EOF'
Moja nauka Gita

To projekt ćwiczeniowy do nauki zapisywania zmian.
EOF

README potraktuj jako krótkie wprowadzenie dla osoby, która pierwszy raz otwiera projekt. Rozszerzenie .md oznacza Markdown, czyli format tekstowy pozwalający zapisywać między innymi nagłówki i listy.

W tym samym folderze utwórz również plik .gitignore:

terminal
cat > .gitignore <<'EOF'
.env
.env.*
*.log
EOF

Plik .gitignore zawiera wzorce nazw, które Git ma ignorować wśród plików jeszcze nieśledzonych, czyli takich, których nie było w ostatnim commicie i których nie dodano do obszaru przygotowania. Po dodaniu nowego pliku poleceniem git add Git zaczyna go śledzić. W naszym przykładzie są to .env, nazwy zaczynające się od .env. oraz pliki z końcówką .log. Reguły ignorowania nie wpływają na pliki już śledzone.

4. Sprawdź pliki i wykonaj pierwszy commit

Sprawdź stan projektu:

terminal
git status
Wynik w czystym systemie:
On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	.gitignore
	README.md

nothing added to commit but untracked files present (use "git add" to track)

git status pokazuje pliki nieśledzone oraz zmiany przygotowane i nieprzygotowane do commita. W tym przykładzie powinny pojawić się README.md i .gitignore jako nowe pliki.

Przed wykonaniem git add musisz mieć oba pliki zapisane bezpośrednio w bieżącym folderze git-start. Jeśli któregoś brakuje, wróć do kroku 3 i utwórz go przed dalszą pracą.

Przygotuj je do zapisu:

terminal
git add README.md .gitignore

Polecenie git add wybiera aktualną zawartość wskazanych plików. Jeśli po jego wykonaniu ponownie zmienisz plik, uruchom git add jeszcze raz, aby przygotować także nową zmianę. Wyjaśnia to rozdział o zapisywaniu zmian w repozytorium.

Obejrzyj przygotowaną zawartość:

terminal
git diff --staged
Wynik w czystym systemie:
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..62854d9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+.env
+.env.*
+*.log
diff --git a/README.md b/README.md
…
+To projekt ćwiczeniowy do nauki zapisywania zmian.

git diff --staged pokazuje zmiany przeznaczone do następnego commita. Sprawdź, czy widzisz wyłącznie treść swoich dwóch plików. Następnie zapisz je:

terminal
git commit -m "Dodaj opis projektu i reguły ignorowania"
git status
Wynik w czystym systemie:
[main (root-commit) 67dcab3] Dodaj opis projektu i reguły ignorowania
 2 files changed, 6 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 README.md
On branch main
nothing to commit, working tree clean

git commit zapisuje przygotowaną zawartość, a -m podaje opis zapisu. Po poprawnym wykonaniu zobaczysz podsumowanie commita. Status powinien wskazywać brak zmian do zapisania, w angielskim interfejsie: nothing to commit, working tree clean.

Polecam opisywać cel zmiany, na przykład „Dodaj instrukcję uruchomienia”. Komunikat „zmiany” niewiele pomoże, kiedy wrócisz do projektu po przerwie.

5. Zaloguj się i wyślij projekt na GitHub

Uruchom logowanie przez przeglądarkę:

terminal
gh auth login --hostname github.com --git-protocol https --web

Postępuj według komunikatów terminala: otwórz wskazaną stronę, wpisz pokazany kod i zatwierdź dostęp na właściwym koncie. HTTPS to wybrany tutaj sposób komunikacji z GitHub.

Następnie skonfiguruj Git, aby korzystał z obsługi poświadczeń przez GitHub CLI:

terminal
gh auth setup-git --hostname github.com

Poświadczenia to dane potwierdzające twoje uprawnienia. GitHub CLI próbuje przechowywać token dostępu, czyli poufny klucz używany do potwierdzania tożsamości w GitHub, w systemowym magazynie poświadczeń; jeśli nie może z niego skorzystać, może zapisać token w zwykłym pliku. Dlatego polecam traktować konfigurację logowania jako prywatną i nie dołączać jej do projektu.

Utwórz repozytorium o nazwie, której jeszcze nie używasz na koncie:

terminal
gh repo create git-start --private --source=. --remote=origin --push

Zgodnie z dokumentacją tworzenia repozytorium, --private wybiera repozytorium prywatne, --source=. wskazuje bieżący folder, --remote=origin nadaje nazwę połączeniu zdalnemu, a --push wysyła lokalne commity. Po sukcesie otwórz wypisany adres projektu i sprawdź oba pliki.

Repozytorium publiczne jest dostępne dla wszystkich w internecie. Dostęp do prywatnego jest ograniczony według zasad widoczności GitHub. Polecam pozostać przy prywatnym podczas pierwszych ćwiczeń.

6. Zmień opis na osobnej gałęzi

Gałąź nazwij według zadania, które wykonujesz. Utwórz ją i przełącz się na nią:

terminal
git switch -c rozbudowa-opisu
Wynik w czystym systemie:
Switched to a new branch 'rozbudowa-opisu'

git switch -c tworzy gałąź i od razu ją wybiera. Oczekiwany wynik to komunikat o przełączeniu na nową gałąź.

Zastąp zawartość pliku README.md:

notatka
Moja nauka Gita

To projekt ćwiczeniowy do nauki zapisywania zmian.

Cel projektu: przećwiczyć commit, gałąź i pull request.

Sprawdź różnicę, przygotuj zmianę i zapisz ją:

terminal
git diff
git add README.md
git diff --staged
git commit -m "Dopisz cel projektu"
git push -u origin rozbudowa-opisu

Zwykły git diff pokazuje zmiany jeszcze nieprzygotowane, a wariant --staged pokazuje przygotowane. git push -u wysyła gałąź i ustawia powiązanie z jej odpowiednikiem zdalnym. Oczekiwany wynik to informacja o wysłaniu nowej gałęzi.

7. Utwórz pull request i scal zmiany

Pull request pozwala przedstawić zmianę do sprawdzenia przed scaleniem. W swoim projekcie możesz przećwiczyć zarówno rolę autora, jak i osoby oceniającej propozycję.

Utwórz pull request z określoną gałęzią docelową:

terminal
gh pr create --base main --head rozbudowa-opisu --title "Rozbuduj opis projektu" --body "Dodaję cel ćwiczenia do README. Sprawdziłem treść zmiany."

--base main wskazuje gałąź docelową, a --head gałąź zawierającą zmianę. Terminal powinien wypisać adres utworzonej propozycji.

Obejrzyj różnice w pull requeście:

terminal
gh pr diff

Polecam ocenić trzy rzeczy: czy zmiana realizuje opisany cel, czy dotyczy wyłącznie potrzebnych plików i czy nie zawiera prywatnych danych. Jeżeli potrzebujesz poprawki, wykonaj kolejny commit na tej gałęzi i wyślij go. GitHub aktualizuje istniejący pull request po kolejnych wysłanych zmianach.

Gdy akceptujesz wynik, wykonaj scalenie pull requesta:

terminal
gh pr merge --merge

To polecenie zmienia gałąź docelową na GitHub, włączając do niej zaakceptowane zmiany. Po pomyślnym scaleniu zaktualizuj lokalny projekt:

terminal
git switch main
git pull --ff-only origin main

--ff-only pozwala zaktualizować gałąź, jeśli lokalna historia nie rozeszła się ze zdalną. W naszym przykładzie README.md na lokalnej gałęzi main powinien już zawierać cel ćwiczenia.

Jak pobrać istniejący projekt

Jeżeli projekt ma już repozytorium, zacznij od klonowania, czyli pobrania jego lokalnej kopii z historią. git clone pozwala także wskazać nazwę nowego katalogu.

  1. Zastąp TWOJ_LOGIN nazwą swojego konta.
  2. Z folderu git-start przejdź poziom wyżej.
  3. Pobierz kopię do nowego folderu i sprawdź status:
terminal
cd ..
git clone https://github.com/TWOJ_LOGIN/git-start.git git-start-kopia
cd git-start-kopia
git status

Oczekiwany wynik to folder z plikami projektu i działającym repozytorium. Polecam teraz spróbować dopisać własne zdanie do README, przygotować je i zapisać, korzystając z poznanego rytmu pracy.

Jak poprawiać pomyłki

Poniższe sytuacje są osobnymi przykładami. Wybierz rozwiązanie pasujące do problemu.

Plik został przygotowany za wcześnie

Po istniejącym commicie możesz wycofać plik z obszaru przygotowania:

terminal
git restore --staged README.md

git restore --staged przywraca stan indeksu z ostatniego commita. Edycje w pliku roboczym pozostają. Oczekiwany wynik w statusie to zmiana nieprzygotowana do zapisu.

Chcesz odrzucić lokalną edycję

Jeśli świadomie chcesz zastąpić zawartość pliku wersją z obszaru przygotowania:

terminal
git restore README.md

To polecenie nadpisuje lokalne edycje wskazanego pliku. Polecam najpierw zachować kopię, jeśli możesz jeszcze potrzebować treści. Bez opcji --staged źródłem przywracania jest domyślnie indeks, zgodnie z dokumentacją przywracania plików.

Błąd jest już zapisany w commicie

Polecam rozważyć git revert, który zapisuje nowy commit odwracający wcześniejszą zmianę. Wymaga czystego katalogu roboczego.

Zanim skorzystasz z tego przykładu, wykonaj kroki 1–4: potrzebujesz zainstalowanego Git, repozytorium z zapisanym commitem oraz ustawionej nazwy autora i adresu e-mail. Wykonuj poniższe czynności w katalogu tego repozytorium.

  1. Sprawdź git status.
  2. Wyświetl historię poleceniem git log --oneline.
  3. Skopiuj poniższy wzór, zastąp ID_COMMITU rzeczywistym identyfikatorem zwykłego commita z wyświetlonej historii i dopiero wtedy uruchom polecenie. Nie uruchamiaj wzoru z dosłownym tekstem ID_COMMITU:
polecenie dla Claude
git revert --no-edit ID_COMMITU

git log --oneline pokazuje skrócone identyfikatory i tytuły zapisów. Wybierz konkretną zmianę, a nie commit scalenia, który wymaga dodatkowego wskazania sposobu odwracania.

Typowe problemy i rozwiązania

Git prosi o dane autora

Wróć do konfiguracji user.name i user.email, sprawdź wartości i ponów commit. Polecam ustawiać autora przed rozpoczęciem ćwiczenia, aby nie przerywać pierwszego zapisu.

Logowanie lub wysłanie zmian nie działa

Sprawdź stan konta:

terminal
gh auth status

gh auth status sprawdza uwierzytelnienie i pokazuje aktywne konto. Polecam upewnić się, że jest to konto właściciela projektu, a następnie w razie potrzeby powtórzyć logowanie z kroku 5.

Wysłanie zmian zostało odrzucone

Odrzucenie typu non-fast-forward może oznaczać, że zdalna gałąź zawiera historię, której lokalnie brakuje. Git domyślnie chroni przed takim nadpisaniem historii.

Polecam najpierw zapisać lokalne zmiany i sprawdzić właściwą gałąź. Jeśli pracujesz na main, możesz pobrać i scalić zdalne zmiany:

terminal
git pull --no-rebase --no-edit origin main

Ten wariant git pull wybiera scalenie i przyjmuje domyślny komunikat udanego scalenia. Jeśli wystąpi konflikt, rozwiąż go przed ponownym wysłaniem.

Pojawił się konflikt scalenia

Konflikt może wystąpić przy konkurencyjnych zmianach tych samych linii. Dla konfliktu w treści pliku dokumentacja GitHub wskazuje następujący proces:

  1. W katalogu repozytorium wykonaj git status.

  2. Otwórz wskazany plik i znajdź znaczniki <<<<<<<, ======= oraz >>>>>>>.

  3. Wybierz docelową treść i usuń znaczniki.

  4. Zapisz poprawiony plik i przygotuj go poleceniem git add z jego nazwą, a następnie wykonaj commit. Dla konfliktu w README.md uruchom w katalogu repozytorium:

    terminal
    git add README.md
    git commit -m "Rozwiąż konflikt scalenia"
    git status
    

Jeśli konflikt dotyczy innego pliku, zastąp README.md jego ścieżką. Jeśli konfliktów jest kilka, przygotuj każdy poprawiony plik przed commitem. Po rozwiązaniu wszystkich konfliktów i poprawnym commicie scalenie jest zakończone. Jeśli nie ma innych zmian ani plików nieśledzonych, git status powinien pokazać nothing to commit, working tree clean.

Polecam sprawdzić wynik w edytorze przed zapisaniem rozwiązania.

Sekret trafił do historii

Jeśli zapiszesz hasło lub token dostępu, najpierw go unieważnij albo wymień. Samo usunięcie pliku z bieżącej wersji nie rozwiązuje problemu wcześniejszego zapisu. GitHub opisuje postępowanie po ujawnieniu danych wrażliwych, w tym skutki przepisywania historii.

FAQ

Czy Git i GitHub to to samo?

Nie. Git zapisuje historię projektu, a GitHub udostępnia miejsce do przechowywania repozytoriów i współpracy. W przykładzie używasz obu narzędzi, ale odpowiadają za różne etapy pracy.

Czy do używania Git potrzebuję konta GitHub?

Do lokalnej pracy konta nie potrzebujesz. Możesz tworzyć commity i przeglądać historię bez połączenia z serwerem, co wyjaśnia opis lokalnych operacji Git.

Czym różni się commit od push?

Commit zapisuje przygotowany stan w lokalnym repozytorium. Push wysyła potrzebne dane i aktualizuje wskazaną gałąź zdalną. Jeśli po commicie projekt na GitHub wygląda tak samo, sprawdź, czy wykonałeś wysłanie zmian.

Czym różni się clone od fork?

Clone pobiera lokalną kopię repozytorium. Fork tworzy nowe repozytorium powiązane z pierwotnym; tak rozróżnia je dokumentacja repozytoriów GitHub. Polecam najpierw przećwiczyć klonowanie własnego projektu.

Co dalej

Przećwicz cały cykl jeszcze raz z własną zmianą.

Co dalej?

Źródła

  1. About repositories
  2. Git - What is Git?
  3. Ubuntu Desktop 24.04 LTS: Noble Numbat deep dive
  4. Creating an account on GitHub
  5. Git - Install for Linux
  6. Installing gh on Linux and BSD
  7. Git - git-init Documentation
  8. Git - First-Time Git Setup
  9. Setting your commit email address
  10. Ubuntu Manpage: cat - concatenate files and print on the standard output
  11. Ubuntu Manpage: bash - GNU Bourne-Again SHell
  12. Git - gitignore Documentation
  13. Adding locally hosted code to GitHub
  14. Git - git-status Documentation
  15. Git - git-add Documentation
  16. Git - Recording Changes to the Repository
  17. Git - git-diff Documentation
  18. Git - git-commit Documentation
  19. GitHub CLI - gh auth login
  20. About authentication to GitHub
  21. Managing your personal access tokens
  22. GitHub CLI - gh auth setup-git
  23. GitHub CLI - gh repo create
  24. Git - git-switch Documentation
  25. Git - git-push Documentation
  26. GitHub CLI - gh pr create
  27. GitHub CLI - gh pr diff
  28. GitHub flow
  29. GitHub CLI - gh pr merge
  30. Git - git-pull Documentation
  31. Git - Getting a Git Repository
  32. Git - git-restore Documentation
  33. Git - git-revert Documentation
  34. Git - git-log Documentation
  35. GitHub CLI - gh auth status
  36. Resolving a merge conflict using the command line
  37. Removing sensitive data from a repository
  38. nauczyć się (wiersza) - Wielki słownik języka polskiego PAN
  39. nauka (chodzenia) - Wielki słownik języka polskiego PAN