wt list

Show all worktrees with their status. The table includes uncommitted changes, divergence from main and remote, and optional CI status.

The table renders progressively: branch names, paths, and commit hashes appear immediately, then status, divergence, and other columns fill in as background git operations complete. With --full, CI status fetches from the network — the table displays instantly and CI fills in as results arrive.

Examples

List all worktrees:

$ wt list
  Branch       Status         HEAD±    main↕  Path                Remote⇅  Commit    Age   Message
@ feature-api  +         +54   -5   ↑4  ↓1  ./repo.feature-api   ⇡3      28d38c20  30m   Add API tests
^ main             ^                         ./repo               ⇡1  ⇣1  2e6b7a8f  4d    Merge fix-auth:…
+ fix-auth         |                 ↑2  ↓1  ./repo.fix-auth        |     1d697d5b  5h    Add secure token…Showing 3 worktrees, 1 with changes, 2 ahead

Include CI status and conflict detection:

$ wt list --full
  Branch       Status         HEAD±    main↕     main…±  Path                Remote⇅  CI  Commit    Age
@ feature-api  +         +54   -5   ↑4  ↓1  +234  -24  ./repo.feature-api   ⇡3         28d38c20  30m
^ main             ^                                    ./repo               ⇡1  ⇣1     2e6b7a8f  4d
+ fix-auth         |                 ↑2  ↓1   +25  -11  ./repo.fix-auth        |        1d697d5b  5hShowing 3 worktrees, 1 with changes, 2 ahead, 1 column hidden

Include branches that don't have worktrees:

$ wt list --branches --full
  Branch       Status         HEAD±    main↕     main…±  Path                Remote⇅  CI  Commit    Age
@ feature-api  +         +54   -5   ↑4  ↓1  +234  -24  ./repo.feature-api   ⇡3         28d38c20  30m
^ main             ^                                    ./repo               ⇡1  ⇣1     2e6b7a8f  4d
+ fix-auth         |                 ↑2  ↓1   +25  -11  ./repo.fix-auth        |        1d697d5b  5h
  exp               /                ↑2  ↓1  +137                                        32936618  2d
  wip               /                ↑1  ↓1   +33                                        6844b101  3dShowing 3 worktrees, 2 branches, 1 with changes, 4 ahead, 1 column hidden

Output as JSON for scripting:

$ wt list --format=json

Columns

ColumnShows
BranchBranch name
StatusCompact symbols (see below)
HEAD±Uncommitted changes: +added -deleted lines
main↕Commits ahead/behind main
main…±Line diffs in commits ahead of main (--full)
PathWorktree directory
Remote⇅Commits ahead/behind tracking branch
CIPipeline status (--full)
CommitShort hash (8 chars)
AgeTime since last commit
MessageLast commit message (truncated)

The CI column shows GitHub/GitLab pipeline status:

IndicatorMeaning
greenAll checks passed
blueChecks running
redChecks failed
yellowMerge conflicts with base
grayNo checks configured
(blank)No PR/MR found

Any CI dot appears dimmed when there are unpushed local changes (stale status). CI indicators are clickable links to the PR page.

Status symbols

Symbols appear in the Status column in this order:

CategorySymbolMeaning
Working tree+Staged files
!Modified files (unstaged)
?Untracked files
Merge conflicts
Rebase in progress
Merge in progress
Branch stateWould conflict if merged to main (--full only)
Matches main (identical contents)
_No commits ahead, clean working tree
Main divergence^Is the main branch
Ahead of main
Behind main
Diverged from main
Remote divergence|In sync with remote
Ahead of remote
Behind remote
Diverged from remote
Worktree state/Branch without worktree
Path doesn't match template
Prunable (directory missing)
Locked worktree

Rows are dimmed when the branch content is already in main ( matches main or _ no commits ahead).

JSON output

Query structured data with --format=json:

# Worktrees with conflicts
wt list --format=json | jq '.[] | select(.status.branch_state == "Conflicts")'

# Uncommitted changes
wt list --format=json | jq '.[] | select(.status.working_tree.modified)'

# Current worktree
wt list --format=json | jq '.[] | select(.is_current == true)'

# Branches ahead of main
wt list --format=json | jq '.[] | select(.status.main_divergence == "Ahead")'

Status fields:

Position fields:

See also


Command reference

wt list - List worktrees and optionally branches
Usage: wt list [OPTIONS]
       wt list <COMMAND>

Commands:
  statusline  Single-line status for shell prompts

Options:
      --format <FORMAT>
          Output format (table, json)

          [default: table]

      --branches
          Include branches without worktrees

      --remotes
          Include remote branches

      --full
          Show CI, conflicts, diffs

      --progressive
          Show fast info immediately, update with slow info

          Displays local data (branches, paths, status) first, then updates with remote data (CI, upstream) as it arrives. Auto-enabled for TTY.

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

Global Options:
  -C <path>
          Working directory for this command

      --config <path>
          User config file path

  -v, --verbose
          Show commands and debug info