rebase · git:20260629.99be5fe · 2026-06-29 · sha256 94c23c72ff687dfa

rebase git:20260629.99be5feA

Immutable. This exact content is served forever at /api/v1/blob/94c23c72ff687dfa.

---
name: rebase
description: Use when you need to rebase the current branch onto main, resolve merge conflicts, and force-push
argument-hint: "[BASE_BRANCH]"
---

# Rebase — Rebase, Fix Conflicts, Push

Rebase the current branch onto the base branch (default: `main`), resolve any merge conflicts, and force-push.

## Steps

### 1. Determine Base Branch

- If `$ARGUMENTS` contains a branch name, use it as the base.
- Otherwise, default to `main`.

### 2. Pre-check Working Tree

```bash
git status --porcelain
```

If output is non-empty, the working tree is dirty. Abort and report to the user:

```
Working tree has uncommitted changes. Commit or stash before rebasing:
  <output of git status --porcelain>
```

Do NOT auto-stash — too easy to lose work.

### 3. Fetch Latest

```bash
git fetch origin <BASE_BRANCH>
```

### 4. Rebase

```bash
git rebase origin/<BASE_BRANCH>
```

### 5. Handle Conflicts

If the rebase stops with conflicts:

1. Run `git diff --name-only --diff-filter=U` to list conflicted files
2. For each conflicted file:
   - Read the file to understand the conflict markers
   - Resolve the conflict by understanding both sides (ours = current branch work, theirs = base branch changes)
   - Prefer keeping our changes where they don't conflict with upstream intent
   - If unsure about a conflict, ask the user
3. Stage the resolved files: `git add <resolved-files>`
4. Continue the rebase: `git rebase --continue`
5. If more conflicts appear, repeat steps 1-4
6. Max 10 conflict rounds — if still conflicting, abort and ask the user

### 6. Verify

After successful rebase:
```bash
git log --oneline -5
```

### 7. Push

Check whether the branch has an upstream:

```bash
git rev-parse --abbrev-ref --symbolic-full-name @{upstream} 2>/dev/null
```

- **If the command fails** (no upstream): the branch has never been pushed. Use:
  ```bash
  git push -u origin "$(git rev-parse --abbrev-ref HEAD)"
  ```
- **If the command succeeds**: check ahead/behind state:
  ```bash
  ahead=$(git rev-list --count @{upstream}..HEAD)
  behind=$(git rev-list --count HEAD..@{upstream})
  ```
  - If both `ahead == 0` and `behind == 0`: nothing to push, skip.
  - Otherwise (ahead, behind, or diverged): `git push --force-with-lease`

`--force-with-lease` (not `--force`) fails safely if someone else pushed to the branch.

### 8. Report

```
Rebased onto origin/<BASE_BRANCH>.
  Conflicts resolved: <COUNT> files
  Push: <force-with-lease | initial -u | skipped (already in sync)>
```

If invoked as part of `/ship`, the PR will automatically update.