I’ve been quite happily using git-flow for a while now. It’s a great way to structure and organise code management whether you are making commercial code or otherwise. However, I’ve recently had a need to fork an upstream repository and make local changes to it. However, I also need to track and keep updated with the changes upstream. So, this is my new flow:
Firstly, I’ll create an empty repository and initialise it for git-flow
$ mkdir repos.git
$ cd repos.git
$ git flow init
No branches exist yet. Base branches must be created now.
Branch name for production releases: [master]
Branch name for "next release" development: [develop]
How to name your supporting branch prefixes?
Feature branches? [feature/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []
Next add the upstream remote and specify which remote branch to track, which we will use to pull changes in periodically.
$ git remote add upstream -t master git://sourceware.org/git/newlib.git
$ git fetch upstream
Then, merge the upstream code into the current development branch. Instead of merging the full upstream development, I prefer to merge the last stable release from upstream. This can be done by merging a specific tag identified by a specific commit point.
$ git checkout develop
$ git fetch upstream
$ git show-ref tag_name
$ git merge tag_hash
This should be done periodically to keep the local develop branch in-sync with upstream changes. Since I’m merging in the latest stable upstream code, I would recommend doing this whenever there are new stable versions from upstream.
Otherwise, just use git-flow as before and hopefully, things will hopefully work out automagically.