Commit local changes safely: sync remote → analyze diff → stage → amend or new commit → push (if asked).
bash
git fetch origin 2>&1
Then check if the remote branch has commits the local branch doesn't:
bash
git status -sb # shows tracking info, e.g. ## main...origin/main [behind 3]
git rev-list HEAD..@{u} --count 2>/dev/null # 0 means in sync
If the remote is ahead (count > 0): sync via rebase:
bash
git pull --rebase origin <current-branch>
Watch the output for conflict markers. If the rebase fails or conflicts are reported:
bash
git rebase --abort
Then stop everything and tell the user:
⚠️ Remote conflict — commit aborted
Remote has new commits that conflict with your local changes. The rebase was aborted automatically to keep your work safe.
To see which files conflict:
bash
git diff --name-only --diff-filter=UTo resolve and continue:
bash
# 1. Re-run the rebase git pull --rebase # 2. Open each conflicted file and fix the markers: # <<<<<<< HEAD ← your local changes # (your code) # ======= # (remote code) # >>>>>>> abc1234 ← remote commit # 3. Stage each resolved file git add <file1> <file2> ... # 4. Continue the rebase git rebase --continue # 5. Repeat steps 2–4 for each conflicted commit, then run /commit againTo abort and restore your original state:
bash
git rebase --abort # already done — your branch is back to where it was
Do not proceed with staging or committing. Wait for the user to resolve.
If the rebase succeeds (no conflicts), continue.
bash
git status --porcelain # list of changed files
git diff --staged # staged diff
git diff # unstaged diff
If nothing is staged and there are unstaged changes, stage everything that looks relevant (avoid committing secrets like .env, *.pem, credentials.*):
bash
git add -A # or specific files — use judgment
If there is truly nothing to commit, tell the user and stop.
Compare the current staged diff against the last commit to decide: new commit or --amend?
bash
git log -1 --format="%H %s" # last commit hash + subject
git show --stat HEAD # files changed in last commit
git show HEAD # full diff of last commit
git log origin/<branch>..HEAD --oneline # commits not yet pushed
Only amend if ALL of the following are true:
git log origin/<branch>..HEAD).Do NOT amend in any of these cases:
SituationWhyLast commit is feat:, this is fix:Different type → different thingLast commit is feat:, this adds teststest: is a separate concernLast commit is feat:, this reformats codestyle: is a separate concernLast commit is feat:, this updates config/CIDifferent typeLast commit has already been pushedRewriting published history is dangerousScope differs (e.g., auth vs user)Different areas
When in doubt, create a new commit. The amend path is the exception, not the rule.
Analyze the staged diff to determine:
TypeUse forfeatNew feature or behaviorfixBug fixdocsDocumentation onlystyleFormatting, whitespace (no logic change)refactorCode restructure (no feature or fix)perfPerformance improvementtestAdd or update testsbuildBuild system, dependenciesciCI/CD, pipeline configurationchoreMaintenance, misc toolingrevertRevert a prior commit
Always append agent and model info in the footer. Use what's available from the environment:
text
Co-authored-by: Claude <noreply@anthropic.com>
AI-model: claude-sonnet-4-6
If the exact model ID is available (from the system context), use it. Otherwise use the family name.
text
<type>[optional scope]: <description>
[optional body — explain WHY, not WHAT]
[breaking change if any]
[issue refs if any]
Co-authored-by: Claude <noreply@anthropic.com>
AI-model: <model-id>
New commit:
bash
git commit -m "$(cat <<'EOF'
<type>[scope]: <description>
<optional body>
Co-authored-by: Claude <noreply@anthropic.com>
AI-model: <model-id>
EOF
)"
Amend last commit (only when criteria in Step 3 are fully met):
bash
git commit --amend -m "$(cat <<'EOF'
<updated message>
Co-authored-by: Claude <noreply@anthropic.com>
AI-model: <model-id>
EOF
)"
If the user explicitly asked to push:
bash
git push origin <current-branch>
Never force-push to main/ master. If a force push is needed, confirm with the user first.
.env, *.pem, credentials.*, *.key--no-verify unless the user explicitly asksgit reset --hard or other destructive commands without explicit user request--amend after hook failure)git rebase --abort and stop — do not proceedtext
feat(auth): add JWT refresh token rotation
Tokens now rotate on each use to limit exposure window.
Refresh tokens are stored hashed in Redis with a 7-day TTL.
Co-authored-by: Claude <noreply@anthropic.com>
AI-model: claude-sonnet-4-6
text
fix(api): handle null response from payment gateway
Gateway returns null instead of an error object on timeout;
guard added to prevent unhandled exception in checkout flow.
Closes #482
Co-authored-by: Claude <noreply@anthropic.com>
AI-model: claude-sonnet-4-6
text
docs: update contributing guide with commit conventions
Co-authored-by: Claude <noreply@anthropic.com>
AI-model: claude-sonnet-4-6