Blog JSystems - uwalniamy wiedzę!

Szukaj

Claude Code

Claude Code chce pushnąć na main - jak wymusić pracę na branchu

W skrócie

  • Claude Code commituje i wypycha zmiany prosto na gałąź główną (main albo master), a Ty chcesz, żeby zawsze pracował na osobnym branchu.
  • W trybie domyślnym Claude Code może pushować na dowolną gałąź repozytorium, w którym pracujesz - łącznie z domyślną - więc bez wyraźnej instrukcji nie zakłada, że wolisz feature branch.
  • Rozwiązanie: napisz regułę w pliku CLAUDE.md oraz dołóż twardą bramkę w settings.json (permissions.ask albo permissions.deny na git push), a przed pracą sam utwórz i przełącz się na branch.

Claude Code, oficjalne narzędzie CLI od Anthropic do programowania z AI, potrafi samodzielnie prowadzić operacje git - dodawać pliki, tworzyć commity i wypychać je na zdalne repozytorium. To wygodne, dopóki nie zorientujesz się, że zmiany wylądowały prosto na main, zamiast na gałęzi roboczej, którą chciałeś dopiero przejrzeć w pull requeście. Poniżej pokazujemy, dlaczego tak się dzieje i jak ustawić stały workflow oparty na branchach.

Jak to wygląda w praktyce

Prosisz o wprowadzenie zmiany, a na koniec w podsumowaniu widzisz coś w stylu:

Utworzyłem commit i wypchnąłem zmiany.
  branch: main
  commit: fix: popraw walidację formularza
  push: origin/main (up to date)

Zaglądasz do repozytorium i okazuje się, że nowy commit siedzi już na gałęzi głównej. Nie ma osobnego brancha, nie ma pull requesta, nie ma miejsca na review. Jeśli zespół pracuje w modelu pull requestów, taki bezpośredni push na main potrafi ominąć cały proces akceptacji.

Dlaczego Claude Code tak działa

To nie jest błąd - to domyślna polityka uprawnień. W nowszych wersjach Claude Code klasyfikator uprawnień pozwala domyślnie na push na dowolną gałąź repozytorium, w którym wystartowała sesja, łącznie z gałęzią domyślną. Wyjątkiem są operacje wyraźnie ryzykowne, na przykład force push albo wypchnięcie sekretów - te są blokowane. Zwykły commit i push na main nie są traktowane jako ryzykowne, więc Claude Code je wykonuje.

Jest jednak druga, kluczowa zasada: Twoje instrukcje dotyczące gita mają pierwszeństwo. Jeśli w zadaniu, w pliku CLAUDE.md albo w pamięci projektu napiszesz, że commitowaniem i pushowaniem zajmujesz się sam albo że praca ma iść na osobny branch, Claude Code się do tego zastosuje i zostawi git Tobie. Domyślne zachowanie obowiązuje tylko wtedy, gdy nie powiedziałeś inaczej.

Jak to rozwiązać krok po kroku

  1. Zapisz regułę w pamięci projektu. W pliku CLAUDE.md w katalogu repozytorium dopisz jednoznaczne zdanie, na przykład: Nigdy nie commituj i nie pushuj na main. Zawsze twórz osobny branch i otwieraj pull request. Push tylko na moje wyraźne polecenie. Claude Code czyta ten plik na starcie każdej sesji.
  2. Dołóż twardą bramkę w settings.json. Sama instrukcja tekstowa to prośba, a reguła uprawnień to zapora. W .claude/settings.json dodaj wpis "permissions": { "ask": ["Bash(git push *)"] }, żeby każdy push wymagał Twojego potwierdzenia. Jeśli push ma być całkiem zablokowany, użyj sekcji "deny" zamiast "ask".
  3. Zablokuj też bezpośredni commit na gałęzi głównej, jeśli chcesz pełnej ochrony. Regułę ask możesz zawęzić do konkretnych komend gita, na przykład Bash(git commit *), aby Claude Code pytał, zanim cokolwiek zatwierdzi.
  4. Poproś o utworzenie brancha na początku pracy. Zanim zlecisz zmianę, napisz wprost: Najpierw utwórz i przełącz się na branch feature/nazwa-zadania, dopiero potem wprowadzaj zmiany. Możesz to też wpisać na stałe do CLAUDE.md.
  5. Włącz ochronę gałęzi po stronie repozytorium zdalnego. Reguła w Claude Code chroni Twoją maszynę, ale prawdziwą zaporą jest branch protection na GitHub albo GitLab - ustaw, że do main wchodzi się wyłącznie przez pull request. Ta ochrona działa niezależnie od Claude Code.
  6. Rozważ pracę na worktree. Jeśli chcesz, aby zmiany fizycznie nie dotykały głównego katalogu roboczego, Claude Code potrafi izolować sesję w osobnym drzewie roboczym gita (worktree). Wtedy commity powstają na własnej gałęzi, a scalanie robisz świadomie.

Jak sprawdzić, że zadziałało

Uruchom nowe zadanie testowe (na przykład drobną zmianę w README) i obserwuj podsumowanie. Jeśli Claude Code zapyta o zgodę przed pushem albo zgłosi, że zostawia commitowanie Tobie, reguły działają. Sprawdź też polecenie git log --oneline -5 oraz git branch --show-current - nowy commit powinien być na gałęzi feature, a nie na main. Na koniec potwierdź, że zdalne main nie dostało nowych commitów bez pull requesta.

Wróć do listy: 100 najczęstszych problemów z Claude Code

Szkolenie Claude Code - od zera do zespołu agentów AI, prowadzi Łukasz Matuszewski (JSystems)

Szkolenie Claude Code - od zera do zespołu agentów AI -->

Szkolenie Claude Code - od zera do zespołu agentów AI

Tryb planowania, tryby uprawnień, komendy, MCP, hooki i systemy multi-agent - wszystko na żywym kodzie podczas trzydniowego szkolenia. Prowadzi Łukasz Matuszewski. Szkolenie ma terminy gwarantowane - odbędzie się niezależnie od liczby zgłoszeń.

Sprawdź szkolenie Claude Code

To szkolenie może być dofinansowane dla Ciebie z KFS lub BUR.

★★★★★Średnia ocena naszych szkoleń w Google: 5/5

Najczęściej zadawane pytania

Dlaczego Claude Code w ogóle pushuje na main bez pytania?
W trybie domyślnym klasyfikator uprawnień Claude Code zezwala na push na dowolną gałąź repozytorium, w którym wystartowała sesja, łącznie z gałęzią domyślną. Zwykły push nie jest uznawany za operację ryzykowną, więc nie wymaga potwierdzenia. Force push i wypychanie sekretów są natomiast blokowane.
Czy wystarczy sam wpis w CLAUDE.md, żeby Claude nie ruszał main?
Wpis w CLAUDE.md ma pierwszeństwo nad domyślnym zachowaniem gita i w większości przypadków wystarcza, bo Claude Code czyta ten plik na starcie sesji. Dla pewności warto jednak dołożyć twardą regułę permissions.ask albo permissions.deny w settings.json, która wymusza potwierdzenie niezależnie od interpretacji tekstu.
Jak zmusić Claude Code, żeby zawsze pracował na osobnym branchu?
Napisz w CLAUDE.md, że praca ma iść na feature branch i że push wymaga Twojej zgody, a na początku zadania poproś o utworzenie i przełączenie się na nowy branch. Dodatkowo włącz ochronę gałęzi w repozytorium zdalnym, aby do main dało się wejść wyłącznie przez pull request.
Czym różni się permissions.ask od permissions.deny dla git push?
Reguła ask wstrzymuje komendę i prosi Cię o potwierdzenie, więc push jest możliwy, ale tylko za Twoją świadomą zgodą. Reguła deny całkowicie blokuje daną komendę i Claude Code jej nie wykona. Wybór zależy od tego, czy chcesz mieć furtkę do ręcznej akceptacji, czy pełną blokadę.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...