--- title: "Source control" description: "Stage, commit, branch, and push from the panel beside your terminal." --- The **Source Control** tab of the [side panel](/window/side-panel) (⌘ J) 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. The tty7 source control panel ## 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 | ⌘ ⏎ 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. 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. 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.