Kontrola wersji z Claude Code: commity, konflikty, PR-y i worktree
ENClaude Code obsługuje git przez narzędzie Bash, więc kontrola wersji staje się rozmową: na starcie sesji dostaje migawkę stanu repozytorium, dzieli zmiany na commity w formacie zespołu, wyjaśnia i rozwiązuje konflikty, otwiera pull requesty przez GitHub CLI i izoluje równoległe sesje poleceniem claude --worktree. Każdej zmiany dowodzą testy i review, nie opis commita.
Ta strona jest dla programistów, którzy używają już Claude Code w prawdziwym repozytorium. Od dwóch godzin pracujesz nad funkcją, która obejmuje siedem plików, a w drzewie roboczym leży jeszcze poprawka błędu zauważonego po drodze i refaktoryzacja, której nie umiałeś sobie odmówić. Chcesz trzech czystych commitów, PR-a, którego recenzent zatwierdzi bez czytania każdej linii, i drugiej sesji, która przygotowuje hotfix, podczas gdy pierwsza pracuje dalej. Strona zakłada, że pracujesz już w pętli eksploracja, plan, kod i weryfikacja; tutaj wynik tej pętli zamienia się w historię repozytorium.
Co zyskasz na pracy z gitem w Claude Code
Dział zatytułowany „Co zyskasz na pracy z gitem w Claude Code”- Blok w
CLAUDE.mdi politykę uprawnień, dzięki którym Claude commituje po twojemu i pyta przed pushem, także w trybie auto. - Cztery prompty do skopiowania: podział splątanych zmian, rozwiązywanie konfliktów, PR z dowodami i szukanie regresji przez
git bisect. - Plugin
commit-commandsdo commitów i PR-ów jednym poleceniem oraz wiedzę, kiedy go nie używać. - Równoległe sesje w worktree przez
claude --worktree, razem z.worktreeincludei sprzątaniem. - Sposoby wyjścia z typowych wpadek przy pracy agenta z gitem oraz odpowiedź, kto zatwierdza zmianę przed merge.
Co Claude Code wie o twoim repozytorium
Dział zatytułowany „Co Claude Code wie o twoim repozytorium”Gdy startuje lokalna rozmowa, Claude Code przekazuje Claude’owi migawkę stanu gita: bieżącą gałąź, wynik git status i ostatnie commity. Ładuje też wbudowane instrukcje pisania commitów i pull requestów. Możesz więc zacząć od „commit my changes” zamiast wklejać diff.
W praktyce liczą się dwa szczegóły:
- Migawka nie jest aktualizowana na bieżąco. Claude Code tworzy ją na starcie sesji i odświeża po kompaktowaniu kontekstu (od v2.1.269), a nie po każdym poleceniu. Jeśli przełączysz gałąź albo zrobisz commit w innym terminalu, Claude pracuje na nieaktualnym stanie, dopóki znowu nie uruchomi
git status. Po każdej zmianie zrobionej poza sesją napisz „re-read the git state first”. - Commity mają atrybucję. Domyślnie Claude Code dodaje do commitów trailer
Co-Authored-By, a do opisów PR linię „Generated with Claude Code”. Zmienisz lub ukryjesz je ustawieniemattribution("attribution": falsewymaga v2.1.281 lub nowszej). Starsze wersje pomijają plik ustawień, który je zawiera, więc we wspólnym.claude/settings.jsonużyj formy obiektowej, na przykład"attribution": { "commit": "", "pr": "", "sessionUrl": false }.includeGitInstructions: falseustaw tylko wtedy, gdy własny skill gitowy zastępuje wbudowane instrukcje; to ustawienie usuwa też migawkę stanu gita, więc twój skill powinien sam uruchamiaćgit status.
Ustaw raz zasady commitów i uprawnienia gita
Dział zatytułowany „Ustaw raz zasady commitów i uprawnienia gita”Konwencje zespołu wpisz do CLAUDE.md, żeby każda sesja stosowała je bez przypominania. Gdzie leży ten plik i jak się ładuje, opisuje przewodnik po plikach pamięci Claude Code.
## Git rules- Conventional commits: feat, fix, docs, refactor, test, chore, with a scope: feat(auth): add OAuth flow- Subject line under 72 characters; body explains why, not what- One logical change per commit; never mix a refactor with a behaviour change- Run `npm test` before every commit and paste the summary line into the commit body- Never use --no-verify, never amend or force-push a pushed commit, never commit to main- Reference the issue: Closes #123Potem zdecyduj, co Claude może zrobić bez pytania. Ten .claude/settings.json pozwala swobodnie commitować, każdy push zamienia w pytanie i odrzuca force push:
{ "permissions": { "allow": ["Bash(git add *)", "Bash(git commit *)"], "ask": ["Bash(git push *)"], "deny": ["Bash(git push --force *)", "Bash(git push -f *)"] }}To, które z tych reguł faktycznie działają, zależy od trybu uprawnień. Od Claude Code v2.1.283 (oba kanały wydań na 2026-10-12) tryb auto jest trybem startowym interaktywnych sesji w terminalu na modelach, które go obsługują (zobacz przewodnik po konfiguracji), a w trybie auto push do dowolnej gałęzi twojego repozytorium i otwarcie pull requesta zgodnego z twoją prośbą odbywają się bez pytania. To reguła ask powyżej przywraca ludzki punkt kontrolny przed każdym pushem, bo tryb auto nadal pokazuje pytania wymuszone regułą ask. Klasyfikator trybu auto domyślnie blokuje też force push, git reset --hard, git clean -fd i amend commita, który już wypchnięto, a reguły deny blokują w każdym trybie, także w bypassPermissions. W jakim trybie startuje sesja, wyjaśnia przewodnik po konfiguracji.
Hooki samego gita działają także wtedy, gdy commituje Claude. Jeśli repozytorium ma hook pre-commit, który uruchamia linter i szybkie testy, przez tę bramkę przechodzi każdy commit agenta — to najtańsza weryfikacja, jaką masz.
Podziel splątane zmiany na czyste commity
Dział zatytułowany „Podziel splątane zmiany na czyste commity”Zanim powstanie jakikolwiek commit, poproś o plan. Na etapie planu wyłapiesz poprawkę błędu ukrytą w refaktoryzacji.
Historia jest wiarygodna dzięki krokom 4 i 5. npm test działa na drzewie roboczym, więc bez stasha niezaindeksowane hunki kolejnych grup nadal leżałyby na dysku, a commit działający tylko razem z nimi przeszedłby testy. Gdy wszystko inne jest schowane, każdy commit jest testowany dokładnie w takiej postaci, w jakiej ktoś go później przełączy (checkout), a git rebase --exec uruchamia testy ponownie na każdym commicie gotowej serii, więc git bisect i git revert działają także później. Wynik sprawdzasz, czytając tabelę planu i końcowy git log, a nie diffy.
Przed pierwszym commitem większej zmiany uruchom w sesji /code-review. Sprawdza commity twojej gałęzi, których nie ma jeszcze w upstreamie, oraz niezacommitowane zmiany pod kątem błędów poprawności w subagencie działającym w tle, /code-review --fix od razu nanosi poprawki, a /code-review high 1234 zamiast tego recenzuje pull request 1234. Proponuje też porządki: ponowne użycie istniejącego kodu i uproszczenia; wpisany poziom (high) staje się domyślny dla kolejnych uruchomień /code-review, dopóki nie wpiszesz innego. Poprawki z --fix powstają poza checkpointami, więc cofasz je gitem, a nie przez /rewind. /security-review porównuje gałąź z domyślną gałęzią origin i szuka podatności.
Commity i PR-y jednym poleceniem: plugin commit-commands
Dział zatytułowany „Commity i PR-y jednym poleceniem: plugin commit-commands”Plugin commit-commands od Anthropic pakuje typowe przepływy w trzy polecenia z przestrzenią nazw. Zainstaluj go raz z powłoki:
claude plugin install commit-commands@claude-plugins-official| Polecenie | Co robi |
|---|---|
/commit-commands:commit | Czyta git status, git diff HEAD i ostatnie commity, potem tworzy jeden commit w stylu repozytorium |
/commit-commands:commit-push-pr | Tworzy gałąź, jeśli jesteś na main, robi jeden commit, wypycha go do origin i uruchamia gh pr create |
/commit-commands:clean_gone | Usuwa lokalne gałęzie, których zdalny odpowiednik zniknął, razem z ich worktree |
Polecenia pluginu wpisuj z przestrzenią nazw, tak jak w tabeli. Polecenie commit-push-pr wymaga GitHub CLI (gh) z zalogowanym kontem.
Przed użyciem commit-push-pr poznaj dwa kompromisy. Wszystko trafia do jednego commita, więc splątaną pracę najpierw podziel promptem z poprzedniej sekcji. Plik polecenia z góry zatwierdza git push i gh pr create na czas tej tury. Bez reguły ask push odbywa się bez pytania. Z regułą ask z wcześniejszej sekcji Claude nadal zapyta, bo reguły ask mają pierwszeństwo przed takimi zgodami. Tak czy inaczej, testy uruchom przed wpisaniem polecenia. Pamiętaj też, że clean_gone usuwa worktree siłowo (git worktree remove --force) i kasuje gałęzie przez git branch -D: najpierw zacommituj lub wypchnij wszystko, czego potrzebujesz z tych worktree.
Rozwiąż konflikty merge i rebase bez gubienia żadnej strony
Dział zatytułowany „Rozwiąż konflikty merge i rebase bez gubienia żadnej strony”Przy konfliktach wyjaśnienie jest warte więcej niż samo rozwiązanie. Poproś o jedno i drugie.
Typowa odpowiedź brzmi: „Main dodał rate limiting do handlera logowania, a twoja gałąź podzieliła handler na mniejsze funkcje. Zachowaj oba: przenieś sprawdzanie limitu do nowej funkcji validateLogin”. Rozwiązanie weryfikujesz testami dodanymi w main, bo to one zapisują, co autorzy zmian w main chcieli osiągnąć, oraz poleceniem git range-diff:
# Run straight after `git rebase --continue` finishes: old base..old tip vs new base..new tipgit range-diff "$(git merge-base ORIG_HEAD main)..ORIG_HEAD" main..HEADPierwszy zakres to twoja gałąź sprzed rebase (od starej bazy do jej ostatniego commita), drugi to gałąź po rebase (od nowej bazy do jej ostatniego commita), więc commity, które w międzyczasie doszły do main, nie zaśmiecają wyniku. Commit, który podczas rebase zmienił się w nieoczekiwany sposób, od razu rzuca się w oczy, bez czytania całego diffa. Uruchom to polecenie, zanim cokolwiek innego nadpisze ORIG_HEAD; jeśli podczas rozwiązywania konfliktów użyłeś git reset, ORIG_HEAD został nadpisany, więc zamiast niego użyj wpisu z reflogu gałęzi (<gałąź>@{1}).
Otwórz pull request, który recenzent może zweryfikować
Dział zatytułowany „Otwórz pull request, który recenzent może zweryfikowa攄Create a PR” daje ogólnikowy opis. Recenzent, który nie zamierza czytać każdej linii, potrzebuje dowodów: jakie zachowanie się zmieniło, jak to przetestowano i co może się zepsuć.
Gdy Claude tworzy PR przez gh pr create, Claude Code łączy sesję z tym PR-em. Kiedy przyjdą uwagi z review, wrócisz do tego samego kontekstu:
claude --from-pr 1234--from-pr otwiera wybór sesji przefiltrowany do sesji powiązanych z danym PR-em i przyjmuje też adres URL PR-a.
Wszystko na tej stronie załatwia gh. Serwer MCP GitHuba dodaj wtedy, gdy Claude ma czytać wątki review, logi Actions i issues jako ustrukturyzowane wywołania narzędzi, a nie parsować wyjście gh.
Kto zatwierdza zmianę przed merge?
Dział zatytułowany „Kto zatwierdza zmianę przed merge?”Recenzent zatwierdza PR na podstawie sekcji Evidence i Risk, a nie czytania linia po linii, a bramką merge jest CI. Wymuś to po stronie serwera: ustaw te same zadania testów, sprawdzania typów i lintera jako wymagane status checks na main, żeby PR, którego sekcję Evidence napisał agent, nie mógł trafić do main, dopóki CI tego nie powtórzy. Zadanie recenzenta to sprawdzić, czy Evidence opisuje zachowanie, o które prosiło issue, czy Risk podaje sposób wycofania zmiany i czy CI jest zielone. Review, które skaluje się poza jednego recenzenta, opisuje automatyczne code review z Claude Code. Dlaczego warto czytać dowody zamiast diffów, wyjaśnia strona dowody zamiast czytania kodu.
Uruchom równoległe sesje w git worktree
Dział zatytułowany „Uruchom równoległe sesje w git worktree”Dwie sesje edytujące ten sam checkout nadpisują sobie nawzajem pliki. Worktree daje każdej sesji własny katalog i gałąź przy wspólnej historii repozytorium.
-
Uruchom sesję we własnym worktree. W terminalu, w katalogu głównym repozytorium:
Okno terminala claude --worktree notifications # creates .claude/worktrees/notifications/ on branch worktree-notificationsclaude -w # no name: Claude Code generates oneclaude --worktree "#1234" # fetch pull request 1234 into .claude/worktrees/pr-1234 (quote the #)Drugą izolowaną sesję uruchomisz tym samym poleceniem z inną nazwą w drugim terminalu. Najpierw uruchom raz
claudew repozytorium i zaakceptuj okno zaufania do obszaru roboczego (workspace trust); inaczej--worktreekończy się błędem. -
Ukryj worktree przed
git status. Dopisz.claude/worktrees/do.gitignore. -
Skopiuj lokalne pliki potrzebne do startu aplikacji. Worktree to świeży checkout, więc brakuje w nim ignorowanych plików, takich jak
.env. Wypisz je w.worktreeincludew katalogu głównym repozytorium, w składni.gitignore:.env.localconfig/dev-settings.jsonKopiowane są tylko pliki, które pasują do wzorca i są ignorowane przez gita; pliki śledzone nigdy. Każdy skopiowany plik trafia do każdego worktree i może go przeczytać każdy agent, który tam pracuje. Prawdziwe dane uwierzytelniające trzymaj w menedżerze sekretów, a nie w pliku, który rozsyłasz.
-
Wybierz gałąź bazową. Nowe worktree odgałęziają się od domyślnej gałęzi zdalnej (
worktree.baseRef: "fresh"). Ustaw"worktree": { "baseRef": "head" }, gdy worktree ma zawierać twoją niewypchniętą pracę. -
Wyjdź i posprzątaj. Przy wyjściu Claude Code automatycznie usuwa czyste worktree razem z gałęzią, jeśli sesja nie ma nazwy. Najpierw pyta, gdy nadałeś sesji nazwę (
-nlub/rename) albo worktree zawiera zmiany lub nowe commity; jeśli je zachowasz, Claude Code wypisze polecenieclaude --worktree <name> --resume, którym do niego wrócisz. Claude Code nie sprząta worktree z uruchomieńclaude -p: usuń je poleceniemgit worktree remove, a jeśli git zgłosi, że worktree jest zablokowane, najpierw uruchomgit worktree unlock.
Aby pobrać konkretną istniejącą gałąź albo umieścić worktree poza repozytorium, użyj gita bezpośrednio: git worktree add ../myapp-hotfix hotfix/auth-timeout, a potem uruchom claude w tym katalogu. Wiele sesji naraz wymaga też osobnych portów i kolejki review; oba tematy omawiają przewodnik po równoległych agentach i lista kontrolna izolacji worktree.
Wznów właściwą sesję po zmianie gałęzi
Dział zatytułowany „Wznów właściwą sesję po zmianie gałęzi”Sesja należy do katalogu, nie do gałęzi. Po git switch rozmowa trwa dalej, ale Claude czyta już pliki innej gałęzi, a migawka gita z początku sesji jest nieaktualna.
claude -c # most recent conversation in this directoryclaude --resume auth-refactor # a named sessionclaude --continue --fork-session # same history, new session IDWznowienie tej samej sesji w dwóch terminalach bez --fork-session przeplata obie rozmowy w jednym zapisie. --fork-session wybierz, gdy chcesz spróbować dwóch podejść od tego samego punktu, a worktree, gdy oba podejścia nie mogą dotykać tych samych plików.
Znajdź w historii gita moment zmiany zachowania
Dział zatytułowany „Znajdź w historii gita moment zmiany zachowania”Historia to dowód. Bisect prowadzony przez nieprzechodzący test wskazuje commit, który coś zepsuł, i nikt nie musi czytać commitów po drodze.
Przy prostszych pytaniach zapytaj wprost: „When did the session timeout in @src/lib/auth.ts last change? Show the commit and the diff.”
Gdy praca z gitem w Claude Code idzie źle
Dział zatytułowany „Gdy praca z gitem w Claude Code idzie źle”Claude zacommitował pliki, których nie chciałeś. Jeśli commit nie jest wypchnięty, uruchom git reset --soft HEAD~1: commit znika, a zmiany zostają w indeksie (staged). Następnym razem nazwij zakres: „commit only the files in src/api/”, albo sam zrób git add i napisz „commit what is staged, nothing else”.
Rebase albo push poszedł źle. /rewind nie cofa operacji gita: checkpointy nie śledzą zmian wprowadzonych poleceniami Bash, a push dzieje się poza twoim komputerem. Ratunek jest w gicie. git rebase --abort przerywa trwający rebase; git reflog pokazuje każde położenie gałęzi, a git reset --hard <sha> przywraca jedno z nich, gdy sprawdzisz je wcześniej przez git show. Zachowaj reguły deny dla force push i ochronę gałęzi main.
Rozwiązanie konfliktu zgubiło logikę jednej strony. Twoją kontrolą są testy dodane w main; jeśli przechodzą, a logiki nadal brakuje, main nie miał na nią testu. Powiedz Claude’owi dokładnie, czego brakuje („the rate-limit check from main is gone; keep it inside validateLogin”), a potem poproś o test, który to pokrywa, żeby kolejny rebase nie mógł tego zgubić.
Commit ominął hooki albo opis ignoruje wasz format. Claude stosuje się do CLAUDE.md, więc sprawdź, czy jest tam reguła i czy mówi „never use —no-verify”. Opis niewypchniętego commita poprawisz promptem „rewrite the last commit message as a conventional commit with scope” (to jest amend; nigdy nie rób tego po pushu).
Sesja w worktree nie uruchamia aplikacji. Brakuje pliku .env albo pliku generowanego: dopisz go do .worktreeinclude i utwórz nowe worktree. Jeśli pliki binarne są w worktree tylko małymi plikami-wskaźnikami LFS, Git LFS skonfigurowano poleceniem git lfs install --local: Claude Code przy tworzeniu worktree pomija sterowniki filtrów z konfiguracji repozytorium, więc uruchom w nim git lfs pull. Jeśli dwa worktree walczą o port 3000, daj każdemu port przez jego środowisko. git worktree list pokazuje, co istnieje, a po ręcznym usunięciu katalogów uruchom git worktree prune.
claude --from-pr niczego nie znajduje. Claude Code wiąże sesję z PR-em, gdy Claude tworzy ten PR poleceniem gh pr create w tej sesji. PR otwarty przez ciebie nie ma powiązanej sesji: uruchom claude --resume i naciśnij Ctrl+B, żeby zawęzić wybór do sesji z bieżącej gałęzi, albo zacznij od nowa na commicie PR-a poleceniem claude --worktree "#1234".
Claude zrobił push, choć spodziewałeś się pytania. Sesja działała w trybie auto, a ustawienia nie mają reguły ask dla git push, albo polecenie zapisano inaczej niż w regule (git -C . push). Dodaj regułę ask, sprawdź ją poleceniem /permissions, a to, co nigdy nie może trafić do main, zablokuj regułami ochrony gałęzi na serwerze.
Dokąd dalej po kontroli wersji
Dział zatytułowany „Dokąd dalej po kontroli wersji”Używasz innego narzędzia? Te same przepływy w Codex opisują integracja Codex z GitHubem i worktree w Codex; w Cursorze zajrzyj do checkpointów i gałęzi.
Czy ten artykuł Ci pomógł?
Jedno kliknięcie, bez logowania.
Co z tym zrobisz?
Jak się czytało?
Co przeszkadzało? Możesz zaznaczyć kilka
Twoja rola?
Dzięki. Czytam każdą odpowiedź. Michał Jaskólski
Pomógł Ci ten artykuł?
Każde to jedno kliknięcie. Zamknij, kiedy chcesz.
bez logowania