All pages
On this page

Git changes

Git changes shows what is different in the git repository of the conversation's working folder: the branch, every changed file, and a diff for each. Use it to look over an agent's work before you ask it to commit. It is a viewer. The only thing it changes is the ⬇ Pull button.

Opening it #

Open the conversation's ⋯ menu and choose 🌿 Git changes. A window opens over the conversation. It reads the relay host's folder, so you see the same thing from any browser.

The entry is in the menu of every open conversation. It is hidden when no conversation is open and in the shared read-only view.

Which repository #

The window runs git in the conversation's working folder, the one you chose in the New chat dialog or set with 🗂️ Change CWD. Git finds the repository from there, as it does in a terminal: a folder inside a repository shows that repository.

If git finds no repository, the header says Not a git repository and the list says The current workspace root is not a git repository. The ⬇ Pull button is disabled. A folder that only holds several repositories side by side is not a repository itself, so it gets this message too. Start a conversation inside the repository you want to review.

Working folder below the repository's top

When the working folder is a subfolder of a repository, the list still shows the changes of the whole repository, not only of that subfolder. Opening a file from it does not work: every diff reads No textual changes detected for this file. Start the conversation in the repository's top folder to get working diffs.

A repository with no commits yet shows its branch name, and its staged files are listed. A diff of a staged file fails there with git's message fatal: bad revision 'HEAD'. Diffs of untracked files work.

The header shows the branch and, next to it, how far it is from its upstream:

Header Meaning
main The branch, level with its upstream or without one.
main ↑2 Two commits ahead of the upstream: not pushed yet.
main ↓3 Three commits behind the upstream.
main ↑2 ↓3 Both.
detached HEAD A commit is checked out, not a branch.

Under the branch, a second line shows the upstream and the number of changed files, such as origin/main · 4 changed files (1 changed file for one). A branch without an upstream shows no arrows and no upstream name, only the count. The counts are the ones git last knew: OAR does not fetch, so ↓ only changes after a fetch or pull.

Pull #

⬇ Pull runs a plain git pull in the folder, with no options. Its tooltip says "Pull from upstream", but OAR names no remote or branch. Whether it merges, rebases or only fast-forwards is whatever your git configuration says (pull.rebase, pull.ff). It is always offered when the folder is a repository, also when there is nothing to pull, and is disabled while the window loads or a pull runs (the button reads Pulling…). A pull may take up to 120 seconds.

When it ends, a line under the header says Pull: and the last line of git's output (for example Pull: Already up to date.), or Pull complete. when git printed nothing. If git refuses, the line is red and reads Pull failed: followed by git's own message. This is what you see for a conflict, for local changes a pull would overwrite, or for a branch without an upstream. OAR does not stash, reset or resolve anything. Ask the agent to sort it out. The list is reloaded after each pull.

The list #

Every changed file is one row: staged, unstaged and untracked files together, sorted by path. A row shows:

  • a letter badge for the state, and the file name with its folder under it;
  • for a renamed file, the old path after a ←;
  • deleted files with the name struck through.

A new folder that git does not track yet is one row for the whole folder, not one per file in it. Its name is empty and the folder's path is shown under it. Opening it shows No textual changes detected for this file.

Badge Meaning
M Modified
A Added
D Deleted
R Renamed
C Copied
T Type changed
U Untracked: a new file git does not track yet

A file edited after it was staged appears once, with the state of the working copy. The list does not tell staged from unstaged changes. Hover a row for the state in words and the full path.

Conflicted files

A file with a merge conflict has no badge of its own. A file that both sides changed (UU in git) shows U and the word Untracked, although it is tracked. A file both sides added shows A, one deleted on both sides shows D, and one deleted on one side shows D (struck through) or U, depending on the side. Its diff still opens and compares it with the last commit. Use git status in a terminal, or ask the agent, to see the conflict.

A repository with nothing to show says Working tree clean — no changes.

Refreshing #

The list is not live. It is read when you open the window, when you press ↻ (refresh), and after a pull. While an agent works, press ↻ to see its latest edits. Closing and reopening the window does the same.

The diff viewer #

Click a row to open that file's diff in a second window on top of the list. The diff compares the file with the last commit, so staged and unstaged edits show together. The title is the file's path; under it the state and the counts, for example Modified · +12 −3.

Button Shows
Changes Added and removed lines with three unchanged lines around each. Longer unchanged stretches fold into ⋯ 40 unchanged lines. This is the default.
Full file Every line of the file, with the changes marked.

Both views come from one diff, so switching is instant. The choice stays for the next files you open, until you reload the page. Lines carry the old and new line numbers; added lines are green and removed lines red.

File What you see
New (untracked) Every line as added.
Deleted Every line as removed.
Renamed The new path compared with the last commit: every line as added, even when the content did not change.
Binary Binary file — no text diff available., with the state only and no counts.
No text change, such as a mode change No textual changes detected for this file.
Very large The same diff, in full. OAR sets no size limit, but reading the diff has 15 seconds and a 32 MB output limit. A file that exceeds them shows an error message in place of the diff.

Long lines do not wrap. Scroll sideways to read them.

If git cannot read the status or a diff, the message is shown in red above the list, or in place of the diff.

Close the diff with ×, Esc, or a click outside it. The list is still open behind it. ×, Esc or a click outside closes the list in turn.

What it does not do #

There is no staging, committing, discarding or pushing here, and no way to edit a file. To commit, undo a change or push, ask the agent, in the conversation. A commit the agent makes on Claude carries the attribution line you chose; see Commit attribution. Added in 0.9.17 On DeepSeek it carries the line chosen under Commit attribution on the DeepSeek tab, or the folder's own setting.

By provider #

The window is the same for every provider that runs on the relay host: GitHub Copilot, OpenAI, Claude, Cursor, Grok and DeepSeek. It reads the folder and git, not the agent.

Provider Git changes
Claude Cloud The chat works on a clone at Anthropic, which this window cannot see. The entry is in the menu and reads the working folder you chose in New Chat on the relay host (the one that filled in the repository and branch), not the sandbox's changes. The agent's results come back as branches it pushed: the cloud line above the composer has one ⇡ branch link per pushed branch. See Claude Cloud.