374 lines
8.6 KiB
Markdown
374 lines
8.6 KiB
Markdown
# Operation: Safe Commit Amend Guidance
|
|
|
|
Guide users through safely amending commits with comprehensive safety checks.
|
|
|
|
## Parameters from $ARGUMENTS
|
|
|
|
- **force** (optional): Skip safety checks (default: false) - USE WITH EXTREME CAUTION
|
|
|
|
Parse as: `amend-guidance force:true` or `amend-guidance`
|
|
|
|
## Amend Safety Workflow
|
|
|
|
### Step 1: Run Amend Safety Check
|
|
|
|
Execute safety validation script:
|
|
|
|
```bash
|
|
./.claude/commands/commit-best-practices/.scripts/amend-safety.sh
|
|
```
|
|
|
|
The script checks:
|
|
1. Commit not pushed to remote
|
|
2. Same author (current user matches commit author)
|
|
3. Not on protected branch (main/master)
|
|
4. No collaborators have pulled it
|
|
|
|
Returns:
|
|
```json
|
|
{
|
|
"safe": true|false,
|
|
"checks": {
|
|
"not_pushed": {"status": "pass|fail", "message": "..."},
|
|
"same_author": {"status": "pass|fail", "message": "..."},
|
|
"safe_branch": {"status": "pass|warn", "message": "..."},
|
|
"collaborators": {"status": "pass|warn", "message": "..."}
|
|
},
|
|
"recommendation": "safe|warning|unsafe"
|
|
}
|
|
```
|
|
|
|
### Step 2: Evaluate Safety Status
|
|
|
|
**SAFE (All checks pass):**
|
|
```
|
|
✅ SAFE TO AMEND
|
|
|
|
Last commit: abc123
|
|
Author: John Doe <john@example.com> (you)
|
|
Branch: feature/oauth-implementation
|
|
Status: Not pushed to remote
|
|
|
|
All safety checks passed:
|
|
✅ Commit not pushed to remote
|
|
✅ You are the author
|
|
✅ Not on main/master branch
|
|
✅ No collaborators have this commit
|
|
|
|
It is SAFE to amend this commit.
|
|
```
|
|
|
|
**WARNING (Minor concerns):**
|
|
```
|
|
⚠️ AMEND WITH CAUTION
|
|
|
|
Last commit: abc123
|
|
Author: John Doe <john@example.com> (you)
|
|
Branch: main
|
|
Status: Not pushed to remote
|
|
|
|
Safety checks:
|
|
✅ Commit not pushed to remote
|
|
✅ You are the author
|
|
⚠️ WARNING: On main/master branch
|
|
✅ No collaborators have this commit
|
|
|
|
Amending on main/master is discouraged but technically safe if not pushed.
|
|
|
|
Recommendation: Create new commit instead of amending.
|
|
```
|
|
|
|
**UNSAFE (Critical issues):**
|
|
```
|
|
❌ UNSAFE TO AMEND
|
|
|
|
Last commit: abc123
|
|
Author: Jane Smith <jane@example.com> (NOT you)
|
|
Branch: feature/oauth
|
|
Status: Pushed to origin/feature/oauth
|
|
|
|
Safety violations:
|
|
❌ CRITICAL: Commit already pushed to remote
|
|
❌ CRITICAL: Different author (Jane Smith, not you)
|
|
✅ Safe branch (not main/master)
|
|
⚠️ WARNING: Other developers may have pulled this
|
|
|
|
DO NOT AMEND THIS COMMIT!
|
|
|
|
Amending will:
|
|
1. Rewrite git history
|
|
2. Break other developers' work
|
|
3. Require force push (dangerous)
|
|
4. Cause merge conflicts for collaborators
|
|
|
|
Use: git revert (to undo changes safely)
|
|
Or: Create new commit (to add fixes)
|
|
```
|
|
|
|
### Step 3: Provide Amend Instructions
|
|
|
|
**If SAFE, show how to amend:**
|
|
|
|
```
|
|
How to Amend Commit
|
|
===================
|
|
|
|
Current commit message:
|
|
---
|
|
feat(auth): add OAuth authentication
|
|
|
|
Implement OAuth2 flow for Google and GitHub
|
|
---
|
|
|
|
Option 1: Amend with staged changes
|
|
-------------------------------------
|
|
1. Make your changes to files
|
|
2. Stage changes: git add <files>
|
|
3. Amend commit: git commit --amend
|
|
|
|
This opens editor to modify message if needed.
|
|
|
|
Option 2: Amend message only
|
|
-----------------------------
|
|
git commit --amend
|
|
|
|
Opens editor to change commit message.
|
|
No file changes included.
|
|
|
|
Option 3: Amend with new message (no editor)
|
|
---------------------------------------------
|
|
git commit --amend -m "new message here"
|
|
|
|
Direct message change without editor.
|
|
|
|
After amending:
|
|
---------------
|
|
Review commit: /commit-best-practices review-commit
|
|
Verify changes: git show HEAD
|
|
Continue work or push: git push origin <branch>
|
|
|
|
Note: If you already pushed, you'll need: git push --force-with-lease
|
|
(Only if you're certain no one else has pulled your changes!)
|
|
```
|
|
|
|
**If UNSAFE, show alternatives:**
|
|
|
|
```
|
|
Safe Alternatives to Amending
|
|
==============================
|
|
|
|
Since amending is unsafe, use these alternatives:
|
|
|
|
Option 1: Create New Commit (Recommended)
|
|
------------------------------------------
|
|
Make your changes and commit normally:
|
|
|
|
1. Make changes to files
|
|
2. Stage: git add <files>
|
|
3. Commit: git commit -m "fix: address review feedback"
|
|
|
|
This preserves history and is safe for collaborators.
|
|
|
|
Option 2: Revert Previous Commit
|
|
---------------------------------
|
|
If the commit is wrong, revert it:
|
|
|
|
1. Revert: git revert HEAD
|
|
2. Make correct changes
|
|
3. Commit: git commit -m "correct implementation"
|
|
|
|
This creates two new commits (revert + fix).
|
|
|
|
Option 3: Interactive Rebase (Advanced)
|
|
----------------------------------------
|
|
Only if you're experienced and coordinate with team:
|
|
|
|
1. git rebase -i HEAD~2
|
|
2. Mark commit as 'edit'
|
|
3. Make changes
|
|
4. git rebase --continue
|
|
|
|
⚠️ WARNING: Requires force push, coordinate with team!
|
|
|
|
Best Practice:
|
|
--------------
|
|
When in doubt, create a new commit. It's always safer.
|
|
```
|
|
|
|
### Step 4: Force Mode Handling
|
|
|
|
If user specified `force:true`:
|
|
|
|
```
|
|
⚠️ FORCE MODE ENABLED
|
|
|
|
You've bypassed safety checks. This is DANGEROUS!
|
|
|
|
Proceeding with amend despite warnings.
|
|
|
|
Current commit: abc123
|
|
Branch: main
|
|
Status: Pushed to remote
|
|
|
|
You are responsible for:
|
|
1. Coordinating with team before force push
|
|
2. Ensuring no one has pulled this commit
|
|
3. Handling any conflicts that arise
|
|
4. Notifying team of force push
|
|
|
|
Force push command (if you must):
|
|
git push --force-with-lease origin <branch>
|
|
|
|
Better alternatives:
|
|
- Create new commit instead
|
|
- Use git revert for pushed commits
|
|
- Coordinate with team before rewriting history
|
|
|
|
Proceed with extreme caution!
|
|
```
|
|
|
|
## Safety Rules Summary
|
|
|
|
### ✅ SAFE to amend if ALL true:
|
|
|
|
1. **Not pushed to remote**
|
|
- `git log @{upstream}..HEAD` shows commit
|
|
- Commit only exists locally
|
|
|
|
2. **Same author**
|
|
- `git config user.email` matches commit author
|
|
- You made the commit
|
|
|
|
3. **Not on protected branch**
|
|
- Not on main/master
|
|
- Or: on feature branch
|
|
|
|
4. **No collaborators affected**
|
|
- Solo work on branch
|
|
- Or: coordinated with team
|
|
|
|
### ❌ NEVER amend if ANY true:
|
|
|
|
1. **Already pushed to remote**
|
|
- Commit exists on origin
|
|
- Others may have pulled it
|
|
|
|
2. **Different author**
|
|
- Someone else made the commit
|
|
- Not your work to modify
|
|
|
|
3. **Collaborators working on same branch**
|
|
- Team has pulled your commit
|
|
- Would break their work
|
|
|
|
4. **On shared/protected branch**
|
|
- main/master branch
|
|
- Production/release branches
|
|
|
|
## When Amend is Useful
|
|
|
|
**Good use cases:**
|
|
- Fix typo in commit message (before push)
|
|
- Add forgotten file to commit (before push)
|
|
- Improve commit message clarity (before push)
|
|
- Reformat message to match conventions (before push)
|
|
|
|
**Bad use cases:**
|
|
- Fixing bug in pushed commit (use new commit)
|
|
- Changing commit after code review started (confusing)
|
|
- Modifying shared branch commits (breaks collaboration)
|
|
- Rewriting public history (dangerous)
|
|
|
|
## Output Format
|
|
|
|
```
|
|
Amend Safety Check
|
|
==================
|
|
|
|
Commit: <sha>
|
|
Author: <name> <email> [you|NOT you]
|
|
Branch: <branch>
|
|
Status: [Local only|Pushed to <remote>]
|
|
|
|
SAFETY CHECKS:
|
|
[✅|⚠️|❌] Commit not pushed
|
|
[✅|⚠️|❌] Same author
|
|
[✅|⚠️|❌] Safe branch
|
|
[✅|⚠️|❌] No collaborators affected
|
|
|
|
VERDICT: [SAFE|WARNING|UNSAFE]
|
|
|
|
[Detailed explanation]
|
|
|
|
[If SAFE: Amend instructions]
|
|
[If UNSAFE: Safe alternatives]
|
|
```
|
|
|
|
## Error Handling
|
|
|
|
**No commits to amend:**
|
|
```
|
|
ERROR: No commits to amend
|
|
This is the first commit (no parent)
|
|
Use: git commit (to create first commit)
|
|
```
|
|
|
|
**Not a git repository:**
|
|
```
|
|
ERROR: Not a git repository
|
|
Run: git init (to initialize)
|
|
```
|
|
|
|
**Script execution error:**
|
|
```
|
|
ERROR: Amend safety check script failed
|
|
Check: .claude/commands/commit-best-practices/.scripts/amend-safety.sh exists
|
|
Verify: Script is executable
|
|
```
|
|
|
|
## Integration with Agent
|
|
|
|
When user says "amend my commit" or "fix my commit":
|
|
1. Agent MUST run safety check FIRST
|
|
2. If unsafe, BLOCK amend and show alternatives
|
|
3. If safe, provide clear amend instructions
|
|
4. Never allow unsafe amend without explicit force flag
|
|
|
|
## Git Commands Reference
|
|
|
|
```bash
|
|
# Check if commit is pushed
|
|
git log @{upstream}..HEAD
|
|
|
|
# Check commit author
|
|
git log -1 --format='%an %ae'
|
|
|
|
# Check current branch
|
|
git branch --show-current
|
|
|
|
# Check remote tracking
|
|
git rev-parse --abbrev-ref --symbolic-full-name @{upstream}
|
|
|
|
# Amend commit (opens editor)
|
|
git commit --amend
|
|
|
|
# Amend with message (no editor)
|
|
git commit --amend -m "new message"
|
|
|
|
# Amend without changing message
|
|
git commit --amend --no-edit
|
|
|
|
# Force push if needed (DANGEROUS)
|
|
git push --force-with-lease origin <branch>
|
|
```
|
|
|
|
## Best Practices
|
|
|
|
1. **Default to safe**: Always check before amending
|
|
2. **Never force without reason**: Force flag is dangerous
|
|
3. **Prefer new commits**: When in doubt, commit new changes
|
|
4. **Communicate**: Tell team before force pushing
|
|
5. **Use revert**: For pushed commits, revert instead of amend
|
|
|
|
Safe git practices prevent broken collaboration and lost work.
|