Playing Git

In this post I describe my pattern of Git usage.

My project (NuGet support for TeamCity) contains two main branches called 'v0.5-bugfix' and 'v0.6-bugfix'. 'v0.5-bugfix' branch is targeted for TeamCity 6.5.x. 'v0.6-bugfix' is targeted for TeamCity 7.0 and contains more features.

To start a new feature development I first decide if I want this feature to be delivered for 0.5 or 0.6 version. Let's suppose I decided to create a feature for both versions. I create a branch 'task' for it from 0.5-bugfix by calling:

git checkout -b task v0.5-bugfix

As work is done I merge branch 'task' onto 0.5-bugfix via:

git checkout v0.5-bugfix
git merge task

Main work is done. New feature is implemented in branch 'v0.5-bugfix'. Now it's time to merge it onto v0.6-bugfix. For it I create a branch 'task6' from v0.6-bugfix. Than I merge branch 'task' into 'task6'.

git checkout -b task6 v0.6-bugfix
git merge task
git checkout v0.6-bugfix
git merge task6

And in the rest I remove obsolete branches by:

git branch -d task task6

That was it. The feature is ready for both branches. It's time to push.

Another trick I found useful is to try to create branch from the lowest possible version even if you do not need it. In future that will let you simply merge the feature to older version.

To update from remote repository I use the following:

git fetch origin
git merge origin/branch

This way of updates let's you avoid issues if remote branch has new commits and your local branch has another commits. I do not like rebase because it requires force push (-f) with possible history overwrite if you decide to push it once more after rebase.

All recent fixed to NuGet plugin for TeamCity I did using this practice. Current public version of the plugin contains all fixes and features that are applicable to the version. It was easy to take two branches in sync. This is a VCS commits graph I saw today:

You may find the source of the graph on GitHub

comments powered by Disqus