Sero has a built-in Git app for working in a repository. It gives you and the agent the same view of branches, changes, commits, diffs and stashes, and it can carry out most everyday Git operations.
Sero is in public beta. Treat the Git app as a practical workspace tool, not a replacement for understanding Git. Anything that changes the repository does so for real, in the active workspace.

git_manager tool and the /git command, for asking the
agent to inspect or change the repository.For how Git relates to Sero's own undo and checkpoints, see Checkpoints and Undo. They are separate systems: checkpoints restore workspace files through Sero, Git operations change the real repository.
The layout is three columns with history underneath:
Unavailable actions are disabled rather than hidden, and the reason sits with the control — "2 conflicts left to resolve" appears under the commit button rather than in a pop-up.
The sparkle inside the commit message box drafts a message from what you are about to commit. It spins in place and the message appears; you can then edit it like anything you typed. If nothing useful comes back, the box is left alone.
It describes exactly what that button would commit — what you have staged in the Git app, or everything in the list in the title-bar panel.
With a GitHub remote connected, the right-hand pane becomes a pull request composer: pick the source and target branches, and draft a title and description from the changes. If the repository has no remote yet, the same slot offers to publish it to GitHub instead.
If a merge, pull or cherry-pick hits a conflict, the app says so in a banner and stays in that mode until you leave it. Abort merge is in the banner, and it is the only place it appears.
While the merge is unfinished:
Selecting a conflicted file turns the right pane into a resolver. It shows the two sides in Git's own words — current is what your branch has, incoming is what is being merged in — with buttons to accept either side or both, per conflict or for the whole file. Accepting writes the file and stages it, because staged is Git's own definition of resolved.
Resolve with AI in the banner works through the conflicts for you. It fixes what it can and applies each one as it goes, so the file list drains while it works, and the pane on the right keeps a running account: one line per conflict saying what it changed and why.

It interrupts only when it genuinely cannot decide, and then it asks a specific question with the real options rather than handing the file back. A question holds up that one conflict; anything independent carries on behind it. Your answer is carried forward, so a later conflict about the same thing is decided rather than asked about again.
You still review the result. The account of what it did stays on screen, and every line jumps to its file, so it doubles as a review checklist.
The /git command is a conversational shortcut that routes your request to the
git_manager tool. It is not a separate Git implementation.
Use disposable repositories when trying unfamiliar actions — a small throwaway repo with a README is enough to test commits, branch deletion, stash pop, merge, cherry-pick, or force flags.
Prefer these when you want the agent to explain the repository without changing anything:
refresh — re-read the repository. Rarely needed by hand; the app keeps
itself current.status — changed files and index state.log — recent commit history.branches — local and remote branch information.diff — one file's diff; needs file, and staged picks the staged or
unstaged side.show_commit — one commit; needs a hash.Their output can still include private file names, commit messages, paths and code. Redact before sharing logs or screenshots.
These change the real repository, working tree, index, remotes or worktrees. Review the request before running it, especially bulk ones.
stage, unstage, discard.commit, stash, stash_pop, stash_apply.fetch, pull, push.checkout, create_branch, delete_branch,
remove_worktree.merge, abort_merge, cherry_pick.Parameters worth knowing:
file — for stage, unstage, discard and diff.message — required for commit, optional for stash.branch — required for branch actions, merge and checkout.hash — required for show_commit and cherry_pick.worktreePath — required for remove_worktree.stashIndex — selects a specific stash entry.all — bulk stage/unstage, auto-stage on commit, pre-stash on cherry-pick.force — destructive overrides: force branch or worktree deletion, and
discarding local changes when switching branch.Avoid prompts like "stage everything and push" unless you have already reviewed the diff and know the target remote and branch.
When a workspace has no remote, Sero offers to create a new GitHub repository or connect an existing URL as the origin. Treat it as a repository-changing step: confirm the account, organisation, visibility and URL first.

If you create a new repository from Sero, review the name, description and visibility before creating it.

Afterwards Sero shows the resolved owner, repository and URL so you can confirm which remote the workspace will use.

The app has guardrails, but they are not a guarantee that an action is safe.
force is used.all=true, which stashes your
changes first — you may need to pop that stash afterwards.commit with all=true stages everything before committing.push --set-upstream when there is no upstream.Take particular care with force and all. They are convenient in a throwaway
repo and can skip important review steps in a real one.
The Git app keeps workspace-local state at:
Both the app and the agent read it, so they share one view of the repository. Missing state falls back to an empty default; malformed state may need removing.
Sero keeps its own files out of your repository, so they never appear as changes to commit:
These go in .git/info/exclude, which is local to your clone — Sero does not
touch your project's .gitignore. If you want to track your
.sero-workspace.json, add it deliberately with git add -f and Sero will keep
reporting changes to it as normal.
Treat this state as local metadata. It can include branch names, file paths, commit metadata, status summaries and timestamps.
Check the active workspace is inside a Git repository. Outside a repository there is no branch or status data to show.
It shouldn't happen: the app watches the repository and updates itself, whoever
made the change. If it ever does, ask the agent to refresh, and say so — the
watcher is meant to catch command-line changes on its own.
Check whether the branch is current, the default, or checked out in another
worktree. For worktrees, check whether the path is the main worktree, dirty or
locked. Avoid force unless you know what Git will remove.
Resolve it with normal Git tools in the same workspace and continue or abort as Git instructs. The app follows along on its own.
Check the current branch and its upstream before pushing. If there is no upstream, push may set one. Verify remotes and branch names in a disposable repo before relying on this in a real project.
all=true, force=true, stash pop and apply, branch deletion,
worktree removal, push, merge and cherry-pick.status, log, branches, diff and show_commit when you only want
the agent to explain things.