Skip to content
sync-branch logo

sync-branch

>-

SKILL.md

Full skill instructions

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 stop
  • config → interactive setup then stop
  • reset → 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: $0 if provided, else saved default, else main
  • Target: $1 if 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:

  1. List conflicts: git diff --name-only --diff-filter=U
  2. 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
  3. git add each resolved file
  4. git commit --no-edit

7. Push

Unless --no-push or preference says no:

git push origin {target}

8. Restore state

  1. Checkout original branch (if different from target)
  2. 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.