Claude Code Plugins

Community-maintained marketplace

Feedback
2
0

Safely amend commits (HEAD or non-HEAD) with selective staging and safety checks

Install Skill

1Download skill
2Enable skills in Claude

Open claude.ai/settings/capabilities and find the "Skills" section

3Upload to Claude

Click "Upload skill" and select the downloaded ZIP file

Note: Please verify skill by going through its instructions before using it.

SKILL.md

name git-amend
description Safely amend commits (HEAD or non-HEAD) with selective staging and safety checks
allowed-tools Bash, Read

Git Amend Skill

Purpose: Safely amend git commits (both HEAD and older commits) with proper authorship verification, selective staging, and push status checks.

When to Use:

  • User asks to "amend X file into commit Y"
  • Adding forgotten changes to the last commit (HEAD)
  • Adding changes to an older commit (non-HEAD) via fixup workflow
  • Fixing commit message of the most recent commit
  • Adding pre-commit hook modifications to a commit

Core Principles

1. Selective Staging (CRITICAL)

When user specifies files to amend, stage ONLY those files.

WRONG - Stages unrelated changes:

# User: "Amend foo.md in commit ABC"
git status  # Shows: M foo.md, M bar.md
git add foo.md bar.md  # ← WRONG: Added bar.md too!
git commit --amend --no-edit

CORRECT - Only specified file:

# User: "Amend foo.md in commit ABC"
git status  # Shows: M foo.md, M bar.md
git add foo.md  # ← Only the specified file
git commit --amend --no-edit

Rule: User's request is the scope. Don't assume other modified files should be included unless explicitly requested.

2. Authorship Verification

NEVER amend commits authored by others without explicit permission.

# Check authorship before amending
git log -1 --format='%an <%ae>'

# If author is NOT the current user or Claude:
# - Ask user for permission
# - OR create a new commit instead

3. Push Status Check

Verify commit hasn't been pushed before amending.

# Check if commit is ahead of remote (safe to amend)
git status | grep -E "ahead|behind"

# If pushed: WARN user that amending will require force push

Amend Workflow

Step 1: Verify Target Commit

# Confirm HEAD is the commit to amend
git log -1 --oneline

# Check if target commit is HEAD
git log -1 --format='%H' HEAD
# Compare with target commit hash

If target is NOT HEAD: Use the fixup workflow in "Amending Non-HEAD Commits" section below.

Step 2: Check Safety Conditions

# 1. Check authorship
AUTHOR=$(git log -1 --format='%an %ae')
echo "Commit author: $AUTHOR"

# 2. Check push status
git status | grep -E "Your branch is (ahead|behind)"

# 3. Check for merge commits (don't amend these)
PARENT_COUNT=$(git cat-file -p HEAD | grep -c "^parent")
if [[ $PARENT_COUNT -gt 1 ]]; then
  echo "WARNING: This is a merge commit - consider not amending"
fi

Step 3: Stage ONLY Specified Files

# List what user wants to amend
echo "Files to amend:"
echo "  - file1.md"
echo "  - file2.md"

# Show current status for context
git status --short

# Stage ONLY specified files
git add file1.md file2.md

# Verify staging is correct
git diff --cached --name-only

Step 4: Amend the Commit

# Amend without changing message
git commit --amend --no-edit

# OR amend with new message
git commit --amend -m "New commit message"

# OR amend and open editor for message
git commit --amend

Step 5: Verify Result

# Show the amended commit
git log -1 --stat

# Verify files are as expected
git show --name-only HEAD

Common Scenarios

Scenario 1: Add Forgotten File to Last Commit

# User: "I forgot to add config.json to the last commit"

# 1. Check it's safe to amend
git log -1 --format='%an %ae'  # Verify authorship
git status | grep ahead  # Verify not pushed

# 2. Stage only the forgotten file
git add config.json

# 3. Amend
git commit --amend --no-edit

# 4. Verify
git show --name-only HEAD

Scenario 2: Amend Specific File (User Request)

# User: "Amend shrink-doc.md in commit 55e28bf"

# 1. Verify HEAD is the target commit
git log -1 --oneline
# Output: 55e28bf [config] Redesign shrink-doc...

# 2. Check safety
git log -1 --format='%an %ae'

# 3. Stage ONLY shrink-doc.md (even if other files modified)
git status --short
# M .claude/commands/shrink-doc.md
# M CLAUDE.md  ← Do NOT add this!

git add .claude/commands/shrink-doc.md  # Only specified file

# 4. Amend
git commit --amend --no-edit

Scenario 3: Fix Pre-commit Hook Changes

# Pre-commit hook modified files, need to include in commit

# 1. See what hook changed
git status --short
git diff

# 2. Stage hook-modified files
git add -A  # Usually safe for hook changes

# 3. Amend
git commit --amend --no-edit

Scenario 4: Fix Commit Message Only

# User: "Fix the typo in the last commit message"

# No staging needed - just amend message
git commit --amend -m "Corrected commit message"

Amending Non-HEAD Commits

When the target commit is NOT HEAD, use the fixup + autosquash workflow.

Why This Workflow?

  • Cannot use git rebase -i interactively (requires terminal input)
  • Simple --autosquash alone doesn't work reliably
  • Must use GIT_SEQUENCE_EDITOR to automate the rebase sequence

Step-by-Step Workflow

# 1. Identify the target commit and verify it's not HEAD
TARGET_COMMIT="b5ea793"
git log -1 --format='%H' HEAD  # Compare with target

# 2. Make your changes to the file(s)
# (edit files as needed)

# 3. Create a fixup commit targeting the old commit
git add <specific-files>
git commit --fixup=$TARGET_COMMIT

# 4. Find the parent of target commit (rebase base)
git log --oneline $TARGET_COMMIT~1 -1  # This is the rebase base

# 5. Run autosquash rebase with automated sequence editor
GIT_SEQUENCE_EDITOR="sed -i 's/^pick \([a-f0-9]*\) fixup!/fixup \1 fixup!/'" \
  git rebase -i --autosquash $TARGET_COMMIT~1

# 6. Verify the result
git log --oneline -5
git show <new-commit-hash> --stat

Common Mistakes to Avoid

WRONG - Using wrong rebase base:

# Target is b5ea793, but rebase from HEAD~1
GIT_SEQUENCE_EDITOR=: git rebase --autosquash HEAD~1
# Result: Fixup not applied to correct commit

CORRECT - Rebase from target's parent:

# Target is b5ea793, rebase from b5ea793~1
GIT_SEQUENCE_EDITOR="sed -i 's/^pick \([a-f0-9]*\) fixup!/fixup \1 fixup!/'" \
  git rebase -i --autosquash b5ea793~1

WRONG - Soft reset with multiple commits ahead:

# Multiple commits between target and HEAD
git reset --soft $TARGET_COMMIT~1  # Stages ALL changes from multiple commits!
# Result: Difficult to separate which changes belong to which commit

CORRECT - Use fixup workflow:

# Preserves intermediate commits, only modifies target
git commit --fixup=$TARGET_COMMIT
# Then autosquash rebase

Example: Amend File in Old Commit

# User: "Copy CLAUDE.md from commit 55e28bf to b5ea793"

# 1. Verify b5ea793 is not HEAD
git log -1 --format='%H' HEAD
# Output: 7e1ed90...  (different from b5ea793)

# 2. Restore the file content
git show 55e28bf:CLAUDE.md > CLAUDE.md

# 3. Create fixup commit
git add CLAUDE.md
git commit --fixup=b5ea793

# 4. Autosquash into target (rebase from b5ea793's parent)
GIT_SEQUENCE_EDITOR="sed -i 's/^pick \([a-f0-9]*\) fixup!/fixup \1 fixup!/'" \
  git rebase -i --autosquash b5ea793~1

# 5. Verify
git log --oneline -3
grep -c "expected content" CLAUDE.md

Safety Checks Summary

Check Command Action if Failed
Authorship git log -1 --format='%an' Ask permission or new commit
Not pushed git status | grep ahead Warn about force push
Not merge git cat-file -p HEAD Consider not amending
Correct commit git log -1 --oneline Verify or use rebase

Anti-Patterns

❌ Staging All Modified Files

# User: "Amend foo.md"
git add .  # WRONG: Adds everything
git add -A  # WRONG: Adds everything
git add foo.md bar.md  # WRONG: Added unrequested file

❌ Amending Pushed Commits Without Warning

# Commit already pushed
git commit --amend  # Will require force push!
# MUST warn user first

❌ Amending Others' Commits

# Commit by "Jane Developer"
git commit --amend  # Changes authorship attribution
# Ask permission first

❌ Amending Merge Commits

# Merge commit with multiple parents
git commit --amend  # Can cause issues
# Usually better to create new commit

Quick Reference

# Safe amend workflow
git log -1 --format='%an %ae'          # 1. Check author
git status | grep ahead                 # 2. Check not pushed
git add <specific-files-only>          # 3. Stage selectively
git commit --amend --no-edit           # 4. Amend
git log -1 --stat                      # 5. Verify

Related Skills

  • git-commit: Commit message guidelines
  • git-squash: Combining multiple commits into one
  • git-rebase: Reordering, splitting, or complex history editing