I’ve been there a lot: I’m using some kind of existing framework / tool / open source software which is awesome, but there is that tiny little thing that annoys me, and I’d like to change it. No problem, I say, and start hacking. Two months later I update the codebase and my change is gone, which I don’t notice right away, but only after another month. Then I remember that I changed something, but I don’t remember how or when and the search starts.
The described situation is one that I will be able to (hopefully) avoid from now on, and here is how: Of course it involves Git and branching.
The naive solution to this problem would be creating a branch “modifications” containing all the hacking, and then merging it into the master branch. Your history would look something like this:
? | * 6dc6c93 | v1.1.0 of Awesome Framework * 5e7d249 | Merge branch 'modifications' |\ | * 7256352 | Don't do weird stuff | * 0573b96 | Great enhancement |/ * 180673a | v1.0.0 of Awesome Framework
But what would happen at the question mark? You can’t merge
modifications again, because all the commits are already in the master branch, so nothing will happen (or in other words,
modifications already is fully merged).
One could go with cherry-picking the commits in
modifications all over again, but the problem is that they are a bit hard to get a hold of, because you can’t do
master..modifications as the commits are on master too.
My current solution for this problem also involves a branch where I keep all my modifications, but the merging is backwards compared to the previous approach. Instead of having an extra branch for my modifications, I’ve got an extra branch with the original codebase, say
original. My own changes are committed on the
master branch as one would usually do. Whenever I update the original codebase, I update the
original branch and then merge it into
master, for example:
... | * 14d672f | Merge branch 'original' |\ | * 0cebd2d | v1.2.0 of Awesome Framework * | b83105d | hack hack hack * | 5df562e | More fancy hacks |/ * 5e7d249 | Merge branch 'original' |\ | * 6dc6c93 | v1.1.0 of Awesome Framework * | 7256352 | Don't do weird stuff * | 0573b96 | Great enhancement |/ * 180673a | v1.0.0 of Awesome Framework
If you never merge your modifications into the
original branch, conflicts between your modifications and the original codebase updates will be properly detected by Git and you don’t have to worry about loosing your precious hacks.
And they all merged happily ever after. :)
What I just wrote may or may not have been obvious to you as an advanced Git user, but I needed to figure it out myself and it helped me better understand how Git works.
If you have a better / different methodology feel free to drop a comment as I’d be interested to hear about it.