Find the change that caused a problem
Start with what you know: a commit message, a file, a removed line or a version that used to work. Riff offers a different path for each clue, with the search scope visible as you investigate.
Read the graph and search the log
Follow branch and tag labels in the commit graph, or show all branches to see where histories meet. Select a commit to inspect its author, parents, subject, body and changed files. The log filter searches the loaded commits by subject, author or SHA. Deep search uses a separate local index of up to 1,000 recent commits, including message text, and returns up to 500 matches. It does not promise a search of the complete history.
Navigate with unified search
Open the command palette to find available actions, registered repositories, local and remote branches, and commits in the active repository. Filter by result type and combine words from a message, author or SHA.
Opening a branch or commit result navigates to its history without checking it out. Commit search needs at least two characters and covers the latest 1,000 commits across the active repository's references. Each type shows up to 20 results; refine the query when the limit is reached. This is not a search of every file or every repository's entire history.
Follow a file through its history
- Open the history explorer for the active repository and choose the file. File history follows renames and loads 50 commits at a time.
- Select a revision and inspect its changes. Use blame to identify the commit responsible for a line, then open that commit or the previous version.
- Compare two revisions to see their file differences. Riff resolves the revisions to specific commits before loading the comparison.
- Use Back to return to the previous investigation, including loaded pages, the selected commit and the blame position.
The file picker displays up to 10,000 paths. Blame rejects files over 1 MiB, more than 10,000 line breaks or lines over 20,000 characters. Comparisons have a 4 MiB limit for both the combined changed blobs and the generated patch, so even a small edit in large files can exceed it. Unsupported content receives an explicit state.
Search for added or removed text
In the history explorer, enter literal text and choose a path or folder filter, case sensitivity and a revision or all references. Follow the examined-commit count and results while the search runs. Open a match to inspect the change.
This search examines added and removed lines, comparing each commit with its first parent. It does not separately search every parent of a merge. It stops at 2,000 commits or 1,000 matches; skipped content and reached limits mean the search is incomplete. Its cache is held in memory, not a permanent index of the full repository.
For text in today's working files, use file search instead. It supports case matching, whole words, regular expressions and optional inclusion of untracked files, with results grouped by path and opening in your default editor.
Narrow down a regression with Bisect
- Open Bisect for the repository. Enter a known good revision and a known bad revision, then review the exact commits before starting.
- Prepare a clean working tree. Pending changes, another Git operation or collisions with ignored files can prevent switching to a test revision. Move any blocking ignored files aside yourself; they are not disposable test data.
- Start the investigation. Riff saves a recovery point and prepares a candidate. Run the appropriate check yourself, then mark the revision as working, failing or unable to test.
- Repeat for the next candidate. The dialog shows recorded results, remaining candidates and the return destination. Skipped commits can leave more than one possible cause.
- End the investigation to return to the original branch or commit. Closing only the dialog preserves the session; use the repository banner to resume, including after restarting Riff.
Bisect does not run arbitrary test commands for you. Its interval is limited to 100,000 commits and the displayed candidate list to 100. Existing Git sessions with custom terms, path filters or first-parent mode can be inspected and ended, but the guided flow does not reinterpret them.
Prepare the fix as a focused commit, or review recovery points before changing history.