Sync Branch
Merge one branch into another, handling conflicts and preserving work in progress.
Preferences
Read ~/.claude/skills/sync-branch/preferences.md using the Read tool. If not found, no preferences are set.
Context
On startup, use Bash to detect: current git branch, git status, and remote URL (git remote get-url origin). Skip any that fail.
Command routing
Check $ARGUMENTS:
help→ display help then stopconfig→ interactive setup then stopreset→ delete~/.claude/skills/sync-branch/preferences.md, confirm, stop- anything else → sync branches
Flags
Parse from $ARGUMENTS:
--no-push— merge locally, don't push--dry-run— show what would happen without executing- Positional args:
$0= source branch,$1= target branch
Help
Sync Branch — Merge one branch into another
Usage:
/sync-branch Merge default source into current branch
/sync-branch <source> Merge source into current branch
/sync-branch <source> <target> Merge source into target
/sync-branch --no-push <source> Merge without pushing
/sync-branch --dry-run <source> Preview without executing
/sync-branch config Set defaults
/sync-branch reset Clear preferences
/sync-branch help This help
Examples:
/sync-branch main
/sync-branch main all-demos
/sync-branch --dry-run main feature/auth
/sync-branch --no-push develop
How it works:
1. Stashes uncommitted work (if any)
2. Updates source and target branches from remote
3. Merges source into target
4. Resolves conflicts (preserving both sides)
5. Pushes target (unless --no-push)
6. Restores original branch and stash
Current preferences:
(shown above under Preferences)
Config
Use AskUserQuestion:
Q1 — "Default source branch?" (main (default), develop, custom) Q2 — "Auto-push after merge?" (Yes (default), No) Q3 — "Conflict resolution style?" (preserve-both (default) — keep changes from both sides, ask-each — show each conflict and ask, prefer-source — favor source branch, prefer-target — favor target branch)
Save to ~/.claude/skills/sync-branch/preferences.md.
First-time detection
If no preferences file exists, show:
"First time using /sync-branch? Run /sync-branch config to set defaults, or continue — I'll merge main into your current branch."
Then proceed.
Steps
1. Resolve branches
- Source:
$0if provided, else saved default, elsemain - Target:
$1if provided, else current branch - Direction: Always source → target
If source == target, error and stop.
2. Dry run check
If --dry-run:
git fetch origin
git log {target}..origin/{source} --oneline
Show what commits would be merged, then stop.
3. Stash uncommitted work
If working tree is dirty:
git stash --include-untracked
Record that a stash was created.
Record which branch the user was on originally.
4. Update source
git checkout {source}
git pull origin {source}
If pull fails → restore state, report error, stop.
5. Update and merge into target
git checkout {target}
git pull origin {target}
git merge {source} --no-edit
6. Handle conflicts
If merge reports conflicts:
- List conflicts:
git diff --name-only --diff-filter=U - Based on conflict resolution preference:
- preserve-both: Read each file, resolve keeping both sides
- ask-each: Show conflict to user via
AskUserQuestion, let them decide - prefer-source/target: Auto-resolve favoring chosen side
git addeach resolved filegit commit --no-edit
7. Push
Unless --no-push or preference says no:
git push origin {target}
8. Restore state
- Checkout original branch (if different from target)
- If stash was created:
git stash pop
9. Report
Synced {source} → {target}
{source}: {short sha} {subject}
{target}: {short sha} {subject}
Conflicts: {count} ({file list} or "none")
Pushed: {yes/no}
10. Learn
If user changes source branch, save preference. If user changes conflict style, save preference.