Tech Handbook Null Yard

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

  1. fork repo,
  2. clone swojego forka,
  3. dodaj upstream,
  4. twórz branch,
  5. push do forka,
  6. 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