Changes

The rail on the right of the window holds the selected worktree’s working-tree changes. It has three tabs:

Staging and unstaging

The Changes tab is headed Work in progress · uncommitted and lists Staged · n and Unstaged · n, each with Unstage all or Stage all. Each file carries a one-letter status:

Status Meaning Status Meaning
M Modified C Copied
A Added U Conflicted
D Deleted ? Untracked
R Renamed    

Stage a file with +, unstage with −. A file with changes on both sides is marked partly staged. Clicking a file opens its diff.

The openclaw window with feat/token-miser selected, 4 changes, PR #19. The Changes rail reads Work in progress · uncommitted with Discard all. Staged · 2 lists config.ts and policy.ts; Unstaged · 3 lists policy.test.ts, modified, and two untracked fixtures, bat-read.json and listing.json. Below: Summary, Commit 2 files, Amend, and the commit email, blurred.
Staged and unstaged files, and the identity the commit will be authored with.

Untracked files are grouped by folder, and a folder holding more than ten new files starts collapsed — an untracked build directory would otherwise bury everything else in the list. You can stage, discard, or ignore a whole folder from its row.

Files with image content show a preview. The list refreshes live as files change, including when something outside PwrGit changes them.

Staging a file that still contains conflict markers asks first — Still has conflict markers — with Stage anyway.

On a very large change set the list is capped for rendering, and says so. The section counts, and actions that operate on everything — discard all, in particular — still use the real total rather than what fitted on screen.

Hunks and lines

For a working-tree file, the diff pane stages part of a file. Choose Unstaged or Staged at the top to pick the side, then:

A rail beside each hunk shows how much of it is taken. The bar at the top of the pane then offers Stage n lines (or Unstage n lines on the staged side), and Stage file for the lot. From the keyboard, J and K move between hunks and Enter stages or unstages the focused one. The ? button lists the gestures.

Some files can only move as a whole, and the bar says Whole file only. with the reason:

A file with no trailing newline stages its last hunk as one unit. If the file changes while you are selecting, the ticked lines are cleared rather than applied to content they no longer describe.

The diff pane for extensions/token-miser/src/policy.test.ts on the Unstaged side, index to working tree. The bar reads Stage file, Stage 2 lines and 2 selected. In the first hunk one of two added lines, line 12, is ticked and the rail is dim; the second hunk's only added line, 23, is ticked, its chip checked and its rail solid.
One line of the first hunk, and all of the second. The rail beside each hunk shows how much of it is going.

Commit — and which identity signs it

Type a Summary and press Commit n files, or Command+Enter (Ctrl+Enter on Windows and Linux). The button stays disabled until there is both a message and at least one staged file.

Below the button, the rail reads as email. That is the active profile’s commit email, and it is the address this commit will be authored with.

PwrGit applies that identity per commit. It does not write user.email into the repository, so nothing on disk changes when you switch profiles, and a repository you commit to from two profiles gets the right address each time. See Profiles.

With AI features on for the profile, a Draft link under the message box asks your agent for a message from the staged changes. A draft never overwrites what you typed. See AI → Commit message drafts.

When a hook refuses the commit

If a pre-commit or commit-msg hook fails, the rail says which — hook refused the commit, with its exit code — and that nothing was committed. Your message and staged files are kept.

After a commit that ran hooks, each hook is listed with how long it took; hover one for its path and exit code.

Amend

Amend rewrites the previous commit with the message in the box and whatever is currently staged, rather than adding a new one. It needs a message, not staged files, so it also rewords.

Amending changes the commit’s SHA. If the original was already pushed, the branch will read as diverged from its upstream afterwards — see When the branch has diverged.

Discard, and ignore files

Right-clicking a file offers Stage / Unstage, Ignore… (untracked files and folders), File history, Blame, Copy path, and Discard changes…. File history and Blame open File details.

Discard all is available for the whole worktree. It confirms first, names how many files it will affect, and says plainly that it cannot be undone. Discarded changes do not go to a trash; they are gone.

Ignore rules

Ignore… opens a dialog with two choices and a preview:

Add ignore rule writes it. If an existing rule already covers the path, PwrGit says so instead of adding a redundant line. Ignoring only hides untracked files; files already committed are never affected.

When untracked files are hidden by your personal rules — the clone’s exclude file or your global ignore — the bottom of the list counts them, and Why? shows which rule hid each one.

Stashes

The Stashes tab saves the selected worktree’s changes and lists the repository’s stash stack.

The Stashes tab for feat/token-miser. Name this stash holds token-miser budget defaults, Include untracked files is ticked, and Stash changes sits beside it. Repository stack · 3, shared by every worktree: gateway window experiment, expanded with Apply, Pop, View patch and Drop and its one file; frame budget logging; and profile sampler at 250ms.
One stash stack per repository, reachable from every worktree.

Merges, rebases and conflicts

When a Merge, Rebase, Cherry-pick, Revert or Apply patches is in progress in the worktree — started by PwrGit or from a terminal — a banner at the top of the rail names it, its step (step 2 of 5), and how many files are still conflicted.

If the index has unmerged entries with no operation in progress — after a conflicted stash apply, say — the banner reads Unmerged index and says to resolve and stage each path.

Squash and reorder commits

Select commits in the graph with the checkbox beside each row and a selection bar appears with Squash, Reorder, and — with AI features on — Tidy…. Each opens the Rebase tool in the rail.

The selection must be the most recent commits on the branch, in one unbroken run, at least two of them, and the worktree must be clean — commit or stash first.

Then every plan takes the same path:

  1. Plan. The exact step list, in the order it will execute.
  2. Check in isolated copy. The plan is replayed in a scratch copy of the repository, never your worktree, and fills a proof ledger: n commits, each used once; Code unchanged at the tip — the final file tree is identical to the one you started from; and Replays cleanly. A plan that would change the code is Blocked; a conflict reports a Snag naming the step and files.
  3. Apply rebase. Enabled only after a clean check.
The rebase tool with three commits of fork/messaging-provider-bus ticked and the bar reading 3 commits selected, with Squash, Reorder and Open rebase tool. The rail shows Squash 3 to 1, AI off, a message joined from 3 subjects, and the plan pick d598b70, squash 0ee5e19, squash 62ce719. Every ledger line is ticked and Apply rebase is enabled.
The plan, the proof ledger, and Apply — enabled only after the isolated check comes back clean.

Hooks, signing, and rerere are disabled for both the check and the apply, so a commit hook cannot fire twice or block the dry run. Other repo-local git settings can still affect the apply.

Nothing is pushed. A rebase rewrites local history; sending it anywhere is a separate, explicit push.

Not yet