jip
jip is a CLI tool for managing stacked (or normal) pull requests using jj
(Jujutsu) and GitHub.
Each commit is a self-contained, atomic unit of change that gets its own pull
request. When you update a PR, jip posts a comment showing what you changed
(rebase noise is filtered out), so reviewers don't have to re-read everything.
Features
- One commit = one PR — each commit gets its own focused, reviewable PR,
with title and description taken from the commit message
- Review comments on update — when you update a PR, jip posts a diff
showing only what you changed (rebase noise is filtered out)
- Automatic bookmarks — no need to manually create jj bookmarks
- Supports forks — works both for repositories where you have write access as well as forked ones
- Normal GitHub merge — no special "land" command, just merge PRs as usual
- Stacks may contain merge commits — supports non-linear revision graphs
Installation
Single binary, no runtime dependencies.
go install github.com/omarkohl/jip@latest
Pre-built binaries for Linux, macOS, and Windows are available on the
releases page.
Requirements: jj (Jujutsu) and a GitHub
repository. jip does not work with Git directly.
Quick start
# Make your changes as a stack of jj commits
jj commit -m "feat: add user data model" # change-id: wys
jj commit -m "feat: add user store" # change-id: pkn
jj commit -m "feat: add user API endpoint" # change-id: qnv
# Create/update PRs for the stack (defaults to @-)
jip send
# After review feedback, update the "feat: add user store" change
jj new pkn
# ... make changes ...
jj squash
jip s qnv # 's' is short for 'send'
# Assume that the PR "feat: add user data model" is merged on GitHub
# Update the other PRs by doing the following ...
jj git fetch
jj new qnv
jj rebase -o main
jip s
# ... or in one command:
jip s --rebase qnv
A stack of commits before sending:

The resulting PR on GitHub with stack navigation:

Documentation
License
MIT