Skip to main content

Minimal stacked changes for git - build big features as small branches

Project description

stak

npm PyPI License: MIT

Minimal stacked changes for git. A lightweight alternative to Graphite, ghstack, and git-branchless.

What is it?

Build big features as a chain of small, reviewable branches:

main → auth-types → auth-service → auth-ui

Each branch builds on the previous. Submit all for review at once. When you edit a lower branch, one command updates everything above.

Install

# Homebrew (macOS/Linux)
brew install memorypasta/tap/stak

# npm
npm install -g stak-git

# pip / uv
pip install stak-git

# Direct install
curl -fsSL https://raw.githubusercontent.com/memorypasta/stak/main/packaging/install.sh | bash

Commands

Command Description
stak new <name> Create branch on top of current
stak insert Insert branch at any position (fzf)
stak split Split current branch's commits (fzf)
stak up / down Move up or down the stack
stak goto Jump to branch (fzf interactive)
stak status Show the stack
stak sync Rebase entire stack
stak continue Continue after resolving conflicts
stak abort Abort current rebase
stak push Push branches (fzf multi-select)
stak push -a Push all branches
stak drop Remove top branch
stak fold Fold branch (fzf interactive)
stak fold --down Fold into child (non-interactive)
stak land Clean up after PR merge
stak log View commits (fzf interactive)
stak log -a Show all branches
stak ls List all stacks
stak use Switch to stack (fzf interactive)
stak use <name> Switch/create stack by name
stak rm-stack Delete a stack (fzf interactive)
stak setup-interactive Install fzf

Disable Interactive Mode

export STAK_NO_INTERACTIVE=1
stak push    # pushes all without fzf prompt

Basic Workflow

git checkout main

# Build feature in parts
stak new auth-types
# ... commit ...

stak new auth-service
# ... commit ...

stak new auth-ui
# ... commit ...

# See the stack
stak status
#     main
#     auth-types (2 commits)
#     auth-service (3 commits)
#   → auth-ui (4 commits)

# Push all for review
stak push

Editing a Lower Branch

# Go back to fix something
stak down
stak down
# ... fix and commit ...

# Update everything above
stak sync

# Push updates
stak push

Handling Conflicts

stak sync
# Conflict in auth-service!

# Fix the conflict in your editor
git add .
stak continue    # continues sync

# Or abort and try differently
stak abort

Combining Branches

Fold up (into parent - keep parent's name):

# Combine auth-service into auth-types
stak down              # go to auth-service
stak fold              # fold up into auth-types

#     main
#   → auth-types (combined)
#     auth-ui

Fold down (into child - keep child's name):

# Combine auth-service into auth-ui
stak down              # go to auth-service
stak fold --down       # fold down into auth-ui

#     main
#     auth-types
#   → auth-ui (combined)

After PR Merges

# auth-types PR merged to main
stak land        # removes auth-types, rebases rest onto main

# Stack is now:
#     main
#   → auth-service
#     auth-ui

Multiple Stacks

Work on different features simultaneously:

# Create stacks for different features
stak use auth-feature     # creates & switches
stak new auth-types
stak new auth-service

stak use billing-feature  # creates & switches
stak new billing-api
stak new billing-ui

# Switch between them
stak use auth-feature

# List all stacks
stak ls
#   ● auth-feature (2 branches) ◀ current
#   ○ billing-feature (2 branches)

# Delete when done
stak rm-stack billing-feature

Each stak tracks its own chain of branches independently.

Why stak?

Tool Complexity Dependencies Works with any Git host
stak Minimal Just bash + git ✅ Yes
Graphite Full platform Requires account ❌ GitHub only
ghstack Medium Python ❌ GitHub only
git-branchless High Rust binary ✅ Yes

Philosophy

  • Minimal: Only commands you need for stacked changes
  • Transparent: Just git branches. Use git directly anytime.
  • No magic: Stacks stored in .git/stacks/, one branch per line
  • Conflict-friendly: Resolve normally, then stak continue

Tips

  • Keep stacks shallow (2-3 branches). Deep stacks = more conflicts.
  • Commit before running sync, fold, or drop.
  • Use stak status often to see where you are.
  • You can always use raw git commands - stak just helps manage the chain.
  • Run stak setup-interactive to install fzf for interactive navigation.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

stak_git-1.0.2.tar.gz (20.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

stak_git-1.0.2-py3-none-any.whl (22.2 kB view details)

Uploaded Python 3

File details

Details for the file stak_git-1.0.2.tar.gz.

File metadata

  • Download URL: stak_git-1.0.2.tar.gz
  • Upload date:
  • Size: 20.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.5

File hashes

Hashes for stak_git-1.0.2.tar.gz
Algorithm Hash digest
SHA256 4b85107e8c1ab0346b5184cd9c9a4a8bf8443b96089c0255dd314986dac90325
MD5 0a8d0d2d31db9e16b7a8e724a5427cb3
BLAKE2b-256 a658ea7fe18de98141990c182fbabfe7f5de8a3947ca8791cf3b49ea2d9a2f9b

See more details on using hashes here.

File details

Details for the file stak_git-1.0.2-py3-none-any.whl.

File metadata

  • Download URL: stak_git-1.0.2-py3-none-any.whl
  • Upload date:
  • Size: 22.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.5

File hashes

Hashes for stak_git-1.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 e00281120383ed0ad2e6c86f12004da4d7ed1b2a962bcad274e3590667c21aa4
MD5 221f7b34265a4265f58e1524852ea50a
BLAKE2b-256 5dcc175893bdf5a8767c59108da252a9becb374954f6f80b7d1289343204e4db

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page