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.4.tar.gz (21.0 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.4-py3-none-any.whl (22.5 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for stak_git-1.0.4.tar.gz
Algorithm Hash digest
SHA256 4f984aa23630f54816bb3e85ba1978271e36c736dc0e8751f374df72cf0b65d8
MD5 275917e0e693c3ee5528ee6cbad5abbb
BLAKE2b-256 6f4eee24a857a0a7af98926b83231c0693947e928fd303533ac7733f144bdf5c

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for stak_git-1.0.4-py3-none-any.whl
Algorithm Hash digest
SHA256 6835592c94aa270b0a2e228f46c230953b9981c4dbb6f24ab45e5da87a848982
MD5 8dacb9b20221ad4fe9c73680661fc84b
BLAKE2b-256 de486278d300da6365b1965718ec3b085d75631055973685892c74944284d166

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