acha.ninja

Hidden gem - stgit

I just discovered stacked git which is an alternative ui for git, and am very impressed. It solves a lot of headaches I have been having with git and I feel like it may be a better user interface for people who like careful commits.

Maybe it doesn’t get attention is deserves due to (in my opinion) a hard to understand website and little promotion, so to help spread the word here is my 2 cents.

Summary:

  • It is like a lightweight alternative to one branch per feature.
  • It is very nice for when usually you only do one commit per pull request.
  • It good for when you are constantly testing combinations of features as it allows you to avoid creating all sorts of strange hybrid branches.

And an example:

All the stuff you are currently working on is a stack of changes:

+ feature1
+ feature2
> workarounds

Notice the final patch in the list is my local work of hacky workarounds I wouldn’t want in any pull request. The tool makes it easier to enable or disable patches like these at a whim.

You can change what current feature you are working on, and easily update just that patch.

$ stg goto feature1
... make changes to feature1
$ stg refresh          # Save changes I just made in 
                       # the feature1 patch/commit.

When you go to a feature, it unapplies patches after it on the stack, so you can use the stack commands to change the patch order.

$ stg sink workarounds # Shift workarounds patch to the bottom
                       # so it is active while we work
                       # on different patches.

$ stg goto feature2    # Now we can work on feature2
                       # with our workarounds enabled.

You can nicely edit the commit message of each feature or thing you are working with a single command:

$ stg edit feature1 # This would be a lot of
                    # rebasing in normal git.

If we want to start a new feature:

$ stg new feature3
do your work...
$ stg refresh # Save your work.

When you are done you can publish them to a branch and they all appear as a normal clean git history with just the patches/commits you want:

$ stg hide workarounds
$ stg publish -b finished-branch

Or you can send them as a set of diffs to your friend.

$ stg send-email feature1 feature2 # works great with sr.ht

That’s about it… remember stg is just a different UI for git, the repository is still a normal git repository with some additional metadata you can ignore.

Most things can be done with plain git, but this makes some things that are 2 or 3 commands requiring temporary branches much shorter and easier. Stgit saves you tedious rebasing and ammending of past commits while keeping a clean git history.