Example Workflows

Local development

Assuming you have cloned another git repository and want to start development here. With git gq you don’t need to create a local branch. Just run:

git gq init

This sets up the git gq directory and marks the current HEAD revision as parent revision.

You can now begin to make changes. You create preliminary commits with:

git gq new NAME

where NAME should be a one line string with no spaces in it. This is a preliminary log message that you can later update and extend. Every time you make more changes you can either:

  • run git gq new to create a new commit

  • run git gq refresh to update the topmost commit

  • run the git add.. and git commit as usual to create a new commit

You can see what patches are applied with:

git gq applied

You can see what patches are unapplied with:

git gq unapplied

When you want to finalize your commits and update commit messages, first move all of them as patches to the patch queue:

git gq pop -a

Then for each patch, to provide a proper log message, run:

git gq push
git gq refresh -e

You can also combine (‘fold’) an unapplied patch with:

git gq fold PATCH

Inspect the applied patches with:

git gq glog

When you are finished for all patches you can finalize these changes by setting the parent version to the current HEAD version:

git gq parent HEAD

You are now ready to publish your patches.

Updates from a remote repository

When you have created local patches and want to update your repository with new patches from a remote repository, the usual way would be to run git pull and then git merge or git rebase -i.

With the patch queue, there is now another way to handle this. Before pulling patches from the public repository, put all your local changes on the patch queue:

git gq pop -a

As a safety measure backup your patch queue with:

git gq backup

Now pull patches from the remote repository:

git pull

Reset the parent revision to the new repository HEAD:

git gq parent HEAD

Finally re-apply all your patches:

git gq push -a

If you get messages about conflicts (“rejects”) you have to resolve them. See further above at “Conflicts and conflict resolution”.

This workflow allows to resolve conflicts step by step which is usually easier than resolving all conflicts that arise from git pull all at once. Also the reject files created for each conflict clearly show which change was intended at the patch which is usually easier than the common 3-way merge.