This is something a bit like git-add -i, except not depending on perl, and partially crossed with git-commit. Usage: $0 [arg [arg ...]] Runs git diff with the same arguments. Any non-text diffs, new files, or deleted files cause an immediate error out. Text diffs are accumulated; each diff hunk is remembered separately. The user interface allows the user to, repeatedly, choose from: - Choose a diff hunk to be included. - Commit chosen hunks. - Split hunks. Committing works by constructing a git-fast-import pack for the new commit, then running git-commit --amend to let the user supply (edit, really) the commit message. If the commit --amend is aborted, the commit created by git-fast-import is backed out. (There are lots of race conditions with unpleasant consequences if other commits are happening to the same branch at the same time. This is not intended for workflows that do that.) There is an issue in that after committing part of a split hunk, trying to commit any other parts of that split hunk doesn't work. This is just because I haven't yet been annoyed enough by it to write the necessary code to make it work right, not because it can't be helped. The UI is curses-based. You move the cursor up and down with j and k (to move by lines) and f (or space) and b (to move by screens). J and K move by "large" amounts, which usually means "the next line of the type you're on", but when within a hunk it moves to the appropriate end of that hunk. l expands the file or hunk the cursor is on; h collapses (if a file or hunk is expanded), or moves to the containing object (if not). a toggles whether a hunk is included in the next commit (indicated by a > marking); C commits the marked hunks. S splits a hunk, letting you edit the diff with $EDITOR; the resulting diff becomes one part of the split, with the remaining changes becoming the other. These can then be further split (but, because of the aforementioned issue with committing one part of a split and then another, that's not very useful at present). The Makefile is unlikely to work for you out of the box, but this is arguably a feature, because (because of the way I have it set up) it installs a copy into ../git-interactive, which is likely to not be what you want. If you want to use the Makefile, you'll need , from (eg) ftp.rodents-montreal.org:/mouseware/local-src/makefiles/. But there's really no need; just compile the .c files and link with -lcurses -ltermcap. You will need lcs-cvt (or a patched compiler) to handle four of the seven files (git-intf.c, memstream.c, subproc.c, and ui.c); see ftp.rodents-montreal.org:/mouseware/local-src/lcs-cvt/.