git-stack-cli
v1.3.3
Published
- β¨ **[Stacked diffs](https://graphite.dev/guides/stacked-diffs) for `git`** - π **Simple one-branch workflow** - π― **Interactively select commits for each pull request** - π¬ **Group commits for focused code review** - π **Use the [official GitHub CLI
Downloads
47
Readme
git-stack-cli
- β¨ Stacked diffs for
git
- π Simple one-branch workflow
- π― Interactively select commits for each pull request
- π¬ Group commits for focused code review
- π Use the official GitHub CLI
- β»οΈ Automatically synchronize each pull request in the stack
- πͺ Work seamlessly with GitHub's interface
- π« Avoid juggling mutiple branches and complex rebasing
- π Preserve your detailed commit history
- β‘ Faster, in-memory rebase via
git revise
Demo
Install
[!TIP]
Install via Homebrew to ensure the official Github CLI and git revise dependencies are installed automatically
brew tap magus/git-stack
brew install git-stack
npm
Installing via npm requires installing the official Github CLI and git revise dependencies separarely
brew install gh
brew install git-revise
npm i -g git-stack-cli
Usage
git stack # group and sync commits in branch to Github
git stack --check # print status only, skipping rebase and sync to Github
git stack --verbose # print more detailed logs for debugging internals
git stack --no-verify # skip git hooks such as pre-commit and pre-push
git stack help # print a table of all CLI arguments
Why?
The goal of git stack
is to combine the simplicity of developing in a single branch in order to preserve your commit history while also grouping commits into pull requests for code review.
Often pushing all your commits to a single pull request is the simplest and fastest approach to development. This comes at a price, your teammates have to review larger, less related pieces of code and you will lose some of your atomic commit history if you "Squash and merge".
When you decide to break changes up into multiple diffs that depend on one another this process is commonly referred to as stacked diffs (pull requests that depend on other pull requests).
This approach is popular at many major companies such as Twitter, Facebook, etc.
Managing stacked diffs manually involves managing multiple local branches, jumping between them, rebasing, etc.
This process gets even more complicated when you start getting feedback in code review and have to update individual branches.
Managing even a few stacked diffs requires a relatively strong knowledge of git
, even with tricks like --update-refs
.
How is this different than x
ghstack
git stack
automatically synchronizes each pull request in your stack, as neededgit stack
does not create local branches (instead it annotates commits locally with metadata to denote groups of commits, e.g.git-stack-id: E63ytp5dj
)ghstack
requires rebasing and squashing since each commit creates a pull request, which means you lose commit historygit stack
allows developing in a single local branch and selecting groups of commits for each pull requestgit stack
adds a clear comment to each pull request in the stack showing the entire stackgit stack
does not break if you land pull requests through Github directly,ghstack
requires landing from the CLI interfacegit stack
uses the official GitHub CLI (gh
) instead of personal access tokens
Development
git submodule update --init --recursive
npm i
npm run dev
npm unlink git-stack-cli
npm link
# navigate to project to test within
npm unlink git-stack-cli
npm link git-stack-cli
git stack --verbose
Build standalone executable
npm run build:standalone
Publishing
[!IMPORTANT]
You must update the
version
inpackage.json
before runningnpm run release
npm run release
# release individually
npm run release:npm
npm run release:github
npm run release:brew