Files
gh-dhofheinz-open-plugins-p…/commands/commit-best-practices/revert-guidance.md
2025-11-29 18:20:25 +08:00

420 lines
9.6 KiB
Markdown

# Operation: Commit Revert Guidance
Guide users through safely reverting commits with proper formatting and workflow.
## Parameters from $ARGUMENTS
- **commit** (required): Commit SHA to revert
Parse as: `revert-guidance commit:abc123`
## Revert Workflow
### Step 1: Validate Commit
Verify commit exists and get details:
```bash
# Check if commit exists
if ! git rev-parse --verify ${commit} >/dev/null 2>&1; then
ERROR: "Commit not found: ${commit}"
exit 1
fi
# Get commit details
commit_sha=$(git rev-parse ${commit})
commit_subject=$(git log -1 --format='%s' ${commit_sha})
commit_author=$(git log -1 --format='%an <%ae>' ${commit_sha})
commit_date=$(git log -1 --format='%ad' ${commit_sha})
```
### Step 2: Run Revert Helper Script
Generate proper revert commit message:
```bash
./.claude/commands/commit-best-practices/.scripts/revert-helper.sh "${commit_sha}"
```
Returns:
```json
{
"commit": "abc123...",
"original_message": "feat(auth): add OAuth authentication",
"revert_message": "revert: feat(auth): add OAuth authentication\n\nThis reverts commit abc123.\n\nReason: OAuth implementation incompatible with current auth system",
"type": "feat",
"scope": "auth",
"files_affected": 5,
"safe_to_revert": true,
"warnings": []
}
```
### Step 3: Analyze Revert Safety
Check if revert will cause issues:
**Safe to revert:**
```
✅ Safe to revert
Commit: abc123
Original: feat(auth): add OAuth authentication
Author: John Doe
Date: 2025-10-10
Analysis:
✅ No dependent commits found
✅ No merge conflicts expected
✅ Files still exist
✅ Clean revert possible
This commit can be safely reverted.
```
**Potential issues:**
```
⚠️ Revert with caution
Commit: abc123
Original: feat(auth): add OAuth authentication
Author: John Doe
Date: 2025-10-10
Warnings:
⚠️ 3 commits depend on this change
- def456: feat(auth): add OAuth providers
- ghi789: fix(auth): OAuth token refresh
- jkl012: docs: OAuth setup guide
⚠️ Potential merge conflicts
- src/auth/oauth.js: modified in later commits
- src/config/auth.js: modified in later commits
Reverting will require:
1. Resolving merge conflicts
2. Possibly reverting dependent commits first
3. Updating or removing affected features
Consider: Revert dependent commits in reverse order.
```
### Step 4: Generate Revert Message
Follow proper revert commit message format:
```
Conventional Commits Revert Format:
-----------------------------------
revert: <original-type>(<original-scope>): <original-subject>
This reverts commit <sha>.
Reason: <explanation-of-why>
[Optional: Additional context]
[Optional: BREAKING CHANGE if revert breaks functionality]
[Optional: Issue references]
Example:
-----------------------------------
revert: feat(auth): add OAuth authentication
This reverts commit abc123def456789.
Reason: OAuth implementation incompatible with existing SAML
authentication system. Caused authentication failures for
enterprise users.
Need to redesign OAuth to work alongside SAML before
reintroducing.
BREAKING CHANGE: OAuth authentication temporarily removed.
Users must use username/password authentication.
Refs: #456
```
### Step 5: Provide Revert Instructions
**Simple revert (no conflicts):**
```
How to Revert Commit
====================
Commit to revert: abc123
Original message: feat(auth): add OAuth authentication
Generated revert message:
---
revert: feat(auth): add OAuth authentication
This reverts commit abc123.
Reason: [Provide reason here]
---
Option 1: Auto-revert with Git (Recommended)
---------------------------------------------
git revert abc123
This will:
1. Create revert commit automatically
2. Open editor for message (pre-filled)
3. Add reason for revert
4. Save and close
Option 2: Manual revert
-----------------------
1. git revert --no-commit abc123
2. Review changes: git diff --cached
3. Adjust if needed
4. git commit (use message above)
After reverting:
----------------
1. Test that functionality is restored
2. Verify no broken dependencies
3. Push: git push origin <branch>
The revert commit preserves history while undoing changes.
```
**Complex revert (conflicts or dependencies):**
```
Complex Revert Required
=======================
Commit to revert: abc123
Original: feat(auth): add OAuth authentication
Dependencies: 3 commits depend on this
Revert Strategy:
----------------
Step 1: Revert dependent commits FIRST (newest to oldest)
git revert jkl012 # docs: OAuth setup guide
git revert ghi789 # fix(auth): OAuth token refresh
git revert def456 # feat(auth): add OAuth providers
Step 2: Revert original commit
git revert abc123 # feat(auth): add OAuth authentication
Step 3: Handle conflicts
If conflicts occur:
1. git status (see conflicted files)
2. Edit files to resolve conflicts
3. git add <resolved-files>
4. git revert --continue
Step 4: Test thoroughly
- Run full test suite
- Verify auth system works
- Check for broken functionality
Alternative: Revert in single commit
-------------------------------------
If you want one revert commit for all:
1. git revert --no-commit jkl012
2. git revert --no-commit ghi789
3. git revert --no-commit def456
4. git revert --no-commit abc123
5. Resolve any conflicts
6. git commit -m "revert: OAuth authentication feature
This reverts commits abc123, def456, ghi789, jkl012.
Reason: OAuth incompatible with SAML system."
This creates a single revert commit for multiple changes.
```
### Step 6: Post-Revert Checklist
After reverting, verify:
```
Post-Revert Checklist
=====================
□ Revert commit created successfully
git log -1 (verify revert commit exists)
□ Changes actually reverted
git diff <commit>^..<commit> (should be inverse of original)
□ Tests pass
npm test (or your test command)
□ No broken functionality
Test affected features manually
□ Documentation updated
Update docs if feature was documented
□ Team notified
Inform team of revert and reason
□ Issue tracker updated
Comment on related issues
□ Ready to push
git push origin <branch>
```
## Revert vs Reset vs Amend
**Use `git revert` when:**
- ✅ Commit already pushed to remote
- ✅ Working on shared branch
- ✅ Need to preserve history
- ✅ Undoing specific commit in middle of history
**Use `git reset` when:**
- ⚠️ Commit not yet pushed (local only)
- ⚠️ Want to completely remove commit
- ⚠️ Rewriting personal branch history
- ⚠️ No one else has the commit
**Use `git commit --amend` when:**
- ⚠️ Fixing most recent commit only
- ⚠️ Commit not yet pushed
- ⚠️ Small typo or forgotten file
**Decision tree:**
```
Has commit been pushed?
├─ Yes → Use git revert (safe for shared history)
└─ No → Is it the most recent commit?
├─ Yes → Use git commit --amend (if minor fix)
└─ No → Use git reset (if complete removal needed)
```
## Revert Message Examples
**Example 1: Bug found**
```
revert: fix(api): add null check in user endpoint
This reverts commit abc123.
Reason: Fix introduced regression causing authentication
failures for legacy clients. Null check logic incorrect.
Will reimplement with proper validation after adding tests.
Fixes: #789
```
**Example 2: Performance issue**
```
revert: perf(search): implement new search algorithm
This reverts commit def456.
Reason: New algorithm causes 300% increase in database
load under production traffic. Needs optimization before
redeployment.
Keeping old algorithm until performance issues resolved.
```
**Example 3: Breaking change**
```
revert: feat(api): change authentication endpoint format
This reverts commit ghi789.
Reason: Breaking change deployed without proper migration
period. Mobile app version 1.x incompatible with new format.
BREAKING CHANGE: Reverting API format to v1 for backwards
compatibility. Will reintroduce in v2 with migration path.
Refs: #234, #235, #236 (user reports)
```
## Output Format
```
Revert Guidance Report
======================
Commit to Revert: <sha>
Original Message: <message>
Author: <name>
Date: <date>
REVERT SAFETY:
[✅|⚠️] No dependent commits
[✅|⚠️] No merge conflicts expected
[✅|⚠️] Files still exist
GENERATED REVERT MESSAGE:
---
<revert-message-content>
---
REVERT INSTRUCTIONS:
[Step-by-step instructions]
POST-REVERT CHECKLIST:
[Verification steps]
```
## Error Handling
**Commit not found:**
```
ERROR: Commit not found: abc123
Check: git log (to see available commits)
Verify: Commit hash is correct (7+ characters)
```
**Already reverted:**
```
WARNING: This commit may already be reverted
Found revert commit: xyz789
Message: "revert: feat(auth): add OAuth authentication"
If this is a duplicate revert, it may cause issues.
Check: git log (to verify)
```
**Merge commit:**
```
WARNING: This is a merge commit
Merge commits require special handling:
git revert -m 1 abc123
-m 1: Keep changes from first parent
-m 2: Keep changes from second parent
Determine which parent to keep based on your branch strategy.
```
## Integration with Agent
When user says "revert my commit" or "undo commit abc123":
1. Agent identifies commit to revert
2. Runs safety analysis
3. Generates proper revert message
4. Provides step-by-step instructions
5. Offers post-revert verification checklist
## Best Practices
1. **Always provide reason**: Explain WHY reverting in message
2. **Reference original commit**: Include SHA in revert message
3. **Test after revert**: Ensure functionality restored
4. **Notify team**: Communicate reverts to collaborators
5. **Update issues**: Comment on related issue tracker items
6. **Preserve history**: Use revert, not reset, for shared branches
Proper reverts maintain clear history and facilitate collaboration.