“’Free software’ is a matter of liberty, not price. To understand the concept, you should think of ‘free’ as in ‘free speech,’ not as in ‘free beer’.” -Richard M. Stallman
Further reading: https://en.wikipedia.org/wiki/Free_software

Technology Project Management and Services
“’Free software’ is a matter of liberty, not price. To understand the concept, you should think of ‘free’ as in ‘free speech,’ not as in ‘free beer’.” -Richard M. Stallman
Further reading: https://en.wikipedia.org/wiki/Free_software
When your project isn’t just a temporary contribution but has its own identity (e.g., a “mod,” a “custom flavor,” or a “branded fork”), the workflow shifts from “temporary branch” to “long-lived integration.”
You are essentially maintaining a parallel product while siphoning updates from the original source.
In this scenario, you need two permanent branches that never die:
upstream-main (or vendor): A clean, untouched mirror of the original project. You only ever pull into this branch.prod (or custom-main): Your project’s identity. This contains your unique branding, features, and configurations.Think of the upstream project as the engine and your project as the car body. You want to be able to swap out the engine for a newer model without denting the car.
Periodically update your mirror branch so you have a clean base:
git checkout upstream-main
git pull upstream main
Instead of rebasing (which is for short-lived features), you will Merge the upstream changes into your custom project. This creates a “Merge Commit” that acts as a historical marker of when you synced.
git checkout prod
git merge upstream-main
Because your project has its own identity, you will likely have permanent conflicts (e.g., you changed the README.md or the logo.png).
If you find yourself resolving the same conflicts every month, your project is too “intertwined.” Aim for decoupling:
| Strategy | Action |
|---|---|
| Configuration Over Modification | Use .env files or config objects rather than hardcoding changes into the upstream source code. |
| The “Plugin” Pattern | Keep your personal code in separate directories (e.g., /custom) and hook into the main app via imports, rather than editing the original files. |
| Wrapper Scripts | If you need to change how the app starts, write a wrapper script (start-my-flavor.sh) instead of modifying the upstream Makefile or package.json. |
If you develop a bug fix in your “Identity” project that would benefit the “Upstream” project:
git checkout -b fix-upstream-bug
git cherry-pick <commit-hash-from-your-prod-branch>