Some tips I’ve learned from a similar situation:
- Have a remote tracking branch for the upstream author’s work.
- Pull changes from this tracking branch into your master branch every so often.
- Create a new branch for each of the topics you’re working on. These branches should generally be local only. When you get changes from upstream into master, rebase your topic branches to reflect these changes.
- When you’re done with some topic work, merge into master. This way, people who are deriving work from yours, will not see too much rewritten history, since the rebasing occurred in your local topic branches.
- Submitting changes: Your master branch will basically be a series of commits, some of which are the same as upstream, the rest are yours. The latter can be sent as patches if you want to.
Of course, your choice of branch names and remotes are your own. I’m not sure these are exhaustive to the scenario, but they cover most of my hurdles.