One of the great features of Github (and there are many) is the ability to fork a project to do your own development and experimentation on. I don’t, however, use Github, as I prefer to keep everything on my own server and not pay for something that I’m capable of hosting myself. I recently started a new project that had a base of the framework from an old project, so this was an obvious place to do some pseudo-refactoring (I’m leaving the old, original project intact) and giving me a good starting bed for future new projects. I had a few goals:
- Break the framework out of the Old Project into its own New Framework repository
- Fork New Framework and start development of New Project
- Easily fold changes to New Framework into New Project without tainting New Framework
- Easily fold changes to New Project that related explicitly to New Framework back in to New Framework
I started off by cloning Old Project in to New Framework and stripping out everything that had anything to do with Old Project.
git clone OldProject NewFramework cd NewFramework rm -rf .git/ git init # *hack hack hack to remove all OldProject cruft from NewFramework* git remote add origin [new-framework repository url] git push origin master
At this point, we have our NewFramework directory that’s full of just NewFramework, and it’s all happy and pushed off to the NewFramework repository. This is the starting point that we want for future projects that will be using this framework which is perfect because that’s exactly the situation that we’re in. So, let’s start NewProject using NewFramework as a base.
git clone NewFramework NewProject cd NewProject git remote -v git remote add upstream [url of the 'origin' remote from the git remote -v command] git remote remove origin git remote add origin [url of the repository for NewProject] git push origin master git branch upstream
And now we have our NewProject repository created with our bare copy of NewFramework committed and pushed up. When we have changes in NewFramework that we want to fold back in to NewProject, we can do this:
git checkout upstream git pull upstream master git checkout master git merge upstream
And if we have some changes to the framework that we want to go back to NewFramework:
git log # *find the sha of the commit we want* git checkout upstream git cherrypick [sha of the commit we want] git push upstream upstream:master