Skip to content

Review and commit changes

Changes lists staged, unstaged, untracked and conflicted files, as a list or a tree, with a filter and All / Unstaged / Staged views. Selecting a file shows its diff: numbered lines that scroll horizontally, with the correct before and after for staged, working and commit changes, including renames.

  • Stage or unstage a whole file, a hunk, or selected lines of a modified text file.
  • Staging, unstaging or discarding the file you are reviewing moves to the next file.

Stage and unstage go through a change queue: files move at once and fade until Git has them, so you can stage file after file without waiting. Entries run one at a time, in order. A locked index.lock is retried for a few seconds — ffgit never deletes it — and a failure moves the files back. The Change queue menu in the file list’s toolbar shows each entry with Cancel, Retry and Dismiss.

The composer has a summary, an optional description and the staged count. Amend is an explicit choice. A failed commit keeps your draft, and so does anything you type afterwards. Hooks and signing run exactly as configured in Git.

Before a commit, ffgit marks staged files that need a look:

  • a file over the size limit (50 MiB by default, set in Cleanup › Suggestions);
  • build output, by the rules of Build output in Git;
  • a likely secret, found by its name (.env, *.pem, *.p8, *.p12, id_ed25519, *private-key*…) — ffgit does not read the contents;
  • a file listed in .ffignore.

Commit and Amend name them once, with the reason, and offer Commit anyway or Unstage them. Only that click unstages, and only those files.

History draws a topological commit graph across branches, tags and remotes, with branch filtering, merge edges and pagination. Badges tell local branches, remote-tracking branches, tags, branches checked out in another worktree and other worktrees’ detached HEADs apart. Search history by message, author, hash, path or code.

  • Switch or create branches, with a confirmation before switching.
  • Discover, create and open linked worktrees. A new worktree checks out its submodules (All, the default, Top level or None).
  • Clone, fetch, pull and push. A GitHub or GitLab profile can carry an SSH key or a saved token used for that Git process only.

Visible repositories refresh from Git operations, file system events and a two-second status poll; windows in the background pause their watchers.