TUI-based commit splitting tool for git.
For those of us who like keeping their commit history clean, sometimes it may happen that a single commit ends up containing more functionality than we'd like. For these cases the main solution is to do a soft reset on the commit and start using git add -p
to pick what you want in your commit, leaving the rest for another commit. That tool operates mostly on a hunk-by-hunk basis and when you'd like to go for line-by-line adding, the UX gets pretty bad, which led me to build this.
Ideally you'd install it in a directory of your choosing that is on the path, as this ensures you can simply run git split
instead of git-split
.
You can install this via opam or clone the repository and build with dune. Ready-made binaries are also available with the releases. Homebrew support might come.
After installation, simply run
git split
which defaults to selecting the HEAD commit or
git split <commit-id>
which splits a specific commit.
The tool will ensure that any commit on the branch that comes after the one you are about to split will be rebased on top the last commit generated by the split, unless you abort the process.
Additional options to consider are --example
which gives you an example set of change so you can explore the tool and --view-only
which will allow you to look at a specific commit, but not really split it.
This tool works by parsing the diff of the commit you are trying to split and re-assembling a diff after confirming the lines you want to keep. (Another option I considered was to keep the total changeset in the memory and let the commits be created afterwards, but I suspected this would overall be a worse UX).
The goal of this project was to learn OCaml, so if you are an OCaml expert reading this and despairing at the code quality, feel free to open a discussion with improvement suggestions.