Most Mozilla developers use Mercurial (hg) patch queues to organize patches and revise them based on feedback from Bugzilla code reviews. I had not found a similar git workflow that was nearly as convenient until Stacked Git. Suggestions to use git rebase --interactive and temporary branches were not as nimble as being able to push and pop patches on a branch.
Stacked Git (stg) is a git porcelain script that adds support for hg-style patch queues. stg’s patch queues augment, not replace, git’s feature branches. When you start a patch queue for a branch, stg creates a corresponding “my_branch.stgit” branch. Your patch queue operations are recorded in the “my_branch.stgit” branch, but your “my_branch” has commits for each of your applied patches. OSX users can use Homebrew to install Stacked Git: `brew install stgit`
| Mercurial command | Stacked Git command |
|---|---|
hg qnew my_patch |
stg new my_patch |
hg qrefresh |
stg refresh |
hg qseries |
stg series |
hg qrename my_new_patch |
stg rename my_new_patch |
hg qrefresh --edit |
stg edit |
hg qfinish |
stg patches are already commits |
Here is an example GitHub workflow:
# Create a new branch “my_branch” to fix a bug:
$ git checkout -b my_branch master
# Configure your branch for stg:
$ stg init
# … Edit some files to fix the bug
# Create a new patch (which also creates a temporary commit):
$ stg new my_patch
# Push your fix to GitHub:
$ git push my_github_remote my_branch
# … Submit a pull request on GitHub
# … Edit some files to revise my fix based on review feedback
# Update my patch:
$ stg refresh
# Push my revised fix to GitHub:
$ git push --force my_github_remote my_branch
# Now that my_branch has been merged on GitHub, delete local branches, my_branch and my_branch.stgit:
$ git checkout master
$ stg branch --cleanup my_branch
$ git branch -d my_branch