I use Perforce at work. I also use Git because I would still like some form of version control when I’m working on code and can’t connect to the server. No, reconcile offline work just is not the same. Here is where I’ve found git to be a great benefit:
- Branching speed – git takes a few seconds at most.
- Conflicts – P4Merge’s auto resolve destroyed a week’s worth of work once. Ever since then I would rather resolve by hand when merging. When Git prompts me about a conflict, it is actually a conflict. The rest of the time, git resolves stuff correctly and I save heaps of time.
- Keeping track of merges – If you have one branch that is continuously receiving merges from two other branches, you know what a headache this can be with perforce. With git, the headache is minimized because the result of a merge in git is actually a new commit which knows who its ancestors are.
- Permissions – I have lost track of the number of times I’ve tried to work on a file but couldn’t because it was not checked out in Perforce. If you worked with XCode (or any editor that does not have a solid Perforce SCM plugin) offline, you know how irritating this can get. I don’t have to worry about that with Git. I make my changes. Git does not stop me and tracks them in the background.
- Keeping the main tree tidy – With git, I can sort my commits and tidy the code up so that the history looks nice and tidy. None of that “checking in this file because it was supposed to be part of the previous checkin” rubbish. I squash commits like that, because they help nobody.
- Stashing – Your perforce server needs to be version 2010.1 or newer to use the p4 shelve command.
- Creating patches – Easy to do in git. Don’t know if it is possible in Perforce without using the command line.
- Mailing patches from the GUI – again, git wins here.
- Disk space – With perforce, every branch is a copy. That means if your source tree is huge, your disk space gets eaten up fast. This is not even counting the additional space once you start building. Why even have a link between branches and disk space? With git, you can have 100 branches and only one branch at a time ever exists. If you specifically want to work on two versions simultaneously you can clone, do your work and then get rid of one clone if you want, without losing anything.
- If you’re on XCode4, perforce support has been dropped and git support is now built in. If you do cross platform work like I do, this matters a lot. With Visual Studio, you can use git extensions. With perforce, it’s equally yuck on both OSes. Well, maybe a little more on mac now with XCode4 on the scene.
- Finding the faulty checkin (or, git bisect rules) – Ever tried to do a binary search with perforce to figure out where a bug was introduced? Quite a hassle, yes? Even more of a hassle when there have been integrates from other branches in the middle. Why? Because there is no automation for such tasks. You need to write your own tool to talk to perforce and you usually don’t have the time. With git, you give it the starting points (the “good” point and the “bad” point) and it automates the search for you. Even better, if you have a script that can automate the build and test process, you can hook git up to the script and the whole process of finding the checkin is automated. That is how it should be.
- Tracking changes across refactors – Try splitting BigClass into SmallClass1 and SmallClass2. To Perforce, BigClass has now ceased to exist and two new classes (SmallClass1 and SmallClass2 have joined the source tree). To Perforce, there is no relation between BigClass and SmallClass1 and SmallClass2. Git, on the other hand, is smart enough to know that x% of BigClass is now in SmallClass1 and y% of BigClass is in SmallClass2 and that BigClass has ceased to exist. Now, from the point of view of someone who is reviewing changes across multiple branches, you tell me which approach you’d find more useful – Git’s or Perforce’s. Personally, I prefer Git’s approach because it more accurately reflects the actual change in the code. Git is able to do this because it tracks content within the file and not the file itself.
- Centralized or decentralized: Git is a DVCS system while perforce is centralized. A centralized VCS cannot be decentralized later, but a DVCS (especially git) can be centralized. There are several products that add very fine grained access control to git, if that is something the business needs. Personally, I would go with a system that gives me greater flexibility in the long term.
- Branch mappings: If you want to do branching right in Perforce, you need to create a branch mapping. There are reasons for this, but they are tied to how Perforce conceptualizes a branch. As a developer, or a team, this simply means one more step in the work flow, which I do not consider efficient at all.
- Sharing work between teams: With Perforce, you cannot break up a submission. Team A is working on feature A. Team B on feature B. Team C works on bug fixes. Now, Teams A & B have to fix a bunch of bugs in order to implement their features. The only thing is, they weren’t so disciplined when committing their changes (probably because they’re rushing to a deadline) and so their “bug fixes” are parts of larger submissions that also contain new stuff as far as version control on their branches are concerned. However, Team C is now doing a point release and would like to get the bug fixes from the other teams. If they were using Git, Team C could cherry pick the other teams’ relevant changes, split them up and only take what they needed without worrying about introducing any partially implemented features. With Perforce, Team C can get the affected files, but would have to separate the relevant changes using a much more manual process.
- Changing platform – If, for whatever reason in the future, you
decide to change your platform of choice, with Perforce, you’re at
the mercy of Perforce.com and the availability of the tools for the
platform of your choosing. - Changing to future amazing source control engine X – If you decide
to change what you use for source control, extracting your source
control history from Perforce and moving it to new system X is
going to be a nightmare, because it is closed source and the best you
can do is guess – just Google for Perforce to Git migration to get
a sense of what I’m talking about. At least with Git, its open
source, so it eliminates a lot of the guesswork involved.
Well, that’s my 2 cents. In Perforce’s defense, I gotta say their customer support rules and so does their Time Lapse View tool. I do not know how to get a time lapse view with git. But for the convenience and time saved, I’d go with git any day.