views:

110

answers:

2

Hi,

I've been using git for a while for my one-man developments, but I haven't run into any tricky branching issues until now and I seem to have forgotten something fundamental that I no doubt "knew" just after reading the Pragmatic Version Control Using Git Book..

I'm often several releases ahead of what is actually published on my website, so that when a bug report comes in, I only apply them to the current master branch rather than fixing them in the next released version. Of course, I'd like to change that to get fixes out quicker.

Let's say 1.0 was just released, 1.1 is going to be released soon, but I'm already working on 1.3, e.g.

1.0 - released  
1.1 - finished  
1.2 - finished  
1.3 - in development

A bug report comes in.. usually this would be fixed in 1.3, but how do I fix it in 1.1 instead?

As far as I am aware in svn and other "traditional" source control systems, I would need to branch B.1.1 and B.1.2 and apply the changes to each branch in turn, then build from each branch and finally apply the fix to the master branch.

I seem to remember that git, however, does something clever: I branch B.1.1, make the changes there, do {something} and B.1.2 and the master branches are automagically updated with the fix. Is this possible or did I imagine {something}?

Best regards,

Frank

+5  A: 

The right way in this case would be to:

  • make sure you have B1.1 and B1.2 created (to isolate final fixes in their respective branch)
  • apply your patch on master
  • cherry-pick that commit to B1 and B2

As mentionned in this thread, that would:

ensures master doesn't regress with respect to an older branch. (Do not use merge unless you want to merge all changes from one branch to another, rather than just the single commit you mention.)

VonC
Thanks. I didn't even know "git cherry-pick" existed.. but that's still basically the same "make lots of branches and fix every branch individually" workflow.I don't fully understand (or begin to understand) rebase properly, but would it not be possible to fix the problem on the master branch, commit it and then use rebase to re-order the commits on the master branch, so that the fix occurs before the 1.2 release.Would that mean that the change is "inherited" by 1.2 and the 1.3 development versions?
Frank R.
That could work (rebase -i or rebase interactive) provided you did not push those branches anywhere: you would rewrite history (actually replacing an history by a new one) of master. Still, B1.1 and B1.2 can still be there for 1.1 or 1.2 specific fixes.
VonC
Thanks. I'll try to rebase next time. I don't push to another repository (I use git as a private repository only), so the fast-forwarding isn't a problem.
Frank R.
A: 

What about in this case fixing on B1.1, merging B1.1 into B1.2, then B1.2 into B1.3?

Marius K