Git w praktyce zespołowej
Zespołowy workflow Git powinien przede wszystkim utrzymywać czytelną historię zmian, małe reviewowalne commity i przewidywalne scalanie. Branching model jest mniej ważny niż jasne zasady pracy z diffem, review i konfliktem.
Powiązane tematy: GitHub, CI/CD i GitHub Actions, Visual Studio Code oraz Dokumentowanie rozwiązań technicznych.
1. Git a GitHub
Git to system kontroli wersji.
GitHub to platforma przechowująca repozytoria Git i dodająca: - Pull Requests, - Issues, - Actions, - Releases, - permissions.
2. Podstawowy cykl
git status
git add .
git commit -m "Opis zmiany"
git push
3. Klonowanie
git clone git@github.com:user/repo.git
cd repo
4. Remote
git remote -v
Dodanie:
git remote add origin git@github.com:user/repo.git
5. Branch
Lista:
git branch
Nowy branch:
git switch -c feature/login
Zmiana:
git switch main
Usunięcie:
git branch -d feature/login
6. Merge
git switch main
git merge feature/login
7. Konflikt
Git oznaczy fragment:
<<<<<<< HEAD
wersja A
=======
wersja B
>>>>>>> feature
Po ręcznym rozwiązaniu:
git add plik
git commit
8. Pull
git pull
To najczęściej fetch + merge.
Bezpieczniej rozumieć oba kroki:
git fetch
git log --oneline --graph --all
git merge origin/main
9. Rebase
git switch feature/login
git rebase main
Rebase przepisuje historię brancha.
Nie rebazuj pochopnie historii, z której korzystają inni.
10. Stash
git stash
git stash list
git stash pop
Z opisem:
git stash push -m "WIP login"
11. Cherry-pick
Przenosi konkretny commit:
git cherry-pick abc1234
12. revert
Tworzy nowy commit odwracający wcześniejszy:
git revert abc1234
Dobre rozwiązanie dla historii współdzielonej.
13. reset
Miękki:
git reset --soft HEAD~1
Mieszany:
git reset HEAD~1
Twardy:
git reset --hard HEAD~1
--hard usuwa niezapisane zmiany.
14. restore
Przywrócenie pliku:
git restore plik.txt
Usunięcie ze staging:
git restore --staged plik.txt
15. Historia
git log
git log --oneline
git log --oneline --graph --decorate --all
16. diff
git diff
git diff --staged
git diff main..feature
17. Tags
git tag v1.0.0
git push origin v1.0.0
Annotated:
git tag -a v1.0.0 -m "Release 1.0.0"
18. .gitignore
Przykład:
.env
node_modules/
dist/
*.log
.DS_Store
Plik już śledzony nie zniknie tylko dlatego, że trafił do .gitignore.
git rm --cached plik
19. Feature branch workflow
main
└─ feature/x
commits
↓
Pull Request
↓
review
↓
merge
20. Fork workflow
- fork repo,
- clone swojego forka,
- dodaj upstream,
- twórz branch,
- push do forka,
- Pull Request do upstream.
git remote add upstream git@github.com:ORG/REPO.git
git fetch upstream
21. Dobra historia commitów
Dobre:
Add health check endpoint
Fix nginx proxy headers
Document deployment process
Słabe:
fix
update
stuff
changes
22. Małe commity
Commit powinien przedstawiać jedną logiczną zmianę.
Dzięki temu łatwiej: - review, - revert, - bisect, - zrozumieć historię.
23. git bisect
Do znalezienia commita, który wprowadził błąd:
git bisect start
git bisect bad
git bisect good v1.0.0
Git wybiera kolejne punkty historii.
24. Detached HEAD
Możesz przejść do starego commita:
git checkout abc1234
Nie jesteś wtedy na branchu.
Jeśli chcesz pracować:
git switch -c investigation
25. Typowy workflow solo
git pull --ff-only
git switch -c feature/foo
# praca
git add .
git commit -m "Add foo"
git push -u origin feature/foo
Potem PR i merge.
26. Co trzeba umieć
- branchować,
- scalać,
- rozwiązywać konflikty,
- używać stash,
- znać różnicę revert/reset,
- czytać historię,
- pracować z remote,
- sensownie organizować commity.
Oficjalne źródła
- Git documentation: https://git-scm.com/doc
- Pro Git book: https://git-scm.com/book/en/v2