stak-git
v1.0.4
Published
Minimal stacked changes for git - build big features as small branches
Maintainers
Readme
stak
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-uiEach 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 | bashCommands
| 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 promptBasic 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 pushEditing a Lower Branch
# Go back to fix something
stak down
stak down
# ... fix and commit ...
# Update everything above
stak sync
# Push updates
stak pushHandling 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 abortCombining 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-uiFold 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-uiMultiple 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-featureEach 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, ordrop. - Use
stak statusoften to see where you are. - You can always use raw git commands - stak just helps manage the chain.
- Run
stak setup-interactiveto install fzf for interactive navigation.
License
MIT
