Skip to content

Keyboard shortcuts

These are the default keys. Press ? in tt-git to see the keys for the focused pane, including any you’ve changed; type to search them. To change a key, see Key bindings. The name in brackets after each pane is its context in config.toml.

Uppercase letters mean shift: P is shift+p.

These work in every pane unless the pane uses the same key for something else.

KeyDoes
1 2 3 4Focus the graph / status / branches / details.
tab / shift+tabFocus the next / previous pane.
ctrl+h ctrl+j ctrl+k ctrl+lFocus the pane to the left / below / above / to the right.
+Zoom: the focused pane (details, or else the graph) fullscreen, and back.
j ↓ / k ↑Move down / up.
ctrl+d pagedown / ctrl+u pageupPage down / up.
g home / G endTop / bottom.
PPush. Sets the upstream on the first push.
pPull.
zUndo the last checkout, commit, reset or rebase.
ctrl+rRefresh everything.
: ctrl+pCommand palette.
?Help: the focused pane’s keys.
q ctrl+cQuit.
KeyDoes
enterOpen the commit fullscreen: changed files on the left, the selected file’s diff on the right.
spaceShow / hide the commit’s details.
escHide details. With details already hidden: clear the filter.
aAll branches ↔ the current branch (and its upstream).
tDates as age ↔ local date and time.
fFilter by author or by file or folder.
oCheck out the selected commit: the local branch on it, else the commit with HEAD detached. Asks to stash uncommitted changes first.
nNew branch at the selected commit.
TNew tag at the selected commit. tab in the dialog makes it annotated.
MMerge the commit into the current branch.
rRebase the current branch onto the commit.
CCherry-pick the commit.
cCopy the commit hash.
AAsk an AI agent about the commit. See Agent actions.
] } / [ {Next / previous branches pane tab. Focus stays on the graph.

See Graph.

KeyDoes
typeNarrow the list.
tab shift+tab ← →Switch between the Author and File tabs.
↑ ↓, ctrl+p ctrl+nMove.
pageup pagedownPage.
backspace, ctrl+uDelete a character, clear what you typed.
enterApply. On the File tab with no match, uses what you typed as the path.
escClose without changing the filter.
KeyDoes
j k, pageup pagedownScroll. In the files view, j k pick a file.
}Show / hide the commit’s changed files below the diff. Fullscreen puts them on the left.
oOpen the link in view with a plugin link handler.
eOpen the file in view in your editor, at the line at the top of the diff.
bBlame the file in view as of that commit, at the line at the top of the diff.
esc spaceClose details.

See Details.

KeyDoes
spaceStage / unstage the file. On a conflicted file, mark it resolved.
enterOpen the file’s changes to stage them by hunk or line.
aStage everything, or unstage everything if it’s all staged.
dDiscard the file’s changes (asks first).
cCommit what’s staged.
AAmend the last commit with what’s staged, keeping its message.
sStash.
eOpen the file in your editor at its first change, or a conflicted file at its first conflict marker.
bBlame the file in the working tree.
CContinue a merge, rebase or cherry-pick.
XAbort a merge, rebase or cherry-pick (asks first).

See Status.

The staging view, opened with enter on a file in the status pane.

KeyDoes
j / kNext / previous hunk, or changed line in line mode.
spaceStage the selection, or unstage it on the staged side.
tabSwitch between the unstaged and staged changes.
aPick single lines instead of whole hunks, and back.
vStart or end a range of lines.
dDiscard the selection from the working tree (asks first).
cCommit what’s staged.
eOpen the file in your editor at the selected hunk or line.
escBack to the status pane.

See Staging hunks and lines.

Blame, opened with b on a file in the status pane or details. j k, ctrl+d ctrl+u and g G move as everywhere else.

KeyDoes
ctrl+gGo to a line: type its number and press enter.
digits, then G / gVim style: 42G goes to line 42, 5j / 5k move five lines. esc drops the count. While blame is focused, digits count instead of switching panes.
enterOpen the line’s commit fullscreen, scrolled to the line. esc comes back.
spaceShow / hide the line’s commit details below the code.
[Step back: blame the file as it was just before the line’s commit.
]Forward again, to the newer version you stepped back from.
{Back one commit of the file: the version before the one shown, whichever lines changed.
}Forward one commit of the file, toward the version below it.
/Search the code with a regex, jumping as you type. enter keeps it, esc drops it.
n NNext / previous line matching the search.
tAges ↔ local dates and times. Shared with the graph.
eOpen the file in your editor at the selected line.
cCopy the line’s commit hash.
escBack to where you opened blame.

See Blame.

On the Branches, Tags, Unmerged and Merged tabs.

KeyDoes
enter spaceCheck out. A remote-only branch gets a local tracking branch.
nNew branch from the selection.
dDelete. Asks before force-deleting an unmerged branch, or deleting a remote branch or a tag. For a tag, r in the dialog deletes it on the remote too.
RRename a local branch.
TNew tag at the selection’s commit. tab in the dialog makes it annotated.
POn the Tags tab: push the selected tag. Elsewhere: push the current branch.
fgit fetch --all --prune.
/Filter the tab as you type.
] } / [ {Next / previous tab.
bPick the base branch.
MMerge the selection into the current branch.
rRebase the current branch onto the selection.
cCopy the name.

While you type a filter: enter keeps it and goes back to the keys above, esc clears it, ↑ ↓ move, and backspace deletes a character.

See Branches, Merged and unmerged and Tags.

The branches pane on its Stash tab. These keys don’t fall back to the branches pane’s.

KeyDoes
spacePop: apply the stash, then drop it.
aApply it and keep it.
dDrop it (asks first).
nNew branch from it, at the commit it was made on.
enterShow what it holds, untracked files included.
/Filter as you type.
] } / [ {Next / previous tab.

See Stash.

The branches pane on its Worktrees tab. These keys don’t fall back to the branches pane’s.

KeyDoes
enter spaceOpen the worktree in place of this one.
nNew branch in a new worktree, from the selected one.
dRemove the worktree (asks first; asks again before --force if it has changes).
cCopy its absolute path.
/Filter as you type.
] } / [ {Next / previous tab.

See Worktrees.

These are fixed and can’t be rebound.

WhereKeyDoes
Text prompts (commit message, branch name, stash)enterConfirm.
escCancel.
tab shift+tabNew branch: create it in a worktree, or not. Stash: what to stash.
backspace, ctrl+uDelete a character, clear the text.
Yes/no questionsy enterYes.
n escNo.
Palette and pickerstypeNarrow the list.
↑ ↓, ctrl+p ctrl+nMove.
enter / escRun / close.
Help popuptypeSearch the keys.
backspace, ctrl+uEdit the search.
esc, or ? with nothing typedClose.
Error popupesc enter qDismiss.
KeyDoes
ctrl+\ f12Leave a split pane (it keeps running), or close an overlay or popup.
any other keyGoes to the plugin.

Change these with [plugins] pane_release_keys. See Plugin panes.

With mouse = true (the default):

ActionDoes
Click a pane or rowFocus the pane and select the row.
Double-click a commit in the graphOpen it fullscreen with its changed files, as enter does.
Click a tab in the branches pane’s titleSwitch to that tab.
Click a file in the details files viewShow its diff.
Click a line in blameSelect it.
Click an entry in Filter graphFilter the graph by it. A click outside the popup closes it.
Scroll the wheelScroll the pane under the pointer (in the details files view, the diff when over it).
ctrl+click a link in detailsOpen it with a plugin link handler.