Praca z remote to codzienność w każdym zespole – ale wiele osób używa tylko git pull i ma mglistą świadomość co się właściwie dzieje. Tracking refs, różnica między fetch a pull, kiedy --force-with-lease zamiast --force, i jak naprawdę działają zdalne branche to wiedza, która ratuje przed nieodwracalnymi błędami.
Remote – skonfiguruj i zarządzaj
# Lista zdalnych repozytoriów git remote -v # Dodaj remote git remote add upstream https://github.com/magento/magento2.git # Zmień URL git remote set-url origin git@github.com:firma/projekt.git # Usuń remote git remote remove upstream # Pobierz informacje o wszystkich remotach git remote update
Fetch – bezpieczna aktualizacja
Fetch pobiera zmiany z remote i aktualizuje tracking refs (origin/main, origin/develop) bez dotykania lokalnych branchów. Zawsze bezpieczny.
# Pobierz zmiany ze wszystkich remotów git fetch --all # Pobierz konkretny remote git fetch origin # Pobierz konkretny branch git fetch origin main # Po fetch sprawdź co nowego git log main..origin/main --oneline git diff main origin/main # Wyświetl zdalne branche git branch -r git branch -a # lokalne + zdalne
Pull – fetch + merge w jednym
# Standardowy pull (merge) git pull origin main # Pull z rebase zamiast merge git pull --rebase origin main # Ustaw rebase jako domyślną strategię pull git config --global pull.rebase true # Sprawdź co zostanie zmergowane przed pull git fetch origin git log HEAD..origin/main --oneline
Push i force-with-lease
# Zwykły push git push origin main # Push nowego brancha i ustaw tracking git push -u origin feature/order-export # Force push (NIEBEZPIECZNY - nadpisuje zdalną historię) git push --force origin main # nigdy na shared branchach! # Force-with-lease (bezpieczny odpowiednik --force) # Wycofa się jeśli ktoś inny wypchnął zmiany od ostatniego fetch git push --force-with-lease origin main # Kiedy force-with-lease jest potrzebny? # Po git rebase -i na feature branchu - SHA się zmieniły # Po git commit --amend na feature branchu # Nigdy na main/develop/release!
Tracking branches
# Sprawdź tracking dla każdego brancha git branch -vv # * main a3d5e2f [origin/main] Add product export # feature/cart b4c6d7e [origin/feature/cart: ahead 2] Fix total # Ustaw tracking ręcznie git branch --set-upstream-to=origin/main main # Utwórz lokalny branch śledzący zdalny git checkout --track origin/feature/new-api # lub krócej: git checkout feature/new-api # Git automatycznie znajdzie origin/feature/new-api
Praca z wieloma remotami
# Typowy setup przy forku: origin = Twój fork, upstream = oryginał git remote add origin git@github.com:henryk/magento2-module.git git remote add upstream git@github.com:firma/magento2-module.git # Aktualizuj swój fork z upstream git fetch upstream git checkout main git rebase upstream/main git push origin main # Sprawdź czy Twój branch jest aktualny z upstream git log HEAD..upstream/main --oneline
Czyszczenie starych tracking refs
# Usuń tracking refs do branchów usuniętych na remote git fetch --prune git remote prune origin # Ustaw automatyczne pruning git config --global fetch.prune true # Wyświetl "stale" tracking refs git remote prune origin --dry-run
Podsumowanie
Fetch jest bezpieczny – aktualizuje tylko tracking refs. Pull to fetch + merge, z opcją rebase. Force-with-lease to jedyna akceptowalna forma force pusha na feature branchach po rebase. Tracking branches łączą lokalne branche z ich zdalnymi odpowiednikami i umożliwiają git push bez podawania remote/branch. Następny wpis: workflow zespołowy – Git Flow, trunk-based development i code review.
