Skip to content

ff branch

List local branches and remote-only branches. Give a name to create a branch without switching to it; with no revision, the new branch starts at trunk's tip. ff br and ff bookmark are aliases.

Usage

Usage: ff branch [OPTIONS] [name] [rev]

Examples

ff branch                       # List branches
ff branch --all                 # Include every remote-only branch
ff branch spike                 # Create at trunk without switching
ff branch spike HEAD~2          # Create at a revision
ff branch spike @               # Copy open work to the new branch
ff branch -d old-experiment      # Delete a local branch
ff branch --prune -n            # Preview pruning; still may fetch
ff describe -b unicode-cleanup  # Rename the current branch

Options

Arguments:
  [name]
          Create a branch by this name, and stay where you are

  [rev]
          Where it forks from: a revision, `@`, or a branch; trunk when omitted

Options:
  -d, --delete <branch>
          Delete a local branch; retained history allows `ff undo`

      --shared
          Also delete its remote copy, which `ff undo` cannot restore

      --prune
          Delete eligible branches whose remote copies are gone

      --json
          Emit machine-readable JSON

  -n, --dry-run
          Preview branch pruning without deleting branches; fetching can still run

      --all
          Every remote-only branch, not just the newest few

      --fetch
          Fetch now on commands that support fetching, regardless of cadence

      --at-op <op>
          Read as of this operation (a hex id or prefix, `@`, `@^`, `@~3`)

      --no-fetch
          Skip the fetch: read the tracking refs as they stand

      --at <time>
          Read as of the operation current at this time (30m/2h/3d, or a date)

      --session <name>
          Session name for this invocation

  -C, --cwd <dir>
          Run as if fufu had been started in <dir>

  -h, --help
          Print help (see a summary with '-h')

Listing and creating

The list groups chosen names before automatically generated names. Rows show tips, subjects, parked work, pending descriptions, and remote relationships. Remote-only rows represent tracking refs with no local branch tracking them; ff switch origin/<branch> creates and checks out a local tracking branch. --all removes the remote-only list limit. --at and --at-op are declared but currently refused for listing.

An explicit revision creates the branch there. A branch target also records that branch as the new base. @ means the open change: create below it and park a copy on the new branch, without changing current files. ff start creates and switches in one command. ff describe -b renames the current branch.

Deleting and recovery

-d <name> deletes a local branch and saves its timeline pointer in trash. Its tip and parked work remain pinned by retained operations; ff undo restores the branch and timeline. Deletion does not require a merged check and creates no Git stash.

A plain delete leaves the remote copy, tracking ref, and upstream in place. Add --shared to delete them too. A seen/tracking mismatch refuses before local deletion. The remote send then checks the seen value as its lease; a remote race or rejection can leave the local branch deleted while the remote copy survives. Inspect the error and use ff undo to recover the local deletion. Undo cannot recreate a successfully deleted remote copy.

Pruning deleted remote copies

--prune fetches, then deletes eligible local branches whose remote copies are gone. All three conditions are required: an upstream is configured, its tracking ref is absent, and fufu recorded a previous seen or pushed copy. A never-published branch does not qualify.

Branches with commits the copy never held are kept and reported, as are the current branch, branches checked out elsewhere, and held branches. Use explicit -d when you intend to delete a particular branch. Dependents of a pruned branch are assigned its former base. One undo restores the local prune, timelines, base links, and tracking sections.

--dry-run previews local deletion; fetch and maintenance can still run. --no-fetch uses existing tracking refs. fufu.pruneGone enables the same pruning within ff pull.