Understanding Git

I’ve been meaning to write this post for a while.  Lately, the places I’ve worked at have been pushing to go from Team Foundation Version Control (TFVC) or an SVN based derivative to Git.  To me, they both were the same.  They both handle branching.  They both do all the same stuff.  I just couldn’t put my finger on the difference between the two.

Over the past 8 months, I worked in a shop that converted from TFVC to Git.  And, for some reason, working with the source control did feel different.  I went from a big proponent of TFVC to actually liking Git better.  And I *still* couldn’t figure out the difference.

It finally hit me.  I was explaining the differences to someone at my new job, and I got a flash of insight that may have been obvious to everyone else…

Here’s what I finally understood:

TFVC or any SVN/PVCS/etc… based source control systems build their branches on history.  When you branch, you start with the base, then build on top of that to get your files.  TFVC is always looking backwards.

Git works off of changes.  While branches start off of a specific base, you are able to apply Git changes to literally ANYTHING.  It is very easy to apply a change to a completely different branch, as Git doesn’t worry about the base.  It just cares about the change.  Git allows you to look forward.

When I worked with Git, if I wanted to apply my changes, it was stupidly simple to create a new branch off of the master, and just apply my changes from my commits, and boom, my commits were up to date.  Trying to do something like that on TFVC was insane because the comparisons started with the point where the branch occurred, and then had to be reconciled.  Doable, but no where near as efficient.

After that, I now really enjoy Git for feature branching.  It’s still a bit of a nightmare to keep track of everything, but the tools for that are getting better and better.