528 lines
11 KiB
Markdown
528 lines
11 KiB
Markdown
---
|
|
allowed-tools: Bash(git:*), Read, Edit
|
|
argument-hint: [--no-delete] [--no-tag]
|
|
description: Complete and merge current Git Flow branch (feature/release/hotfix) with proper cleanup and tagging
|
|
---
|
|
|
|
# Git Flow Finish Branch
|
|
|
|
Complete current Git Flow branch: **$ARGUMENTS**
|
|
|
|
## Current Repository State
|
|
|
|
- Current branch: !`git branch --show-current`
|
|
- Branch type: !`git branch --show-current | grep -oE '^(feature|release|hotfix)' || echo "Not a Git Flow branch"`
|
|
- Git status: !`git status --porcelain`
|
|
- Unpushed commits: !`git log @{u}.. --oneline 2>/dev/null | wc -l | tr -d ' '`
|
|
- Latest tag: !`git describe --tags --abbrev=0 2>/dev/null || echo "No tags"`
|
|
- Test status: !`npm test 2>/dev/null | tail -20 || echo "No test command available"`
|
|
|
|
## Task
|
|
|
|
Complete the current Git Flow branch by merging it to appropriate target branch(es):
|
|
|
|
### 1. Branch Type Detection
|
|
|
|
Detect the current branch type and determine merge strategy:
|
|
|
|
```bash
|
|
CURRENT_BRANCH=$(git branch --show-current)
|
|
|
|
if [[ $CURRENT_BRANCH == feature/* ]]; then
|
|
BRANCH_TYPE="feature"
|
|
MERGE_TO="develop"
|
|
CREATE_TAG="no"
|
|
elif [[ $CURRENT_BRANCH == release/* ]]; then
|
|
BRANCH_TYPE="release"
|
|
MERGE_TO="main develop"
|
|
CREATE_TAG="yes"
|
|
TAG_NAME="${CURRENT_BRANCH#release/}"
|
|
elif [[ $CURRENT_BRANCH == hotfix/* ]]; then
|
|
BRANCH_TYPE="hotfix"
|
|
MERGE_TO="main develop"
|
|
CREATE_TAG="yes"
|
|
# Increment patch version from current tag
|
|
CURRENT_TAG=$(git describe --tags --abbrev=0 origin/main 2>/dev/null)
|
|
TAG_NAME="${CURRENT_TAG%.*}.$((${CURRENT_TAG##*.} + 1))"
|
|
else
|
|
echo "❌ Not on a Git Flow branch (feature/release/hotfix)"
|
|
exit 1
|
|
fi
|
|
```
|
|
|
|
### 2. Pre-Merge Validation
|
|
|
|
Before merging, validate these conditions:
|
|
|
|
**Critical Checks:**
|
|
- ✅ All changes are committed (no uncommitted files)
|
|
- ✅ All commits are pushed to remote
|
|
- ✅ Tests are passing (run test suite)
|
|
- ✅ No merge conflicts with target branch
|
|
- ✅ Branch is up to date with remote
|
|
|
|
```
|
|
🔍 Pre-Merge Validation
|
|
|
|
✓ Working directory clean
|
|
✓ All commits pushed to remote
|
|
✓ Running tests...
|
|
├─ Unit tests: 45/45 passed
|
|
├─ Integration tests: 12/12 passed
|
|
└─ All tests passed ✓
|
|
|
|
✓ Checking for merge conflicts with develop...
|
|
└─ No conflicts detected ✓
|
|
|
|
✓ Branch is up to date with remote ✓
|
|
|
|
Ready to merge!
|
|
```
|
|
|
|
### 3. Feature Branch Finish
|
|
|
|
For **feature/** branches:
|
|
|
|
```bash
|
|
# Ensure all commits are pushed
|
|
git push
|
|
|
|
# Switch to develop
|
|
git checkout develop
|
|
|
|
# Pull latest changes
|
|
git pull origin develop
|
|
|
|
# Merge feature branch (no fast-forward)
|
|
git merge --no-ff feature/$NAME -m "Merge feature/$NAME into develop
|
|
|
|
$(git log develop..feature/$NAME --oneline)
|
|
|
|
🤖 Generated with Claude Code
|
|
Co-Authored-By: Claude <noreply@anthropic.com>"
|
|
|
|
# Push to remote
|
|
git push origin develop
|
|
|
|
# Delete local branch (unless --no-delete)
|
|
git branch -d feature/$NAME
|
|
|
|
# Delete remote branch (unless --no-delete)
|
|
git push origin --delete feature/$NAME
|
|
```
|
|
|
|
**Success Response:**
|
|
```
|
|
✓ Pushed all commits to remote
|
|
✓ Switched to develop
|
|
✓ Pulled latest changes
|
|
✓ Merged feature/$NAME into develop
|
|
✓ Pushed to origin/develop
|
|
✓ Deleted local branch: feature/$NAME
|
|
✓ Deleted remote branch: origin/feature/$NAME
|
|
|
|
🌿 Feature Complete!
|
|
|
|
Merged: feature/$NAME
|
|
Target: develop
|
|
Commits included: 5
|
|
Files changed: 12
|
|
|
|
🎉 Your feature is now in the develop branch!
|
|
|
|
Next steps:
|
|
- Feature will be included in next release
|
|
- Other team members can pull from develop
|
|
- You can start a new feature branch
|
|
```
|
|
|
|
### 4. Release Branch Finish
|
|
|
|
For **release/** branches:
|
|
|
|
```bash
|
|
# Extract version from branch name
|
|
VERSION="${CURRENT_BRANCH#release/}"
|
|
|
|
# Ensure all commits are pushed
|
|
git push
|
|
|
|
# Merge to main first
|
|
git checkout main
|
|
git pull origin main
|
|
git merge --no-ff release/$VERSION -m "Merge release/$VERSION into main
|
|
|
|
Release notes:
|
|
$(cat CHANGELOG.md | sed -n "/## \[$VERSION\]/,/## \[/p" | head -n -1)
|
|
|
|
🤖 Generated with Claude Code
|
|
Co-Authored-By: Claude <noreply@anthropic.com>"
|
|
|
|
# Create tag on main (unless --no-tag)
|
|
git tag -a $VERSION -m "Release $VERSION
|
|
|
|
$(cat CHANGELOG.md | sed -n "/## \[$VERSION\]/,/## \[/p" | head -n -1)"
|
|
|
|
# Push main with tags
|
|
git push origin main --tags
|
|
|
|
# Merge back to develop
|
|
git checkout develop
|
|
git pull origin develop
|
|
git merge --no-ff release/$VERSION -m "Merge release/$VERSION back into develop
|
|
|
|
🤖 Generated with Claude Code
|
|
Co-Authored-By: Claude <noreply@anthropic.com>"
|
|
|
|
# Push develop
|
|
git push origin develop
|
|
|
|
# Delete branches (unless --no-delete)
|
|
git branch -d release/$VERSION
|
|
git push origin --delete release/$VERSION
|
|
```
|
|
|
|
**Success Response:**
|
|
```
|
|
✓ Pushed all commits to remote
|
|
✓ Merged release/$VERSION into main
|
|
✓ Created tag: $VERSION
|
|
✓ Pushed main with tags
|
|
✓ Merged release/$VERSION into develop
|
|
✓ Pushed to origin/develop
|
|
✓ Deleted local branch: release/$VERSION
|
|
✓ Deleted remote branch: origin/release/$VERSION
|
|
|
|
🚀 Release Complete: $VERSION
|
|
|
|
Merged to: main, develop
|
|
Tag created: $VERSION
|
|
Commits included: 15
|
|
Changes:
|
|
- 5 features
|
|
- 3 bug fixes
|
|
- 2 performance improvements
|
|
|
|
🎉 Release $VERSION is now in production!
|
|
|
|
Next steps:
|
|
- Deploy to production: [deployment command]
|
|
- Monitor production for issues
|
|
- Announce release to team
|
|
- Update documentation if needed
|
|
|
|
Tag details:
|
|
git show $VERSION
|
|
```
|
|
|
|
### 5. Hotfix Branch Finish
|
|
|
|
For **hotfix/** branches:
|
|
|
|
```bash
|
|
# Determine new version (patch bump)
|
|
CURRENT_VERSION=$(git describe --tags --abbrev=0 origin/main)
|
|
NEW_VERSION="${CURRENT_VERSION%.*}.$((${CURRENT_VERSION##*.} + 1))"
|
|
|
|
# Ensure all commits are pushed
|
|
git push
|
|
|
|
# Merge to main first
|
|
git checkout main
|
|
git pull origin main
|
|
git merge --no-ff hotfix/$NAME -m "Merge hotfix/$NAME into main
|
|
|
|
Critical fix for: $NAME
|
|
|
|
🤖 Generated with Claude Code
|
|
Co-Authored-By: Claude <noreply@anthropic.com>"
|
|
|
|
# Create tag on main (unless --no-tag)
|
|
git tag -a $NEW_VERSION -m "Hotfix $NEW_VERSION: $NAME
|
|
|
|
Critical production fix"
|
|
|
|
# Push main with tags
|
|
git push origin main --tags
|
|
|
|
# Merge back to develop
|
|
git checkout develop
|
|
git pull origin develop
|
|
git merge --no-ff hotfix/$NAME -m "Merge hotfix/$NAME back into develop
|
|
|
|
🤖 Generated with Claude Code
|
|
Co-Authored-By: Claude <noreply@anthropic.com>"
|
|
|
|
# Push develop
|
|
git push origin develop
|
|
|
|
# Delete branches (unless --no-delete)
|
|
git branch -d hotfix/$NAME
|
|
git push origin --delete hotfix/$NAME
|
|
```
|
|
|
|
**Success Response:**
|
|
```
|
|
✓ Pushed all commits to remote
|
|
✓ Merged hotfix/$NAME into main
|
|
✓ Created tag: $NEW_VERSION (patch bump)
|
|
✓ Pushed main with tags
|
|
✓ Merged hotfix/$NAME into develop
|
|
✓ Pushed to origin/develop
|
|
✓ Deleted local branch: hotfix/$NAME
|
|
✓ Deleted remote branch: origin/hotfix/$NAME
|
|
|
|
🔥 Hotfix Complete: $NEW_VERSION
|
|
|
|
Merged to: main, develop
|
|
Tag created: $NEW_VERSION
|
|
Issue fixed: $NAME
|
|
Previous version: $CURRENT_VERSION
|
|
|
|
⚠️ CRITICAL: Deploy to production immediately!
|
|
|
|
Next steps:
|
|
1. Deploy $NEW_VERSION to production NOW
|
|
2. Monitor production systems closely
|
|
3. Verify fix is working
|
|
4. Notify team of hotfix deployment
|
|
5. Update incident documentation
|
|
|
|
Deployment command:
|
|
[your deployment command here]
|
|
|
|
Monitor:
|
|
- Error rates
|
|
- System metrics
|
|
- User reports
|
|
```
|
|
|
|
### 6. Error Handling
|
|
|
|
**Not on Git Flow Branch:**
|
|
```
|
|
❌ Not on a Git Flow branch
|
|
|
|
Current branch: $CURRENT_BRANCH
|
|
|
|
/finish only works on:
|
|
- feature/* branches
|
|
- release/* branches
|
|
- hotfix/* branches
|
|
|
|
To finish this branch manually:
|
|
1. Switch to target branch
|
|
2. Merge manually: git merge $CURRENT_BRANCH
|
|
3. Push: git push
|
|
```
|
|
|
|
**Uncommitted Changes:**
|
|
```
|
|
❌ Cannot finish: Uncommitted changes detected
|
|
|
|
Modified files:
|
|
M src/file1.js
|
|
M src/file2.js
|
|
|
|
Please commit or stash your changes first:
|
|
1. Commit: git add . && git commit
|
|
2. Stash: git stash
|
|
3. Discard: git checkout .
|
|
```
|
|
|
|
**Unpushed Commits:**
|
|
```
|
|
⚠️ Warning: 3 unpushed commits detected
|
|
|
|
Commits not on remote:
|
|
abc1234 feat: add new feature
|
|
def5678 fix: resolve bug
|
|
ghi9012 docs: update README
|
|
|
|
Would you like to push now? [Y/n]
|
|
✓ Pushing commits...
|
|
✓ All commits pushed to remote
|
|
```
|
|
|
|
**Test Failures:**
|
|
```
|
|
❌ Cannot finish: Tests are failing
|
|
|
|
Failed tests:
|
|
✗ UserService.test.js
|
|
- should authenticate user (expected 200, got 401)
|
|
✗ PaymentController.test.js
|
|
- should process payment (timeout)
|
|
|
|
Fix the failing tests before finishing:
|
|
1. Run tests: npm test
|
|
2. Fix failures
|
|
3. Commit fixes
|
|
4. Try /finish again
|
|
|
|
Skip tests? (NOT RECOMMENDED) [y/N]
|
|
```
|
|
|
|
**Merge Conflicts:**
|
|
```
|
|
❌ Merge conflict detected with develop
|
|
|
|
Conflicting files:
|
|
src/config.js
|
|
package.json
|
|
|
|
Resolution steps:
|
|
1. Fetch latest develop: git fetch origin develop
|
|
2. Try merge locally: git merge origin/develop
|
|
3. Resolve conflicts manually
|
|
4. Commit resolution
|
|
5. Try /finish again
|
|
|
|
Would you like to see conflict details? [Y/n]
|
|
```
|
|
|
|
**Missing Tag for Release:**
|
|
```
|
|
⚠️ Release branch missing version in CHANGELOG
|
|
|
|
Expected format in CHANGELOG.md:
|
|
## [v1.2.0] - 2025-10-01
|
|
|
|
Current CHANGELOG:
|
|
[show relevant section]
|
|
|
|
Please update CHANGELOG.md with release version.
|
|
Continue anyway? [y/N]
|
|
```
|
|
|
|
### 7. Arguments
|
|
|
|
**--no-delete**: Keep branch after merging
|
|
```bash
|
|
/finish --no-delete
|
|
|
|
# Merges but keeps local and remote branches
|
|
```
|
|
|
|
**--no-tag**: Skip tag creation (release/hotfix only)
|
|
```bash
|
|
/finish --no-tag
|
|
|
|
# Merges but doesn't create version tag
|
|
```
|
|
|
|
### 8. Interactive Confirmation
|
|
|
|
For destructive operations, ask for confirmation:
|
|
|
|
```
|
|
🔍 Finish Summary
|
|
|
|
Branch: release/v1.2.0
|
|
Type: Release
|
|
Will merge to: main, develop
|
|
Will create tag: v1.2.0
|
|
Will delete: Local and remote branches
|
|
|
|
Actions to perform:
|
|
1. Merge to main
|
|
2. Create tag v1.2.0 on main
|
|
3. Push main with tags
|
|
4. Merge to develop
|
|
5. Push develop
|
|
6. Delete release/v1.2.0 (local)
|
|
7. Delete origin/release/v1.2.0 (remote)
|
|
|
|
Proceed with finish? [Y/n]
|
|
```
|
|
|
|
### 9. Post-Finish Checklist
|
|
|
|
**For Features:**
|
|
```
|
|
✅ Feature Finished Checklist
|
|
|
|
- [x] Merged to develop
|
|
- [x] Remote branch deleted
|
|
- [x] Local branch deleted
|
|
|
|
What's next:
|
|
- Feature is now in develop
|
|
- Will be included in next release
|
|
- Team can pull from develop
|
|
- You can start new feature
|
|
|
|
Start new feature:
|
|
/feature <name>
|
|
```
|
|
|
|
**For Releases:**
|
|
```
|
|
✅ Release Finished Checklist
|
|
|
|
- [x] Merged to main
|
|
- [x] Merged to develop
|
|
- [x] Tag created: v1.2.0
|
|
- [x] Branches deleted
|
|
|
|
Deployment checklist:
|
|
- [ ] Deploy to production
|
|
- [ ] Verify deployment
|
|
- [ ] Monitor for issues
|
|
- [ ] Announce release
|
|
- [ ] Update documentation
|
|
|
|
Deploy command:
|
|
[your deployment command]
|
|
```
|
|
|
|
**For Hotfixes:**
|
|
```
|
|
✅ Hotfix Finished Checklist
|
|
|
|
- [x] Merged to main
|
|
- [x] Merged to develop
|
|
- [x] Tag created: v1.2.1
|
|
- [x] Branches deleted
|
|
|
|
🚨 IMMEDIATE ACTIONS REQUIRED:
|
|
- [ ] Deploy to production NOW
|
|
- [ ] Monitor production systems
|
|
- [ ] Verify fix is working
|
|
- [ ] Notify team
|
|
- [ ] Update incident documentation
|
|
|
|
This was an emergency hotfix - production deployment is CRITICAL!
|
|
```
|
|
|
|
## Environment Variables
|
|
|
|
- `GIT_FLOW_MAIN_BRANCH`: Main branch (default: "main")
|
|
- `GIT_FLOW_DEVELOP_BRANCH`: Develop branch (default: "develop")
|
|
|
|
## Related Commands
|
|
|
|
- `/feature <name>` - Start new feature branch
|
|
- `/release <version>` - Start new release branch
|
|
- `/hotfix <name>` - Start new hotfix branch
|
|
- `/flow-status` - Check Git Flow status
|
|
|
|
## Best Practices
|
|
|
|
**DO:**
|
|
- ✅ Run tests before finishing
|
|
- ✅ Ensure all commits are pushed
|
|
- ✅ Review changes one last time
|
|
- ✅ Update CHANGELOG for releases
|
|
- ✅ Create tags for releases/hotfixes
|
|
- ✅ Merge to all required branches
|
|
- ✅ Clean up branches after merge
|
|
|
|
**DON'T:**
|
|
- ❌ Finish with failing tests
|
|
- ❌ Skip pushing commits
|
|
- ❌ Forget to merge to develop
|
|
- ❌ Leave branches undeleted
|
|
- ❌ Skip tags for releases
|
|
- ❌ Force push after merge
|