> ## Documentation Index
> Fetch the complete documentation index at: https://tty7.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Source control

> Stage, commit, branch, and push from the panel beside your terminal.

The **Source Control** tab of the [side panel](/window/side-panel) (<kbd>⌘ J</kbd>)
is a full git client for whichever repository the focused pane is in. It follows
the pane: `cd` into another repository and the panel switches with you.

<Frame caption="Placeholder — screenshot: the Source Control panel with staged and unstaged groups and a commit box">
  <img src="https://mintcdn.com/tty7/xi044v9ExFWIUIoQ/images/placeholder.svg?fit=max&auto=format&n=xi044v9ExFWIUIoQ&q=85&s=631190f8b3c3fc2a1846976059902298" alt="The tty7 source control panel" width="1200" height="675" data-path="images/placeholder.svg" />
</Frame>

## Changes

Files are grouped by what git thinks of them:

| Group              |                                                           |
| ------------------ | --------------------------------------------------------- |
| **Merge Changes**  | Conflicts, with *Resolve Conflict* and *Mark as Resolved* |
| **Staged Changes** | What the next commit will contain                         |
| **Changes**        | Modified but not staged                                   |
| **Untracked**      | New files                                                 |

Each row has **Stage Changes**, **Unstage Changes**, **Discard Changes**, and
**Open Changes** — which opens the [diff](/git/diffs). Group-level *Stage All*,
*Unstage All*, and *Discard All* sit on the headers, and the destructive ones
confirm first.

## Committing

Write the message in the box at the top and pick a commit action:

|                    |                                                                                              |
| ------------------ | -------------------------------------------------------------------------------------------- |
| **Commit**         | Commit what is staged                                                                        |
| **Commit All**     | Stage everything, then commit                                                                |
| **Commit (Amend)** | Replace the last commit — confirms first, because anyone who already has it has to reconcile |
| **Commit & Push**  | Commit, then push                                                                            |
| **Commit & Sync**  | Commit, then pull and push                                                                   |

<kbd>⌘ ⏎</kbd> commits while the caret is in the message box. **Stash All** is
there too.

## Branches and remotes

The branch name at the top of the panel is a dropdown. It holds:

|                                 |                                                                                                      |
| ------------------------------- | ---------------------------------------------------------------------------------------------------- |
| **The branch list**             | Click one to check it out. Past a dozen branches the list scrolls instead of growing past the window |
| **Create Branch…**              | From here, or from any commit in the history                                                         |
| **Fetch** · **Pull** · **Push** | Individually                                                                                         |
| **Switch Repository**           | Only when the window has panes in more than one repo                                                 |

Beside it, the sync button pulls then pushes — and relabels itself **Publish
Branch** when the branch has no upstream yet.

The command palette carries the verbs under **Git** — *Git: Commit*, *Stage
All*, *Unstage All*, *Discard All*, *Create Branch*, *Sync*, *Push*, *Pull*,
*Fetch* — so those are bindable. Checking out is a pick rather than a verb, so
it lives only in the dropdown.

<Warning>
  Checking out does not stash for you. A dirty tree that would be clobbered
  makes git refuse the checkout, and tty7 shows you git's own refusal as a
  notification rather than working around it.
</Warning>

When a repository is mid-operation — merging, rebasing, cherry-picking,
reverting, bisecting, applying — the panel says so instead of pretending
everything is normal.

## History

The *History* section header opens the commit graph: branches drawn as lanes, a
filter box, **Current Branch** or **All Branches**, and *Load more* at the
bottom.

**Git: Toggle Commit History** does the same from the keyboard. It ships with no
default key — bind one under **Settings → Keyboard Shortcuts**.

Click a commit for its detail view — message, parents, and the files it touched,
each openable as a diff. From a commit's menu:

|                                               |                                                                                                                         |
| --------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| **Checkout Commit** · **Create Branch Here…** | Move to it                                                                                                              |
| **Cherry Pick** · **Revert Commit**           | Apply or undo it here                                                                                                   |
| **Reset (Soft / Mixed / Hard)**               | Move the branch to it — Hard confirms, since commits after it fall off the branch and uncommitted changes are discarded |
| **Copy Commit SHA**                           |                                                                                                                         |

The history section starts collapsed and remembers whether you opened it
(`scm_graph_expanded`).

## In the sidebar

You do not have to open the panel to know where you stand: every
[sidebar row](/window/sidebar) carries its pane's branch and a `+N −M` count of
the working tree, refreshed on `cd` and when a command finishes. Clicking the
counts opens the diff overlay.
