Manage stacked GitHub pull requests from your terminal. A stack is a line of
PRs following the lead — whether that's one branch against main or a
three-deep chain. git dash shows the whole stack at a glance and rebases the
entire chain with one keystroke.
- See the whole stack — PRs render as a tree under their root branch, with approvals, checks, diff size, and ahead-counts inline.
- Rebase the chain with one key —
rupdates the root from origin, then rebases and force-pushes every branch in order. Conflicts abort cleanly and leave your repo as it was. - Drill into checks — expand a PR to see each check and open it in the browser.
- Three scopes — this repo, your org, or all your PRs on GitHub. Switch with
Tab. - Dispatch GitHub Actions — bind workflows to keys and share the bindings with your team.
- Instant startup — paints immediately from cache and refreshes in the background.
# Quick install (one-liner)
curl -fsSL https://raw.githubusercontent.com/jakiestfu/git-dash/main/install.sh | bash
# Or inspect first
curl -fsSL https://raw.githubusercontent.com/jakiestfu/git-dash/main/install.sh -o install.sh
less install.sh
bash install.shThis installs git-dash to ~/.local/bin. If that directory isn't on your
PATH, add it:
export PATH="$HOME/.local/bin:$PATH"The installer downloads the prebuilt standalone binary for your platform from
the latest release — no Deno
needed. Install elsewhere with PREFIX=/usr/local/bin bash install.sh.
Already installed? Update in place any time:
git dash upgrade | bashgitgh, authenticated- Deno 2.x — only for developing
git dash # your open PRs in this repo, current branch highlighted (default)
git dash --scope=org # your open PRs across the current repo's org, grouped by repo
git dash --scope=all # your open PRs across every repo, grouped by repo
git dash --configure # settings: columns, auto-refresh, action keys
git dash --no-push # rebase locally only; skip force-pushing
git dash --dir ./some-repo # run against another directory's repository
git dash upgrade | bash # update git-dash in placeThe default scope shows the PRs you've authored in this repo, grouped into
stacks. org and all are read-only overviews of your PRs across repos —
enter opens the selected PR on GitHub.
Tab/Shift-Tab— switch scope (the top tabs: repo → owner → you)s— open Settings;sorEscreturns to the current scope↑/↓ork/j— move the selectionenter/space— open the current selection: the PR on GitHub, or (with a check selected) that check in the browserr— rebase the selected PR's chain; with the root selected, just pulls it from originc— check out the selected branch→— expand the selected PR's checks;↑/↓onto a check andenter/→opens it.←collapsesR— refresh now (when auto-refresh is enabled)- any bound action key — dispatch that GitHub Actions workflow on the selected branch; press again once the run is up to open it
q— quit
Refreshes never lock the UI — only rebase, checkout, and dispatch wait for one to finish.
Open Settings with s (or launch onto it with git dash --configure); s or
Esc returns to your PRs. A preview PR in a bordered box re-renders as you
change settings:
- Config File — the path to the settings file;
enteropens it in your default editor. - Show Checks — toggle the
[passed/total]column. - Show Pull Request — toggle the
#num title +adds −dels · aheadline under each branch. When hidden, the delta moves onto the branch line. - Show Approvals — toggle the
[approved/total]review badge on each PR. - Auto Refresh — cycle
off → 30s → 1m → 5m; the stack re-fetches on that interval with a countdown in the header, andRrefreshes on demand. - Action Keys — bind any active GitHub Actions workflow to a key (
a-z,0-9) to dispatch it on the selected branch.enterrenames a binding;escunbinds. The lettersj k q r c v sare reserved.
Display settings (checks, pull request, approvals, auto-refresh) are global and
apply to every repo; action-key bindings are saved per-repo. Both live in
~/.git-dash.json.
git dash --configure <url> downloads a JSON file (a URL or local path) and
merges its action bindings into this repo's config. Check a fragment into your
repo or a gist and teammates pick it up with one command:
{
"actions": {
"d": { "workflow": "deploy.yml", "name": "deploy" },
"e": { "workflow": "e2e-tests.yml", "name": "e2e tests" }
}
}Select a PR and press r. Every row animates ○ pending → ⠹ running → ✓ done
in place. git dash:
- Refuses to start on a dirty tree, detached HEAD, an in-progress rebase, or when any branch in the chain has remote commits you don't have locally.
- Records each branch's fork point before anything moves, so rebases use
git rebase --ontoand never replay a parent's commits as duplicates. - On conflict, aborts the rebase, stops the cascade, and checks your original
branch back out. Already-completed branches were rebased and pushed, so a
partial run is safe to resume by pressing
ragain.
git clone https://github.com/jakiestfu/git-dash.git
cd git-dash
deno task run # run from source
deno task check # type-check
deno task test # run the test suite
deno task compile # build a standalone binary into dist/git-dashgit dash is a handful of TypeScript modules run directly by Deno, with no
dependencies beyond the Deno standard library. Every merge to main cuts a
release: CI compiles standalone binaries for Linux and macOS and attaches them
to a GitHub release.