GitHub
GitHub jest warstwą współpracy zbudowaną wokół repozytoriów Git. Najważniejsze elementy codziennej pracy to Pull Request, Issues, Actions, permissions, Releases i przegląd diffów - a nie samo klikanie po interfejsie.
Powiązane tematy: Git w praktyce zespołowej, CI/CD i GitHub Actions, Visual Studio Code oraz Dokumentowanie rozwiązań technicznych.
Kompendium do codziennej pracy z GitHubem i Gitem: repozytoria, commity, branche, synchronizacja, forki, Pull Requesty, Issues, Releases, GitHub CLI, SSH, konflikty i typowe workflow.
1. Git a GitHub - to nie jest to samo
Git
Git to rozproszony system kontroli wersji.
Działa lokalnie na komputerze i pozwala:
- śledzić historię zmian,
- zapisywać kolejne wersje projektu,
- tworzyć gałęzie,
- scalać zmiany,
- cofać błędy,
- pracować bez dostępu do internetu.
Najważniejsze polecenie:
git
Przykład:
git status
GitHub
GitHub to serwis internetowy przechowujący repozytoria Git i dodający wokół nich narzędzia do współpracy.
GitHub oferuje m.in.:
- hosting repozytoriów,
- Pull Requesty,
- Issues,
- Actions / CI/CD,
- Releases,
- Wikis,
- Discussions,
- Projects,
- zarządzanie zespołami i uprawnieniami,
- GitHub Pages,
- Codespaces,
- GitHub Copilot,
- przeglądanie historii kodu,
- code review.
Najprościej:
Git = system kontroli wersji
GitHub = serwer + interfejs + narzędzia wokół Gita
Można używać Gita bez GitHuba.
Można także korzystać z GitLaba, Bitbucketa, Forgejo, Gitea lub własnego serwera Git.
2. Podstawowe pojęcia
Repository / repozytorium
Repozytorium to katalog projektu zarządzany przez Git.
Może istnieć:
- lokalnie,
- na GitHubie,
- jednocześnie lokalnie i zdalnie.
Repozytorium zawiera kod oraz katalog:
.git/
To właśnie .git przechowuje historię projektu.
Working tree
Aktualny stan plików projektu znajdujących się na dysku.
Staging area
Obszar pośredni pomiędzy zmianą pliku a wykonaniem commita.
Dodajesz pliki do staging area poleceniem:
git add
Commit
Commit to zapisany punkt historii projektu.
Można go traktować jak:
snapshot + opis + autor + data
Przykład:
git commit -m "Dodaj formularz kontaktowy"
Branch
Branch to niezależna linia rozwoju projektu.
Typowa główna gałąź:
main
Przykładowe dodatkowe branche:
feature/login
fix/mobile-menu
experiment/new-layout
Remote
Remote to zdalne repozytorium.
Najczęściej główny remote nosi nazwę:
origin
Sprawdzenie:
git remote -v
origin
origin nie jest specjalnym słowem Gita.
To tylko zwyczajowa nazwa zdalnego repozytorium.
Przykład:
origin -> git@github.com:user/projekt.git
upstream
upstream jest zwyczajową nazwą repozytorium źródłowego.
Najczęściej występuje przy pracy z forkiem.
Przykład:
upstream -> oryginalny projekt
origin -> twój fork
HEAD
HEAD wskazuje aktualnie używany commit/branch.
Najczęściej:
HEAD -> main
3. Instalacja Gita
Debian / Ubuntu
sudo apt update
sudo apt install git
Sprawdzenie:
git --version
FreeBSD
sudo pkg install git
Windows
Najpopularniej:
- Git for Windows,
- instalacja przez
winget.
Przykład:
winget install Git.Git
4. Pierwsza konfiguracja Gita
Ustaw nazwę autora:
git config --global user.name "Anna"
Ustaw e-mail:
git config --global user.email "adres@example.com"
Sprawdzenie:
git config --global --list
Domyślna gałąź main
git config --global init.defaultBranch main
Domyślny edytor
Vim:
git config --global core.editor "vim"
VS Code:
git config --global core.editor "code --wait"
5. Tworzenie repozytorium lokalnego
Przejdź do katalogu:
cd moj-projekt
Uruchom:
git init
Git utworzy:
.git/
Sprawdź:
git status
6. Klonowanie repozytorium
Jeżeli repozytorium istnieje już na GitHubie:
git clone ADRES
HTTPS:
git clone https://github.com/user/projekt.git
SSH:
git clone git@github.com:user/projekt.git
Git:
- pobierze repozytorium,
- utworzy katalog,
- skonfiguruje remote
origin.
Klonowanie pod inną nazwą katalogu
git clone git@github.com:user/projekt.git lokalny-projekt
7. Codzienny cykl pracy
Typowy workflow:
git pull
git status
# edycja plików
git diff
git add .
git commit -m "Opis zmian"
git push
W praktyce warto robić mniejsze, logiczne commity.
8. git status
Jedno z najważniejszych poleceń:
git status
Pokazuje:
- aktualny branch,
- zmodyfikowane pliki,
- nowe pliki,
- pliki dodane do staging,
- pliki usunięte,
- relację do zdalnej gałęzi.
Krótka forma:
git status -s
Przykład:
M README.md
?? notes.md
M oznacza modified.
?? oznacza plik nieśledzony.
9. git add
Dodanie jednego pliku:
git add README.md
Kilku:
git add README.md main.go
Wszystkich zmian:
git add .
Lub:
git add -A
Dodawanie fragmentów zmian
Bardzo użyteczne:
git add -p
Git pozwoli wybrać konkretne fragmenty zmian.
Dzięki temu można stworzyć czyste, logiczne commity.
10. git diff
Zmiany jeszcze niedodane do staging:
git diff
Zmiany już dodane przez git add:
git diff --staged
Zmiany względem innego brancha:
git diff main
11. Commit
Podstawowo:
git commit -m "Dodaj obsługę formularza"
Jeżeli chcesz otworzyć edytor:
git commit
Dobry commit
Dobry commit powinien reprezentować jedną logiczną zmianę.
Dobrze:
Dodaj walidację formularza kontaktowego
Gorzej:
zmiany
Jeszcze gorzej:
asdf
12. Historia commitów
git log
Krótsza forma:
git log --oneline
Przykład:
d91fc21 Add contact form
81ac812 Fix navigation
2b917df Initial commit
Przydatny widok historii
git log --graph --oneline --decorate --all
Można stworzyć alias:
git config --global alias.lg "log --graph --oneline --decorate --all"
Potem:
git lg
13. Branche
Lista branchy:
git branch
Nowy branch:
git branch feature/login
Przełączenie:
git switch feature/login
Utworzenie i przełączenie jednocześnie
git switch -c feature/login
Starszy odpowiednik:
git checkout -b feature/login
W nowoczesnym Git warto preferować:
git switch
do pracy z branchami.
14. Usuwanie brancha
Po mergu:
git branch -d feature/login
Wymuszenie:
git branch -D feature/login
Branch zdalny:
git push origin --delete feature/login
15. Merge
Załóżmy:
main
feature/login
Chcesz dodać feature do main.
Najpierw:
git switch main
Potem:
git merge feature/login
16. Fast-forward merge
Jeżeli od utworzenia feature brancha main się nie zmienił, Git może po prostu przesunąć wskaźnik brancha.
To właśnie:
fast-forward
17. Merge commit
Jeżeli obie gałęzie rozwijały się niezależnie, Git może utworzyć dodatkowy commit scalający.
Schemat:
A---B---C main
\
D---E feature
Po mergu:
A---B---C-------M
\ /
D---E----
M jest merge commitem.
18. Konflikty
Konflikt pojawia się wtedy, gdy Git nie potrafi automatycznie zdecydować, którą wersję zachować.
Przykład:
<<<<<<< HEAD
wersja z main
=======
wersja z feature
>>>>>>> feature
Musisz ręcznie zdecydować, jak ma wyglądać poprawna wersja.
Po poprawieniu:
git add plik
git commit
Przerwanie merge
git merge --abort
19. Rebase
Rebase przenosi commity na nową podstawę.
Przykład:
git switch feature/login
git rebase main
Pozwala zachować bardziej liniową historię.
Merge vs rebase
Merge:
zachowuje historię rozgałęzienia
Rebase:
przepisuje historię commitów
Dobra zasada:
Nie rób rebase cudzych commitów, które zostały już opublikowane i są aktywnie używane przez innych.
20. git pull
Najprościej:
git pull
W uproszczeniu:
git pull = git fetch + integracja zmian
Integracją może być merge albo rebase, zależnie od konfiguracji i parametrów.
Pull z rebase
git pull --rebase
Często daje czystszą historię.
21. git fetch
git fetch
Pobiera informacje o nowych commitach i branchach z serwera, ale nie zmienia automatycznie twojego working tree.
To bezpieczny sposób na sprawdzenie, co zmieniło się zdalnie.
Przykład:
git fetch origin
22. git push
Wysłanie commitów:
git push
Pierwszy push nowego brancha:
git push -u origin feature/login
-u ustawia upstream tracking branch.
Potem wystarczy:
git push
23. Remote
Lista:
git remote
Więcej informacji:
git remote -v
Dodanie:
git remote add origin git@github.com:user/repo.git
Zmiana adresu:
git remote set-url origin git@github.com:user/nowe-repo.git
Usunięcie:
git remote remove origin
24. Lokalne repozytorium → GitHub
Załóżmy, że masz lokalny projekt:
git init
git add .
git commit -m "Initial commit"
Na GitHubie tworzysz puste repozytorium.
Następnie:
git remote add origin git@github.com:user/projekt.git
git branch -M main
git push -u origin main
25. .gitignore
.gitignore określa pliki, których Git nie powinien śledzić.
Przykład:
.env
node_modules/
dist/
build/
*.log
.DS_Store
Ważne
.gitignore nie przestanie śledzić pliku, który został wcześniej dodany do repozytorium.
Wtedy:
git rm --cached plik
Np.:
git rm --cached .env
26. Nigdy nie wrzucaj sekretów do repozytorium
Nie commituj:
API keys
hasła
tokeny
klucze prywatne SSH
pliki .env
sekrety produkcyjne
credentials
Samo późniejsze usunięcie pliku nie oznacza usunięcia sekretu z historii Git.
Jeżeli sekret trafił do repozytorium:
- unieważnij go,
- wygeneruj nowy,
- dopiero potem czyść historię repozytorium.
27. Fork
Fork to osobne repozytorium utworzone na podstawie innego repozytorium.
GitHub zachowuje informację:
twój fork -> upstream
Fork ma własne:
- branche,
- ustawienia,
- Issues,
- Pull Requesty,
- Actions,
- tagi,
- uprawnienia.
28. Po co fork?
Najczęściej:
Open source
Nie masz prawa pushować do oryginalnego projektu.
Robisz więc:
fork
↓
clone twojego forka
↓
branch
↓
zmiany
↓
push
↓
Pull Request do oryginalnego repo
Eksperyment
Chcesz rozwijać własną wersję projektu.
Długotrwała własna odmiana
Fork może funkcjonować jako osobny wariant projektu.
29. Fork a branch
To bardzo ważne rozróżnienie.
Branch
Istnieje w tym samym repozytorium.
repo
├── main
├── feature-a
└── feature-b
Fork
Jest osobnym repozytorium.
oryginał
|
└── fork użytkownikaa
Jeżeli masz write access do projektu, zwykle wygodniej użyć brancha.
Jeżeli go nie masz - często używa się forka.
30. Workflow z forkiem
Forkujesz projekt na GitHubie.
Potem:
git clone git@github.com:user/projekt.git
cd projekt
Twój fork:
origin
Dodajesz oryginalne repo:
git remote add upstream git@github.com:autor/projekt.git
Sprawdzenie:
git remote -v
Powinno być mniej więcej:
origin git@github.com:user/projekt.git
upstream git@github.com:autor/projekt.git
31. Synchronizacja forka
Pobierz upstream:
git fetch upstream
Przejdź na main:
git switch main
Zaktualizuj:
git merge upstream/main
lub:
git rebase upstream/main
Następnie:
git push origin main
32. Pull Request
Pull Request, czyli PR, to propozycja włączenia zmian z jednego brancha do drugiego.
Najczęściej:
feature/login -> main
albo:
fork użytkownikaa -> upstream/main
Pull Request umożliwia:
- przegląd kodu,
- komentarze,
- code review,
- automatyczne testy,
- dyskusję,
- zatwierdzanie,
- merge.
33. Typowy Pull Request
main
↓
feature branch
↓
commity
↓
push
↓
Pull Request
↓
review
↓
poprawki
↓
merge
34. Draft Pull Request
Jeżeli praca nie jest jeszcze gotowa:
Draft PR
Pozwala pokazać zmiany innym bez sugerowania, że są gotowe do mergowania.
35. Merge PR
GitHub najczęściej oferuje trzy strategie.
Merge commit
Zachowuje wszystkie commity i tworzy merge commit.
Squash and merge
Wszystkie commity PR-a zostają połączone w jeden commit.
Przydatne, gdy branch zawiera:
fix
fix2
oops
really fix
final fix
Po squash:
Add login validation
Rebase and merge
Commity zostają kolejno przeniesione na koniec brancha docelowego.
Historia pozostaje liniowa.
36. Issues
Issue to zadanie, problem, pomysł lub zgłoszenie.
Przykłady:
Bug: formularz nie działa w Firefox
Feature: dodać wyszukiwarkę
Task: przygotować Dockerfile
Issue może mieć:
- opis,
- komentarze,
- labels,
- assignee,
- milestone,
- powiązany PR.
37. Automatyczne zamykanie Issue
W Pull Requeście lub commit message można wpisać:
Fixes #42
Po mergu GitHub automatycznie zamknie Issue #42.
Inne formy:
Closes #42
Resolves #42
38. Labels
Labels pomagają klasyfikować Issues i PR-y.
Przykłady:
bug
feature
documentation
good first issue
help wanted
priority-high
backend
frontend
39. Milestones
Milestone grupuje Issues i PR-y związane z większym celem.
Np.:
v1.0
MVP
Beta
Q1 2027
40. Releases
Release reprezentuje oficjalnie opublikowaną wersję projektu.
Przykład:
v1.0.0
Release może zawierać:
- opis zmian,
- pliki binarne,
- archiwa,
- instalatory,
- dokumentację,
- release notes.
41. Tagi Git
Tag wskazuje konkretny commit.
Przykład:
git tag v1.0.0
Lista:
git tag
Push taga:
git push origin v1.0.0
Wszystkie tagi:
git push origin --tags
42. Semantic Versioning
Popularny schemat:
MAJOR.MINOR.PATCH
Np.:
2.4.1
Interpretacja:
2 = duże zmiany / potencjalna niekompatybilność
4 = nowe funkcje
1 = poprawki błędów
43. README.md
README jest wizytówką repozytorium.
Dobry README zawiera:
Nazwa projektu
Opis
Screenshot
Funkcje
Instalacja
Uruchomienie
Konfiguracja
Przykłady
Roadmap
Licencja
44. LICENSE
Licencja określa, co inni mogą robić z kodem.
Popularne:
MIT
Apache 2.0
GPLv3
BSD
MPL
Brak licencji nie oznacza:
rób co chcesz
Wręcz przeciwnie - standardowo autor zachowuje prawa.
45. CONTRIBUTING.md
Plik opisujący sposób współpracy z projektem.
Może zawierać:
- standard kodu,
- sposób tworzenia branchy,
- sposób nazywania commitów,
- proces PR,
- wymagane testy,
- zasady zgłaszania Issues.
46. CODEOWNERS
Plik:
.github/CODEOWNERS
Pozwala przypisać właścicieli fragmentów projektu.
Np.:
/frontend/ @frontend-team
/backend/ @backend-team
GitHub może automatycznie prosić odpowiednie osoby o review.
47. GitHub Actions
GitHub Actions automatyzuje zadania.
Przykłady:
build
testy
lint
deploy
publikowanie obrazu Docker
release
skan bezpieczeństwa
Workflow znajduje się zwykle w:
.github/workflows/
Np.:
.github/workflows/test.yml
48. GitHub Pages
GitHub Pages pozwala publikować statyczne strony WWW bezpośrednio z repozytorium.
Nadaje się m.in. do:
- dokumentacji,
- portfolio,
- stron projektu,
- prostych statycznych serwisów.
49. GitHub Projects
Projects to narzędzie do organizacji pracy.
Można używać:
Backlog
Todo
In progress
Review
Done
Może działać podobnie do prostego Kanbana.
50. GitHub Discussions
Discussions są przeznaczone bardziej do rozmów społeczności niż do konkretnych bugów.
Dobre do:
- pytań,
- pomysłów,
- głosowań,
- dyskusji o kierunku projektu.
51. GitHub CLI - gh
GitHub posiada oficjalny CLI:
gh
Pozwala obsługiwać GitHub bez przeglądarki.
52. Instalacja GitHub CLI
Debian
Najlepiej użyć oficjalnego repozytorium pakietów GitHub CLI albo pakietu dostępnego dla używanej wersji systemu.
Sprawdzenie:
gh --version
FreeBSD
sudo pkg install gh
53. Logowanie do GitHub CLI
gh auth login
CLI zapyta m.in.:
GitHub.com
HTTPS lub SSH
sposób uwierzytelnienia
Sprawdzenie:
gh auth status
54. Tworzenie repo przez CLI
Interaktywnie:
gh repo create
Np.:
gh repo create example-site
Publiczne:
gh repo create example-site --public
Prywatne:
gh repo create example-site --private
55. Klonowanie przez gh
gh repo clone owner/repository
Np.:
gh repo clone user/example-site
56. Fork przez CLI
gh repo fork owner/repository
Można również od razu sklonować fork.
57. Pull Request przez CLI
Utworzenie:
gh pr create
Podgląd:
gh pr view
Lista:
gh pr list
Checkout PR:
gh pr checkout 42
Merge:
gh pr merge 42
58. Issues przez CLI
Lista:
gh issue list
Nowe Issue:
gh issue create
Podgląd:
gh issue view 42
Zamknięcie:
gh issue close 42
59. Releases przez CLI
Lista:
gh release list
Utworzenie:
gh release create v1.0.0
Podgląd:
gh release view v1.0.0
60. Actions przez CLI
Lista workflow:
gh workflow list
Lista uruchomień:
gh run list
Podgląd konkretnego runa:
gh run view
Śledzenie działania:
gh run watch
61. SSH do GitHuba
SSH jest bardzo wygodne do codziennego używania.
Generowanie klucza:
ssh-keygen -t ed25519 -C "adres@example.com"
Domyślnie powstaną:
~/.ssh/id_ed25519
~/.ssh/id_ed25519.pub
Publiczny klucz:
cat ~/.ssh/id_ed25519.pub
Dodajesz go do GitHuba.
Test połączenia
ssh -T git@github.com
Adres SSH repozytorium
git@github.com:user/repository.git
62. HTTPS vs SSH
HTTPS
Zalety:
- łatwe na start,
- działa praktycznie wszędzie.
SSH
Zalety:
- wygodne po konfiguracji,
- bez wpisywania danych przy każdym push,
- popularne w pracy developerskiej.
Do stałej pracy developerskiej SSH jest bardzo wygodne.
63. git restore
Przywrócenie pliku do wersji z ostatniego commita:
git restore plik
UWAGA: tracisz niezapisane zmiany w tym pliku.
Usunięcie pliku ze staging
git restore --staged plik
Plik pozostanie zmodyfikowany, ale przestanie być przygotowany do commita.
64. git reset
Reset pozwala przesuwać aktualny branch do wcześniejszego commita.
Soft
git reset --soft HEAD~1
Cofa commit, ale pozostawia zmiany w staging.
Mixed
git reset HEAD~1
Cofa commit i staging, ale pozostawia zmiany w plikach.
Hard
git reset --hard HEAD~1
Cofa commit i usuwa lokalne zmiany.
--hard należy traktować ostrożnie.
65. git revert
Bezpieczny sposób cofnięcia opublikowanego commita:
git revert HASH
Git tworzy nowy commit odwracający stare zmiany.
Dobre rozwiązanie dla historii, która została już wypchnięta do wspólnego repozytorium.
66. Amend
Zmiana ostatniego commita:
git commit --amend
Zmiana komunikatu:
git commit --amend -m "Nowy opis"
Jeżeli commit był już opublikowany, amend zmienia jego hash.
67. Stash
Stash pozwala tymczasowo schować niezacommitowane zmiany.
git stash
Lista:
git stash list
Przywrócenie:
git stash pop
Bez usunięcia ze stash:
git stash apply
68. Praktyczny przykład stash
Pracujesz nad:
feature/search
Nagle musisz poprawić błąd na main.
git stash
git switch main
Naprawiasz błąd.
Potem:
git switch feature/search
git stash pop
I kontynuujesz pracę.
69. Cherry-pick
Pozwala przenieść konkretny commit z innego brancha.
git cherry-pick HASH
Przykład:
git cherry-pick a12bc34
Przydatne, gdy potrzebujesz jednej konkretnej poprawki bez mergowania całej gałęzi.
70. Git blame
Pokazuje, kto i kiedy zmienił konkretne linie:
git blame plik
Np.:
git blame main.go
To narzędzie do badania historii, niekoniecznie do szukania winnych.
71. Git show
Pokazuje szczegóły commita:
git show HASH
Np.:
git show a12bc34
72. Git grep
Wyszukiwanie w śledzonych plikach repo:
git grep "TODO"
73. Git clean
Pokazuje nieśledzone pliki, które mogą zostać usunięte:
git clean -n
Usunięcie:
git clean -f
Katalogi:
git clean -fd
Najpierw praktycznie zawsze używaj:
git clean -n
74. Force push
git push --force
Może nadpisać historię na serwerze.
Bezpieczniejsza odmiana:
git push --force-with-lease
--force-with-lease sprawdza, czy ktoś inny nie zmienił zdalnego brancha.
Jeżeli musisz użyć force push, zwykle wybieraj:
git push --force-with-lease
75. Detached HEAD
Możesz przejść bezpośrednio do konkretnego commita:
git switch --detach HASH
Wtedy:
HEAD nie wskazuje na branch
To tzw. detached HEAD.
Możesz oglądać kod i eksperymentować.
Jeśli chcesz zachować zmiany:
git switch -c nowy-branch
76. GitHub branch protection / rulesets
Można chronić ważne branche, np.:
main
Typowe zasady:
- zakaz bezpośredniego push,
- wymagany Pull Request,
- wymagane review,
- wymagane testy,
- zakaz force push,
- wymagany podpis commitów.
Dobre dla zespołów i ważnych projektów.
77. GitHub Secrets
Sekrety dla Actions można przechowywać w GitHubie.
Przykładowo:
API_TOKEN
SSH_KEY
DEPLOY_PASSWORD
Workflow może korzystać z nich bez umieszczania sekretu w repozytorium.
78. GitHub Organizations
Organization grupuje:
- repozytoria,
- użytkowników,
- zespoły,
- uprawnienia.
Przykład:
Null Yard
├── martwy-kompas
├── web-monitor
├── hermes-tools
└── experiments
Przy wielu projektach organizacja jest wygodniejsza niż trzymanie wszystkiego na koncie osobistym.
79. Publiczne i prywatne repozytorium
Public
Każdy może zobaczyć repozytorium.
Dobre do:
- portfolio,
- open source,
- narzędzi publicznych,
- demonstracji projektu.
Private
Kod widzą tylko osoby z odpowiednimi uprawnieniami.
Dobre do:
- projektów firmowych,
- eksperymentów,
- niedokończonych produktów,
- kodu zawierającego rozwiązania, których nie chcesz publikować.
Sekretów nadal nie należy commitować nawet do prywatnego repozytorium.
80. Typowy workflow dla własnego projektu
Przykład:
git switch main
git pull
git switch -c feature/search
# praca
git status
git diff
git add .
git commit -m "Add story search"
git push -u origin feature/search
Tworzysz Pull Request.
Po merge:
git switch main
git pull
git branch -d feature/search
81. Typowy workflow solo - prostszy wariant
Jeżeli projekt robisz sam i nie potrzebujesz PR do każdej zmiany:
git pull
# praca
git add .
git commit -m "Improve article layout"
git push
Nie trzeba sztucznie komplikować workflow.
Branche warto jednak stosować przy:
- większych zmianach,
- eksperymentach,
- refactoringu,
- ryzykownych funkcjach.
82. Workflow open source
gh repo fork owner/project --clone
cd project
Dodaj upstream, jeśli nie zrobił tego automatycznie workflow:
git remote add upstream git@github.com:owner/project.git
Nowa gałąź:
git switch -c fix/readme
Zmiany:
git add README.md
git commit -m "Fix installation instructions"
Push:
git push -u origin fix/readme
PR:
gh pr create
83. Aktualizacja brancha przed PR
git fetch upstream
git rebase upstream/main
Jeżeli pojawią się konflikty:
# popraw pliki
git add .
git rebase --continue
Jeżeli chcesz przerwać:
git rebase --abort
Po rebase opublikowanego własnego brancha może być potrzebne:
git push --force-with-lease
84. GitHub Web UI - rzeczy, które warto znać
W repozytorium najczęściej zobaczysz:
Code
Issues
Pull requests
Actions
Projects
Wiki
Security
Insights
Settings
Code
Kod projektu i historia plików.
Issues
Zadania i błędy.
Pull requests
Propozycje zmian.
Actions
Automatyzacje CI/CD.
Security
Alerty bezpieczeństwa i zależności.
Insights
Statystyki projektu.
Settings
Konfiguracja repozytorium.
85. Commit hash
Każdy commit ma unikalny identyfikator.
Przykład:
8a3d9c6e81923...
Zwykle wystarczy krótki fragment:
8a3d9c6
Używany np.:
git show 8a3d9c6
git revert 8a3d9c6
git cherry-pick 8a3d9c6
86. Origin/main
Po:
git fetch
Git może mieć lokalny wskaźnik:
origin/main
To nie jest zwykły lokalny branch.
To lokalna informacja o stanie zdalnego brancha main z repozytorium origin.
87. Sprawdzenie różnicy local vs remote
git fetch
git log HEAD..origin/main --oneline
Commity dostępne zdalnie, których nie masz lokalnie.
Odwrotnie:
git log origin/main..HEAD --oneline
Twoje lokalne commity, których nie ma jeszcze na GitHubie.
88. Alias przydatnych komend
Możesz stworzyć:
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.cm commit
Przykład:
git st
89. Najważniejsze pliki GitHubowe
Typowe:
README.md
LICENSE
CONTRIBUTING.md
SECURITY.md
CODE_OF_CONDUCT.md
.github/
W .github/ mogą być:
workflows/
ISSUE_TEMPLATE/
PULL_REQUEST_TEMPLATE.md
CODEOWNERS
dependabot.yml
90. Pull Request Template
Przykład pliku:
.github/PULL_REQUEST_TEMPLATE.md
Może automatycznie dodawać formularz:
## Co zmieniono?
## Jak przetestować?
## Powiązane Issue
## Checklist
- [ ] testy przechodzą
- [ ] dokumentacja zaktualizowana
91. Issue Templates
Możesz mieć osobne szablony:
Bug report
Feature request
Documentation issue
Pomagają uzyskać kompletne zgłoszenia.
92. GitHub Actions - minimalna idea
Workflow może wyglądać koncepcyjnie tak:
name: Test
on:
push:
pull_request:
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- run: go test ./...
Nie musisz znać Actions od razu.
Warto jednak rozumieć zasadę:
zdarzenie
↓
runner
↓
kolejne kroki
↓
wynik
93. CI/CD
CI - Continuous Integration
Automatycznie:
build
test
lint
security checks
po push lub PR.
CD - Continuous Delivery / Deployment
Automatyczne:
release
deployment
publikacja aplikacji
94. GitHub Packages
GitHub może przechowywać pakiety i obrazy kontenerów.
Przykład:
ghcr.io
GitHub Container Registry może przechowywać obrazy Dockera.
95. Gist
Gist służy do przechowywania małych fragmentów kodu lub tekstu.
CLI:
gh gist create plik.txt
Dobre do:
- snippetów,
- notatek,
- małych przykładów.
Nie zastępuje pełnego repozytorium.
96. Clone vs fork
Clone
Tworzy lokalną kopię repozytorium.
git clone ...
Nie tworzy nowego repozytorium na GitHubie.
Fork
Tworzy nowe repozytorium na GitHubie powiązane z upstream.
Potem fork zazwyczaj klonujesz.
97. Pull vs fetch
fetch
git fetch
Pobiera informacje.
Nie integruje automatycznie zmian.
pull
git pull
Pobiera i integruje zmiany.
Jeżeli chcesz najpierw zobaczyć, co się zmieniło:
git fetch
git log HEAD..origin/main --oneline
98. Add vs commit vs push
To jeden z najważniejszych modeli mentalnych.
plik
↓
git add
↓
staging
↓
git commit
↓
lokalne repozytorium
↓
git push
↓
GitHub
commit nie wysyła kodu na GitHuba.
push wysyła istniejące lokalne commity.
99. Pull Request nie jest git pull
To często mylone pojęcia.
git pull
jest komendą Gita pobierającą zmiany.
Pull Request
jest funkcją GitHuba służącą do proponowania zmian.
100. Fork nie jest kopią ZIP
Fork zachowuje relację z repozytorium źródłowym.
GitHub wie:
forked from owner/project
Dzięki temu można:
- synchronizować zmiany,
- tworzyć PR do upstream,
- śledzić relację między repozytoriami.
101. Praca z istniejącym projektem - bezpieczna procedura
Po sklonowaniu:
git status
git remote -v
git branch -a
git log --oneline -10
Jeżeli chcesz coś zmienić:
git switch -c moja-zmiana
Po pracy:
git diff
git add .
git commit -m "Opis zmiany"
git push -u origin moja-zmiana
102. Jak przeczytać repozytorium, którego nie znasz
Najpierw zobacz:
README.md
LICENSE
CONTRIBUTING.md
Potem:
git log --oneline -20
Sprawdź:
git branch -a
Następnie strukturę katalogów:
tree -L 2
lub:
find . -maxdepth 2 -type f
Sprawdź build system:
Makefile
package.json
go.mod
Cargo.toml
pyproject.toml
requirements.txt
Dockerfile
docker-compose.yml
103. Jak sprawdzić, co ostatnio zmieniono
git log --oneline -10
Szczegóły:
git show HEAD
Poprzedni commit:
git show HEAD~1
Zmiany między dwoma commitami:
git diff HASH1 HASH2
104. Jak cofnąć przypadkową zmianę
Plik niezacommitowany:
git restore plik
Plik przypadkowo dodany do staging:
git restore --staged plik
Ostatni commit lokalny:
git reset --soft HEAD~1
Opublikowany commit:
git revert HASH
105. Jak znaleźć zgubiony commit
Git posiada:
git reflog
Pokazuje historię zmian wskaźnika HEAD.
Przykład:
git reflog
Możesz znaleźć commit nawet po nieudanym reset/rebase.
To jedno z najlepszych narzędzi ratunkowych Gita.
106. Typowe sytuacje awaryjne
„Zrobiłem zmiany na złym branchu”
Jeżeli jeszcze nie commitowałeś:
git switch -c poprawny-branch
Zmiany przejdą razem z tobą, jeśli Git może bezpiecznie przełączyć branch.
„Zacommitowałem na złym branchu”
Możesz utworzyć branch z obecnego miejsca:
git branch poprawny-branch
Potem naprawić poprzedni branch odpowiednim resetem.
„Pull wywołał konflikt”
Sprawdź:
git status
Popraw pliki.
Potem:
git add .
Następnie zależnie od operacji:
git commit
lub:
git rebase --continue
„Chcę się wycofać z merge”
git merge --abort
„Chcę się wycofać z rebase”
git rebase --abort
107. Dobre praktyki
- Rób małe, logiczne commity.
- Czytaj
git status. - Przed commitem używaj
git diff. - Przed większą pracą zrób branch.
- Regularnie synchronizuj projekt.
- Nie commituj sekretów.
- Nie używaj
git push --forcebez powodu. - Nie rób rebase wspólnej historii bez uzgodnienia.
- Pisz sensowne komunikaty commitów.
- Utrzymuj README.
- Używaj Issues do większych zadań.
- Używaj PR do zmian, które warto przejrzeć.
108. Prosty model pracy dla własnych projektów
Dla małego projektu prowadzonego solo dobrze działa:
main
│
├── feature/*
├── fix/*
└── experiment/*
Przykład:
git switch main
git pull
git switch -c feature/search
Po zakończeniu:
git add .
git commit -m "Add search"
git push -u origin feature/search
Następnie PR i merge.
Drobne zmiany można wykonywać bezpośrednio na main, jeśli świadomie wybierasz prostszy workflow.
109. Sensowne nazwy branchy
Przykłady:
feature/search
feature/login
fix/mobile-layout
fix/api-timeout
docs/install-guide
refactor/database
experiment/new-ui
Nie jest to wymóg GitHuba, tylko dobra organizacja.
110. Conventional Commits - opcjonalnie
Popularna konwencja:
feat: add search
fix: repair mobile menu
docs: update installation guide
refactor: simplify API client
test: add login tests
chore: update dependencies
Nie jest obowiązkowa.
Przy większych projektach pomaga automatyzować changelog i release.
111. Przykład pełnego workflow feature
git switch main
git pull --rebase
git switch -c feature/search
# edycja
git status
git diff
git add .
git commit -m "feat: add story search"
git push -u origin feature/search
gh pr create
Po merge:
git switch main
git pull
git branch -d feature/search
112. Przykład poprawki błędu
git switch main
git pull
git switch -c fix/mobile-menu
# poprawka
git add .
git commit -m "fix: repair mobile navigation"
git push -u origin fix/mobile-menu
gh pr create
113. Przykład synchronizacji forka
git fetch upstream
git switch main
git rebase upstream/main
git push origin main
Następnie nowa praca:
git switch -c fix/docs
114. Przydatne polecenia - ściąga
Stan projektu
git status
git status -s
git diff
git diff --staged
Historia
git log
git log --oneline
git log --graph --oneline --decorate --all
git show HEAD
git reflog
Commit
git add .
git add -p
git commit -m "Opis"
git commit --amend
Branch
git branch
git switch main
git switch -c nowy-branch
git branch -d branch
Synchronizacja
git fetch
git pull
git pull --rebase
git push
git push -u origin branch
Remote
git remote -v
git remote add origin URL
git remote add upstream URL
Merge / rebase
git merge branch
git merge --abort
git rebase main
git rebase --continue
git rebase --abort
Cofanie
git restore plik
git restore --staged plik
git reset --soft HEAD~1
git revert HASH
Tymczasowe zmiany
git stash
git stash list
git stash pop
GitHub CLI
gh auth login
gh repo clone owner/repo
gh repo create
gh repo fork owner/repo
gh pr create
gh pr list
gh pr view
gh pr merge
gh issue list
gh issue create
gh release create
gh run list
115. Minimum do codziennej pracy
Jeżeli zapamiętasz tylko kilkanaście poleceń, niech będą to:
git clone
git status
git diff
git add
git commit
git log
git switch
git branch
git pull
git fetch
git push
git merge
git restore
git stash
git remote -v
oraz:
gh auth login
gh pr create
gh pr list
gh repo clone
gh repo fork
116. Model mentalny Git + GitHub
Najważniejszy schemat:
WORKING DIRECTORY
│
│ git add
▼
STAGING AREA
│
│ git commit
▼
LOCAL REPOSITORY
│
│ git push
▼
GITHUB
W drugą stronę:
GITHUB
│
│ git fetch / git pull
▼
LOCAL REPOSITORY
│
▼
WORKING DIRECTORY
117. Branch / Fork / PR - model mentalny
UPSTREAM REPOSITORY
│
│ fork
▼
YOUR FORK
│
│ clone
▼
LOCAL REPOSITORY
│
│ branch
▼
FEATURE BRANCH
│
│ commits
▼
PUSH TO FORK
│
│ Pull Request
▼
UPSTREAM
118. Co warto znać później
Gdy podstawy będą już naturalne, warto poznać:
- interactive rebase,
git bisect,- submodules,
- worktrees,
- signed commits,
- Git LFS,
- branch protection,
- GitHub Actions,
- GitHub Packages,
- GitHub API,
- Dependabot,
- CODEOWNERS,
- release automation,
- semantic-release,
- conventional commits.
119. Najważniejsza zasada
Git jest bardzo trudny, kiedy próbuje się zapamiętać wszystkie komendy.
Staje się znacznie prostszy, gdy rozumiesz model:
zmieniam pliki
↓
wybieram zmiany
↓
tworzę commit
↓
wysyłam commit
oraz:
branch = linia pracy
fork = osobne repo
PR = propozycja połączenia zmian
To wystarcza do większości codziennej pracy.
120. Podręczny workflow dla jednej osoby
Start dnia:
git switch main
git pull --rebase
Nowa funkcja:
git switch -c feature/nazwa
Podczas pracy:
git status
git diff
Commit:
git add -p
git commit -m "feat: opis zmiany"
Publikacja:
git push -u origin feature/nazwa
PR:
gh pr create
Po merge:
git switch main
git pull
git branch -d feature/nazwa
Gotowe.
Oficjalna dokumentacja
Aktualne źródła:
- Git:
https://git-scm.com/docs - GitHub Docs:
https://docs.github.com/ - GitHub CLI:
https://docs.github.com/en/github-cli - GitHub CLI repository:
https://github.com/cli/cli
Podsumowanie
Do sprawnej pracy z GitHubem trzeba przede wszystkim rozumieć:
repository
commit
branch
remote
origin
upstream
fetch
pull
push
merge
rebase
fork
Pull Request
Issue
Release
Git przechowuje historię.
GitHub przechowuje repozytorium i organizuje współpracę.
Najczęstsza codzienna sekwencja pozostaje bardzo prosta:
git pull
git status
git add .
git commit -m "Opis"
git push
A przy większej zmianie:
git switch -c feature/nazwa
# praca
git add .
git commit -m "Opis"
git push -u origin feature/nazwa
gh pr create