Skip to content

ff evolog

Show the recorded evolution of one change, newest first. With no revision, show snapshots of the open change @. For a recorded commit, show operations that produced versions of the same change. ff ev is the short spelling.

Usage

Usage: ff evolog [OPTIONS] [rev]

Examples

ff evolog                       # Open change's snapshots
ff evolog HEAD~2                # An earlier change's evolution
ff evolog -n 0                  # All matching rows
ff evolog -p                    # Include each capture's patch

Options

Arguments:
  [rev]
          Change ID, commit SHA, or revision to inspect; `@` when omitted

Options:
  -n, --max-count <COUNT>
          Number of rows to show; 0 means unlimited

          [default: 25]

  -p, --patch
          Include patches for capture rows; operation rows have no patch

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

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

      --json
          Emit machine-readable JSON

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

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

      --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')

Choosing a change

The revision can be a branch, commit SHA, or change ID from ff log. @ is the open change; @^ is HEAD. See Revisions and IDs. --at and --at-op are declared but currently refused here.

This command attempts a snapshot before reading. On a dirty tree, its newest row may be the capture taken by this invocation. Each capture holds a worktree snapshot; use its operation ID with ff restore <path> --at-op <id> to recover files within snapshot coverage and retention limits.

Reading the rows

For a recorded change, operation rows search all worktree chains for versions carrying its change-id: commit, reword, restack, absorb, and pull replay operations. A captures divider introduces the snapshots behind its commit. A commit with no stored change ID gets matching captures from this chain when available.

Rows display hexadecimal operation IDs. Their bold prefixes distinguish retained operations, not changes. -p prints a capture's patch against the preceding capture on its branch; operation rows name the commit produced and have no patch beneath them.

An outside rebase or cherry-pick can drop the change-id header. The rewritten commit then has a derived ID and does not continue the old evolution history. Use ff op log for all recorded operations, or ff history for undo steps.