Source control

A right-side panel that shows the active project's working changes and lets you stage, unstage, discard, commit, push, pull, and stash without leaving Paneful. The diff view shows whole files with line numbers and syntax highlighting. Multi-select with Cmd/Shift+click for bulk operations.

Opening the panel

Two equivalent ways:

  • Press + Shift + G.
  • Click the branch icon in the toolbar at the top of the project area.

The panel opens on the right, sized at whatever width you last set (drag the left edge to resize, between 240px and 800px). Closing the panel preserves your last width and re-opens at the same size.

Branch bar

The top of the panel shows the current branch with two counters:

  • ↓ N — commits behind the upstream
  • ↑ N — commits ahead of the upstream

Pull and Push buttons sit on the right. Pull is fast-forward-only — it won't auto-merge a diverged branch. Errors surface in a toast. Both show a spinner while running.

File list

The panel groups changed files into four collapsible sections:

  • Conflicted — merge conflicts. Status badge: red U.
  • Staged Changes — files in the index.
  • Changes — modified tracked files not yet staged.
  • Untracked Files — files git doesn't know about.

Each row shows the file's status badge (M / A / D / R / C / U / ?), the path (renames show old → new with strikethrough on the old path), and hover actions:

GroupHover actions
StagedOpen in editor · Unstage
ChangesOpen in editor · Discard · Stage
UntrackedOpen in editor · Delete · Stage

Open in editor uses your OS's default app for that file type (open on macOS), so it goes to whatever you've set as the default — VS Code, Cursor, Zed, anything.

Multi-select

Click a file to select it (plus open its diff). Then:

  • + click — toggle a file in the selection (no diff change).
  • Shift + click — range select from the anchor file to the clicked one.

When more than one file is selected within the same group, clicking the stage / unstage / discard action on any of them acts on the entire selection. A "N selected · Clear" indicator appears under the commit box.

Multi-select is scoped to one group at a time. Clicking in a different group resets the selection.

Diff view

Click any file to open its diff. The diff shows:

  • The whole file with changes inline, not just the changed regions.
  • Old and new line numbers in the gutter, with + / - markers.
  • Red/green backgrounds for removed and added lines.
  • Syntax highlighting for most common languages — TypeScript, Python, Go, Rust, Swift, Java, C/C++, Ruby, PHP, Bash, JSON, YAML, CSS, HTML, SQL, Markdown, and more.

Long diffs show a "Show more" button to keep the panel responsive. Binary files show a placeholder instead of bytes.

Committing

Type your message in the textarea at the top of the panel and press Commit. The button is disabled until at least one file is staged and the message has content. On success the textarea clears automatically.

A Stage all button next to Commit appears when there's anything in Changes or Untracked.

Stash

The Stash section sits below the file groups. Click the archive icon next to the section header to create a new stash — an optional message dialog appears, and untracked files are included.

Each stash row has three hover actions:

  • Apply — keep the stash, apply its changes.
  • Pop — apply, then drop the stash.
  • Drop — delete without applying.

Discarding changes

Discard actions always show a confirmation first. For untracked files the dialog warns they'll be permanently deleted; for tracked files it warns your changes will be lost.

!
Discard bypasses the trash. There's no undo from inside Paneful.