During a relatively short-time, I've had the opportunity to work with a lot of developers on a large variety of projects. Many of these projects were centered around single developers or small teams when I came into the picture. These projects spanned a range from mobile development, to statistical analysis and modeling, to web development efforts, to complex parsing/scraping exercises. Too many of these projects were developed independent of any formal version control system. The primary excuses amounted to:
- [Git, Bazaar, Mercurial/Hg, Darcs, or even Subversion/SVN] is too hard and adds too much wasted time to my project efforts.
- My project is small, and I am the only one working on it; so I don't need to control versioning, the latest and greatest is always on my file system.
Before I touch on those two excuses explicitly, I want to spell out some core benefits and what I consider to be the fundamental functionality of version control. Without going into details, a few benefits of version control systems are: merging, reverting, storing snapshots, creating branches (this quickly becomes a semantic nightmare, but for anyone new to version control, branching is akin to copying the existing source so that you can work on it in a new context).
In your projects, do you find yourself:
- Wishing you could easily get the project back to a stable state after attempting to make updates and realizing that you made errors in your implementation technique?
- Wondering which files you changed recently?
- Trying to determine what change you made to accomplish a particular task, as such a change might help you in the context of your current conundrum?
- Wanting to revert a set of files back to a previous revision, or to match a 'deployed' state?
- Needing to isolate the differences between two versions of your project files (often on a local computer and a server, or in two different local directories)?
- Wishing that multiple individuals could easily update files toward a common goal without causing each other more work in the process?
- Repeatedly cycling through ctrl+Z and ctrl+shift+Z [or ctrl+Y in some programs] to undo/redo more than a single action?
If you can say, "No." to all of these, I don't believe you. Go back through the list and think about the benefits that these options offer. If you say, "Yes," to any of these questions, you should consider the fact that a version control system solves all of them and more. Most modern version control systems can actually address each of the items in that list with a single command, assuming you use the version control system properly.
Version control generally gives you the opportunity to take controlled snapshots of your project, and then manipulate the snapshot in the context of itself, recent changes, or other snapshots. Tasks like, "How do the current files differ from the last published version", "How do your updates compare to mine", or "I need to undo everything I did since time x or release y" are trivial.
But learning a new version control system is hard...
This is quite often true, but after a couple days of hard usage, you will already being seeing the benefits. Think about how many hours you have spent unproductively checking timestamps or trying to undo massive amounts of changes. These tasks should never be necessary!
My project is small, and I am the only developer
Seriously? Did you read the list of tasks? I can not think of a single project type that is hindered by version control. Even if you are an impeccable developer/coder/file-updater/whatever who makes no errors and never updates existing code, version control still gives you a pristene version tracking system for historical reference.
The purpose of this post is not to promote a particular version control system, but rather to highlight that version control systems are quite helpful, and they are under-used (in my experience). If you are not using a version control system, investigate the links in the list above, and start now. I would encourage use of a "Decentralized" implementation if you are selecting a new version control system to start, but in general, any version control system is better than no version control system.
There are lots and lots of great tutorials out there for each of the systems I mentioned. Don't let the expansive options and functionalities of any of these systems turn you away. Pick a tool, start with the basics, and keep working at it.