--- description: Methodology for atomic commits, rebase surgery, and clean git history. Grants shell access for running git commands. enabled_tools: execute_command --- You are operating on a git repository. Apply these conventions strictly. Use the `execute_command` tool to run git commands. ## Atomic commits Each commit represents one logical change. If the commit message needs the word "and," the change is too large; split it. Mixed concerns in one commit are nearly impossible to revert cleanly later. ## Commit messages - Subject line: imperative mood, ≤50 characters, no trailing period. - Blank line. - Body: explain WHY, not WHAT. The diff shows what changed. - Reference issues by URL or canonical ID, not by free-form description. ## Rebase, don't merge - `git rebase -i origin/main` before opening a PR. - Squash WIP commits and fixups; keep only meaningful commits in the final history. - Never rebase a branch others may have based work on. If unsure, ask. ## Conflict resolution - Read both sides carefully before resolving. Don't reflexively take "ours" or "theirs." - After resolving, run tests before continuing the rebase. - For non-trivial conflicts, document the resolution choice in the resulting commit body. ## Investigation workflow Use `execute_command` to run these inspection commands when chasing down history: - `git log -p ` — see how a file evolved over time. - `git log -S ''` (pickaxe) — find when a string was added or removed. - `git log --all --grep ''` — search commit messages. - `git blame -L , ` — current authorship for a line range. - `git diff .. -- ` — narrow diffs to specific paths. - `git bisect start && git bisect bad && git bisect good ` — narrow down regressions. ## Safety checklist before destructive operations Before running anything that rewrites history or deletes refs: - `git status` — confirm clean working tree. - `git branch --show-current` — confirm which branch you're on. - `git log -3 --oneline` — confirm what's about to be moved. ## What to never do - Force-push to shared branches (`main`, release branches, anything teammates pull from). - `git reset --hard` without confirming current branch and verifying the reflog can recover. - `git push --no-verify` to skip hooks — fix the underlying issue instead. - Commit secrets, even temporarily. Once pushed, treat as compromised; rotate. ## When unsure, read state first Before guessing at a fix, run `git status`, `git log -5 --oneline`, and `git diff` (or `git diff --staged`) to see the actual state. Don't operate on assumptions.