Git workflow assistant for pull request creation, branch management, and merge coordination. Use when creating PRs, merging branches, resolving conflicts, or cleaning up session branches...
Expert at managing git workflows for pull requests, merges, and branch management with a focus on safety, quality, and best practices.
Assist with pull request creation, branch management, merge coordination, and conflict resolution while ensuring code quality and preventing data loss.
Use this skill when:
Do NOT use this skill for:
Purpose: Create high-quality pull requests with comprehensive descriptions
To create a PR:
Verify we're on a feature branch:
CURRENT_BRANCH=$(git branch --show-current)
if [ "$CURRENT_BRANCH" = "main" ] || [ "$CURRENT_BRANCH" = "master" ]; then
echo "❌ ERROR: Cannot create PR from main/master branch"
exit 1
fi
echo "✓ Current branch: $CURRENT_BRANCH"
Check git status is clean:
if [ -n "$(git status --porcelain)" ]; then
echo "⚠️ WARNING: Uncommitted changes detected"
git status --short
echo ""
echo "Commit these changes before creating PR? (y/n)"
# Ask user via AskUserQuestion tool
else
echo "✓ Working tree clean"
fi
Determine base branch:
# Try to detect default branch
BASE_BRANCH=$(git remote show origin 2>/dev/null | grep 'HEAD branch' | cut -d' ' -f5)
# Fallback to checking what exists
if [ -z "$BASE_BRANCH" ]; then
if git show-ref --verify --quiet refs/heads/main; then
BASE_BRANCH="main"
elif git show-ref --verify --quiet refs/heads/master; then
BASE_BRANCH="master"
else
echo "⚠️ Cannot detect base branch. Please specify manually."
fi
fi
echo "Base branch: $BASE_BRANCH"
Get all commits on this branch:
# Get commit history since branch diverged from base
git log $BASE_BRANCH..HEAD --oneline
# Get detailed commit info
git log $BASE_BRANCH..HEAD --format="%h %s%n%b" --reverse
Get diff summary:
# File changes summary
git diff $BASE_BRANCH...HEAD --stat
# List changed files
git diff $BASE_BRANCH...HEAD --name-only
Generate PR description:
Analyze commits and changes to create:
## Summary
- [Brief bullet points of main changes]
- [Focus on WHY, not WHAT]
- [User-facing impact]
## Changes Made
- [Detailed technical changes]
- [Components affected]
- [API changes if applicable]
## Testing
- [ ] Unit tests added/updated
- [ ] Manual testing completed
- [ ] Edge cases considered
- [ ] Documentation updated
## Related Issues
Closes #[issue-number] (if applicable)
## Notes for Reviewers
[Any context reviewers should know]
[Areas needing special attention]
Check if remote tracking branch exists:
if git rev-parse --verify --quiet origin/$CURRENT_BRANCH >/dev/null 2>&1; then
echo "✓ Remote branch exists"
else
echo "⚠️ Remote branch does not exist. Need to push first."
echo "Push now? (y/n)"
# If yes: git push -u origin $CURRENT_BRANCH
fi
Create PR using GitHub CLI:
gh pr create \
--title "[Generated title from commits]" \
--body "$(cat <<'EOF'
[Generated PR description]
EOF
)" \
--base "$BASE_BRANCH" \
--head "$CURRENT_BRANCH"
Update CLAUDE-activeContext.md (if exists):
if [ -f CLAUDE-activeContext.md ]; then
# Add PR link to active context
PR_URL=$(gh pr view --json url -q .url)
echo "PR created: $PR_URL" >> CLAUDE-activeContext.md
fi
To generate a PR description without creating the PR:
Purpose: Safely merge branches with conflict detection and resolution guidance
To check if branch is ready to merge:
echo "=== MERGE READINESS CHECK ==="
echo ""
# 1. Check current branch
CURRENT_BRANCH=$(git branch --show-current)
BASE_BRANCH=${BASE_BRANCH:-main}
if [ "$CURRENT_BRANCH" = "$BASE_BRANCH" ]; then
echo "❌ ERROR: Already on base branch $BASE_BRANCH"
exit 1
fi
echo "✓ Feature branch: $CURRENT_BRANCH"
echo ""
# 2. Check for uncommitted changes
if [ -n "$(git status --porcelain)" ]; then
echo "❌ Uncommitted changes detected:"
git status --short
echo ""
else
echo "✓ Working tree clean"
echo ""
fi
# 3. Fetch latest from remote
echo "Fetching latest from remote..."
git fetch origin $BASE_BRANCH
echo ""
# 4. Check if base branch has new commits
BEHIND=$(git rev-list --count HEAD..origin/$BASE_BRANCH)
if [ "$BEHIND" -gt 0 ]; then
echo "⚠️ Base branch has $BEHIND new commits"
echo "Consider rebasing: git rebase origin/$BASE_BRANCH"
else
echo "✓ Up to date with base branch"
fi
echo ""
# 5. Check for conflicts
echo "Checking for potential conflicts..."
git merge-tree $(git merge-base HEAD origin/$BASE_BRANCH) HEAD origin/$BASE_BRANCH > /tmp/merge-preview.txt
if grep -q "changed in both" /tmp/merge-preview.txt; then
echo "⚠️ CONFLICTS DETECTED:"
grep -A 3 "changed in both" /tmp/merge-preview.txt
echo ""
else
echo "✓ No conflicts detected"
echo ""
fi
# 6. Run tests (if test command exists)
if [ -f package.json ] && grep -q "\"test\"" package.json; then
echo "Running tests..."
npm test
elif [ -f pytest.ini ] || [ -d tests ]; then
echo "Running tests..."
pytest
elif [ -f Cargo.toml ]; then
echo "Running tests..."
cargo test
else
echo "ℹ️ No test command found (skipped)"
fi
echo ""
# 7. Check CI status (if using GitHub)
if command -v gh &> /dev/null; then
echo "Checking CI status..."
gh pr checks 2>/dev/null || echo "ℹ️ No PR found or CI configured"
fi
echo ""
echo "=== READINESS CHECK COMPLETE ==="
To merge a feature branch:
Run merge readiness check (above)
Ask user for merge strategy:
For regular merge:
git checkout $BASE_BRANCH
git merge --no-ff $FEATURE_BRANCH -m "Merge branch '$FEATURE_BRANCH'"
For squash merge:
git checkout $BASE_BRANCH
git merge --squash $FEATURE_BRANCH
# Generate commit message from all commits
git log $BASE_BRANCH..$FEATURE_BRANCH --format="%s" > /tmp/commit-msg.txt
git commit -m "$(cat <<'EOF'
[Squashed commit title]
Changes included:
$(cat /tmp/commit-msg.txt)
EOF
)"
For rebase and merge:
git checkout $FEATURE_BRANCH
git rebase $BASE_BRANCH
git checkout $BASE_BRANCH
git merge --ff-only $FEATURE_BRANCH
Push to remote:
git push origin $BASE_BRANCH
Clean up feature branch (optional):
# Delete local branch
git branch -d $FEATURE_BRANCH
# Delete remote branch
git push origin --delete $FEATURE_BRANCH
Purpose: Guide through merge conflict resolution
When conflicts occur:
Show conflicted files:
git status | grep "both modified"
For each conflicted file, show conflict markers:
grep -n "<<<<<<< HEAD" $CONFLICTED_FILE
Explain the conflict:
<<<<<<< HEAD = Your current branch changes======= = Separator>>>>>>> branch-name = Incoming branch changesProvide resolution strategies:
git checkout --ours $FILEgit checkout --theirs $FILEAfter resolution:
git add $RESOLVED_FILE
git status # Verify all conflicts resolved
git merge --continue # or git rebase --continue
If merge goes wrong:
# Abort merge
git merge --abort
# Abort rebase
git rebase --abort
# Return to clean state
git status
Purpose: Safely remove old session/feature branches
To identify branches that can be cleaned up:
echo "=== BRANCH CLEANUP ANALYSIS ==="
echo ""
# Get current branch and base branch
CURRENT_BRANCH=$(git branch --show-current)
BASE_BRANCH=${BASE_BRANCH:-main}
# List all local branches
echo "Local branches:"
git branch -vv
echo ""
# List merged branches (safe to delete)
echo "Merged branches (safe to delete):"
git branch --merged $BASE_BRANCH | grep -v "^\*" | grep -v "$BASE_BRANCH"
echo ""
# List unmerged branches (check before deleting)
echo "Unmerged branches (verify before deleting):"
git branch --no-merged $BASE_BRANCH | grep -v "^\*"
echo ""
# Show last commit date for each branch
echo "Branch activity (last commit date):"
for branch in $(git branch | sed 's/^\*/ /'); do
printf "%-30s %s\n" "$branch" "$(git log -1 --format=%cd --date=relative $branch)"
done
To delete merged branches:
# Get list of merged branches (excluding current and base)
MERGED_BRANCHES=$(git branch --merged $BASE_BRANCH | grep -v "^\*" | grep -v "$BASE_BRANCH" | grep -v "main" | grep -v "master")
if [ -z "$MERGED_BRANCHES" ]; then
echo "No merged branches to clean up"
else
echo "The following merged branches will be deleted:"
echo "$MERGED_BRANCHES"
echo ""
echo "Proceed? (requires user confirmation)"
# If confirmed:
echo "$MERGED_BRANCHES" | xargs git branch -d
echo "✓ Local merged branches deleted"
echo ""
echo "Delete remote branches too? (requires user confirmation)"
# If confirmed:
echo "$MERGED_BRANCHES" | xargs -I {} git push origin --delete {}
fi
To clean up old session branches specifically:
# Find session branches (pattern: session/*)
SESSION_BRANCHES=$(git branch | grep "session/" | sed 's/^\*/ /' | xargs)
if [ -z "$SESSION_BRANCHES" ]; then
echo "No session branches found"
else
echo "Session branches:"
for branch in $SESSION_BRANCHES; do
MERGED=$(git branch --merged $BASE_BRANCH | grep -q "$branch" && echo "✓ merged" || echo "✗ unmerged")
LAST_COMMIT=$(git log -1 --format="%cd" --date=relative $branch)
printf "%-40s %-12s %s\n" "$branch" "$MERGED" "$LAST_COMMIT"
done
echo ""
# Ask which to delete
echo "Delete merged session branches? (y/n)"
# If yes, delete only merged ones
fi
Purpose: Help review PRs and provide feedback
To review a PR:
# Get PR number from user or current branch
PR_NUMBER=${1:-$(gh pr view --json number -q .number 2>/dev/null)}
if [ -z "$PR_NUMBER" ]; then
echo "No PR found. Specify PR number or create a PR first."
exit 1
fi
# Get PR details
gh pr view $PR_NUMBER
# Get diff
gh pr diff $PR_NUMBER
# Get file changes summary
gh pr diff $PR_NUMBER --name-only
# Check CI status
gh pr checks $PR_NUMBER
# Get review comments
gh pr view $PR_NUMBER --comments
To suggest reviewers based on changed files:
# Get files changed in PR
CHANGED_FILES=$(gh pr diff $PR_NUMBER --name-only)
# For each file, find who modified it recently (git blame approach)
echo "Suggested reviewers based on file ownership:"
for file in $CHANGED_FILES; do
if [ -f "$file" ]; then
git log --format='%an' -n 5 "$file" | sort | uniq -c | sort -rn | head -1
fi
done | sort | uniq
Purpose: Recover from git mistakes
To undo the last commit while keeping changes:
# Soft reset (keep changes staged)
git reset --soft HEAD~1
# Mixed reset (keep changes unstaged)
git reset HEAD~1
# Verify
git status
To recover a recently deleted branch:
# Find the commit SHA of the deleted branch
git reflog | grep "$BRANCH_NAME"
# Recreate branch from that commit
git branch $BRANCH_NAME $COMMIT_SHA
# Verify
git log $BRANCH_NAME --oneline -n 5
To undo a merge that was pushed:
# Find merge commit
git log --oneline --merges -n 5
# Revert the merge (safe for shared branches)
git revert -m 1 $MERGE_COMMIT_SHA
# Push the revert
git push origin $BASE_BRANCH
User request: "Create a PR for my authentication feature"
Workflow:
feature/add-authgit log main..HEADauth.js, login.js, updated server.jsgh pr create --title "Add JWT authentication" --body "..."User request: "Merge my feature branch but there are conflicts"
Workflow:
config.js and package.jsongit merge feature/update-depsgit add config.js package.jsongit merge --continuegit push origin mainUser request: "Clean up my session branches from last week"
Workflow:
git branch | grep session/session/20241020-add-api, session/20241021-refactor-dbgit branch -d session/20241020-add-apigit branch -D session/20241021-refactor-db (force delete)git push origin --delete session/20241020-add-apiUser request: "I accidentally merged the wrong branch into main!"
Workflow:
git status shows "ahead of origin/main"git reset --hard HEAD~1git log shows merge is gonegit revert -m 1 $SHA instead"feature/, fix/, session/ prefixes--no-ff for feature merges - preserves branch historyThis skill complements CLAUDE.md git safety protocol:
Both work together:
gh CLI for GitHub PR operations# PR Creation
gh pr create --title "..." --body "..." # Create PR
gh pr view # View current PR
gh pr checks # Check CI status
# Merge Operations
git merge --no-ff feature/branch # Merge preserving history
git merge --squash feature/branch # Squash all commits
git rebase main # Rebase onto main
# Branch Management
git branch --merged main # List merged branches
git branch -d branch-name # Delete local branch
git push origin --delete branch-name # Delete remote branch
# Conflict Resolution
git merge --abort # Abort merge
git checkout --ours file.txt # Accept our version
git checkout --theirs file.txt # Accept their version
# Recovery
git reflog # View ref history
git reset --soft HEAD~1 # Undo last commit
git revert -m 1 $SHA # Revert merge