restack augments the experience of performing an interactive Git rebase to make it more friendly to workflows that involve lots of interdependent branches. For more background on why this exists and the workflow it facilitates, see Automatically Restacking Git Branches.
Pre-built ARM and 64-bit binaries are available for Linux and Mac at
https://github.com/abhinav/restack/releases. To install, simply unpack the
archive and put the binaries somewhere on your
For example, if you have
$HOME/bin on your
OS=$(go env GOOS) ARCH=$(go env GOARCH) VERSION=v0.1.2 URL="https://github.com/abhinav/restack/releases/download/$VERSION/restack.$VERSION.$OS.$ARCH.tar.gz" curl -L "$URL" | tar xzv -C ~/bin
Build From Source
If you have Go installed, you can install
restack using the following
$ go get -u github.com/abhinav/restack/cmd/restack
restack setup to configure
git to use
$ restack setup
If you would rather not have
restack change your
.gitconfig, you can set
restack up manually.
sequence.editor git configuration to the script generated by
restack setup --print-edit-script.
$ restack setup --print-edit-script > bin/restack-edit.sh $ chmod +x bin/restack-edit.sh $ git config sequence.editor restack-edit.sh
The generated script will rely on the
restack edit command if available,
falling back to your
GIT_EDITOR if not.
You can also bypass the checks performed by the script and point
sequence.editor to the
restack edit command directly.
$ git config sequence.editor 'restack edit'
restack edit --help for the different options accepted by
restack automatically recognizes branches being touched by the rebase and adds rebase instructions which update these branches as their heads move.
The generated instruction list also includes an opt-in commented-out section that will push these branches to the remote.
For example, given,
o master \ o A | o B (feature1) \ o C | o D (feature2) \ o E | o F | o G (feature3) \ o H (feature4, HEAD)
git rebase -i master from branch
feature4 will give you the
following instruction list.
pick A pick B exec git branch -f feature1 pick C pick D exec git branch -f feature2 pick E pick F pick G exec git branch -f feature3 pick H # Uncomment this section to push the changes. # exec git push -f origin feature1 # exec git push -f origin feature2 # exec git push -f origin feature3
So any changes made before each
exec git branch -f will become part of that
branch and all following changes will be made on top of that.
Thanks to @kriskowal for the initial implementation of this tool as a script.