fastest SCM tool available for Embedded software development - version-control

In my company, presently we are using Rational clearcase as the Software Configuration Management tool for our Embedded software development. The software is basically for Automobiles, to be specific for Engines (I dont think these information really matters).
But I find Clearcase to be very slow is performing any the activities (accesing files, branching and labelling), in addition to which there are various other limitations.
We have recently decided to research on some free & open source, distributed version control system which could be able to handle our large projects with speed and efficiency. This tool should be a full-fledged repository with complete history and full revision tracking capabilities, not dependent on network access or a central server. Branching and merging are fast and easy to do. It should have multisite development facility.
With these above mentioned requirement, we have come up with some of the tools that are presently available in the market:
GIT, Mercurial, Bazaar, Subversion, CVS, Perforce, and Visual SourceSafe.
I need everybody's help in finding me an approrpiate SCM tool for me which meets the above mentioned requirements.
Thanking you in Advance,
Rahamath.

Mercurial or Git are the most popular Distributed Version Control Systems. I believe Git has the speed advantage, particularly in committing, branching and merging. Furthermore, its merging algorithm is the best I've yet come across; most merges can be handled automatically without user input.
From my own experience, I would recommend Git without hesitation were it not for its very steep learning curve. However, I believe much of this is due to the paradigm shift when switching to a DVCS, such as getting the hang of pushing and pulling, the way repositories become decentralised.
Subversion, CVS, Perforce and SourceSafe are not distributed; furthermore, Perforce and SourceSafe are neither free nor open source. CVS is all but obsolete, with Subversion being its natural successor, so I wouldn't consider it any further.

If you want something "not dependent on network access or a central server", then the centralised SCMs from your list (Subversion, CVS, p4) have to go.
If you want cross platform, then I think Visual Source Safe would have to go.
Also, you mentioned Open Source, that kicks out p4 and Visual Source Safe.
CVS is quite old and if you're planning to use that, you'd best ignore it and use SVN instead.
Git is something that you can add to the list but it's support on windows is not as good as that of bzr and mercurial.
I use git myself but I develop exclusively on Gnu/Linux and so can't comment on windows support. Also, it's a bit quirky but once you get used to it can be really powerful. There is a learning curve problem so you might have to spend some time training your team on the tool.
Bzr, I don't know. When I last touched it, it had repository format issues and was horribly slow. It's much better now but I was scarred by my first exposure.
Hg is sweet and works fine on windows and Gnu/Linux but since I've used git quite heavily, I miss some of it's features on hg.

We are using ClearCase (with its advantages and pain points), and we are considering DVCS.
Right now, we are introducing Git, both on Windows (msysgit) and on a "central" Solaris server, which does met our needs in term of merging, and in term of distribution (for offshore-development)
But we have to setup "central" repositories for the developers to use as reference, and for that we had to use gitolite (the pu branch) for its fine-grained access level (repo, branch, directory access per user or per group, ldap-based)
The integration with Eclipse is in progress, and we are confident on the support level since all Eclipse projects have switched from CVS to Git (so they are committed to support it).
Mercurial has been considered and can certainly offer the same level of features, but has a much complex branching model.
Git has no extension to install. It just works (with a learning curve we manage to keep at a reasonable level through my user support services)

At work we are actually on ClearCase too and not satisfied for the some reasons... Very slow to update big projects (particularly if not local network)...
We (not me) benchmarked some products and Mercurial was choosen to be the future solution used.

Related

What version control use if I'm the only developer?

I want to use some version control for my projects, but I'm the only developer, there is not others. I want to use my pendrive like repository because I develop in many different places(but the same project).
I only worked with SVN, but in that case, was not good, I think an DVCS was better.
But now, I really don't know what to use, if SVN is the best option. I've looked for another solutions like Mercurial, Git, and Fossil, but I don't understand the differences, and mainly, if they are the best options for my situation.
I need to know what is best in this case.
If you're the only developer, then the best version control is the one that you are most comfortable with. The goal of version control is to make your life as a developer easier and safer, so there's no point in fighting with a version control that you don't know.
However, if you want to learn how to use a new version control system, this is a great opportunity.
If you think that you're going to have more developers working on this project later, then you want to think about a robust solution like SVN.
I would definitely recommend Git. It is a little cryptic at times, but it seems to be/become the de-facto standard for most open source projects. It's very powerful and it'll enable you to work with the great service that is Github :)
There are good topics on SO that compare Git, Mercurial, svn, etc.
What is the Difference Between Mercurial and Git?
To me an important requirement was easy, free, private repositories online so I started to use http://Bitbucket.org They support both Mercurial and Git.
+1 to #dudemonkey sentences. Except last - tastes can differ. Even as sole developer, you can (and have) use best techniques - i.e you may have non-linear development (thus - branching|merging), refactoring of code, different targets. Try and select best for you solution.
Nobody mentioned Fossil SCM - small, portable app in one exe, with all basic features of DVCS, integrated Wiki and tickets - which you can have (with repo) in USB, for example for max mobility
In first place stay away from SVN or any other CVCS, they suck. To learn more about DVCS, I recommend the Eric Sink's Book, it's free: http://www.ericsink.com/vcbe/
As you plan to work on different machines, the best solution would be to have an online repository, I think it's more pratical and safer than the pendrive. Some of the most known out there are: https://bitbucket.org/, https://github.com/, https://launchpad.net/, http://code.google.com/projecthosting/. Remember that with a DVCS you don't need to be online all the time, you can commit locally and push to the server later. If your project is not open source, you should stick with BitBucket as it's the only one that offers free hosting for closed source projects.
If you really want to work just in the pendrive, don't leave the repository just in the pendrive. It's safer to clone the repository from the pen drive to the machines you will work. Then you Push/Pull to the pen drive's repository to synchronize.

Version control system for distributed developers team

Distributed developer team requires version control system that allows Internet access and nicely integrated with Visual Studio.
Please, share your experience. What system will you personally choose?
Given that you're in the Microsoft world and given that you are most likely looking at something like DVCS due to the distributed team, between Git and Mercurial, I'd go with Mercurial as it has a bit nicer support for Microsoft.
The downside is that integration with Studio is just not there (there are some third party options, but none that I have personally worked with).
On the flip side, TFS can (semi) work remote, but is really not strong if you're just doing internet access vs. being on a VPN, etc. (and even with the VPN it can be slow... we once had to deal with a TFS server on a different continent). Although I would not be suprised if MS comes out with a DVCS due to their popularity down the road.
There's no option ;) Give a try to Plastic SCM specially if you need to be distributed inside Visual Studio!
It is free for up to 15 users and it covers all the basics and not so basics:
Distributed
Excellent branching and merging (full merge tracking, rename support and so on)
Graphical (check the branch explorer!)
Included XDiff and XMerge (support for refactors inside merge, the only tool on the market able to do it!)
Very good VStudio support...
SVN with tortoiseSVN and VisualSVN (or RocketSVN, or Ankh) is a good and cheap option!
TFS works, but is expensive and can be rather painful.
Hg (Mercurial) is very good, but not yet so nicely integrated with VS.

Learning version control for a college freshman

I'm a college CS freshman who wishes to learn a version control system well. Currently I'm looking at Subversion, Perforce, and Surround SCM.
I would be integrating the system with Eclipse, on a Linux platform. The code involved would mainly be C++, Java, and LaTeX (which I'll be using Eclipse as well).
Most probably I'll be the only user, but the advantage of SVN is that it is open source, while the other two are proprietary. I've heard a lot of good testimonial on TortiseSVN, but since I'm using Linux, I'll be missing out on that.
EDIT: Thanks for all the answers. Of course, I am open to any other version control systems as well. I will be checking out Git and Mercurial.
If you're learning version control systems, you would definitely do well to consider one of the newer "distributed" version control systems such as Git or Mercurial. By limiting your scope to the previous generation of tools as you mentioned, you will be missing out on what (some) people are really using today.
For learning a system, I probably wouldn't recommend choosing a commercial offering. You will get far better support and documentation, for free, with an open source solution.
If those are your only options, definitely SVN. That's the one (from that list) that real people use in the wild.
Honestly, though, learn a DVCS. Git, Mercurial, darcs, one of them.
If you're going to be the only one on a project, definitely you should check out SVN. Get Subclipse, an Eclipse plugin for Subversion, and get used to that. Then, move on to other version control systems once you feel comfortable.
I'd like to second (or third) those that suggested Git or Mercurial (or Bazaar). Distributed version control systems aren't just good for projects with multiple contributors; I use Git for any and all projects I start, even if they're just throw-aways. Basically, your development folder is your repository - It's portable, and it's easy to add more contributors and move to a more traditional centralized workflow later on.
I recommend Git especially because it has a bit of a steep learning curve, but it has taught me so much about project management, revision control, how to merge and patch files, how to read 'diff' output, etc. It really lets you get down to the fine grained details of version control.
You might find Perforce's whitepapers worth reading, for example High-level Best Practices
in Software Configuration Management.
SVN is very easy to learn. For those people who do use Windows, the GUI version is great.
Even if you are running Linux, I would still suggest learning it because it is widely used in places such as Google Code, Python, Wordpress, etc...
Bazaar is absolutely awesome for single-person, serverless development. It takes an entire five minutes to set up, and it's working immediately. It has the power of large VCS's ... but it's easy enough to use on your own.
I've heard Git and Mercurial are right along the same lines ... but I've a=only used Bzr.
I'd recommend Subversion, simply because of its pervasiveness in open source projects. There's definitely a lot of opportunity to put your Subversion knowledge to use in open source projects, and if you do, you'll learn a lot about coding, working as a team, and about using a VCS properly in a team (which is half of learning to use a VCS, and is the hard part because you can't learn it very well on your own). Fewer open source projects use proprietary VCSs, which means you'll get less of an opportunity to use them in the real world unless you're working specifically with friends or as a job. I haven't used the other two you mentioned, but I have no complaints about Subversion, it's quite straight-forward to use.
I'd also like to recommend a distributed VCS, such as git. With a distributed VCS, since every participant in a project has a complete copy of the source repository, and has complete control over their own copy, it means that you're given greater flexibility to use the VCS capabilities. You'll find that you have the freedom to commit as often as you want, and create new branches whenever you want, which is great when you're making changes to code and you want the ability to go back to an old version if necessary. A distributed VCS lets you use the VCS as a tool to help your coding, rather than simply as a way of storing and sharing your code with others. It's also very easy to set up a new repository in a distributed VCS. With git you just run git init and it'll set up version control in the current directory. How easy is that?

Alternatives to CVS where branching is important

Somewhat stuck trying to find a newer/better SCC system for my employer. My personal darling is SVN as it's compatible across a good swath of machines and relatively fast, but with past/present experience, it's not as friendly/easy to do branching.
The needs assessment is as follows:
Must be easy to use (CVS is considered easy)
Branches must be first class citizens
Prefer a mechanism like SVN's external property for repositories
Must be multiple OS friendly (linux, unix, Mac, MS Windows)
Proprietary/Commercial might be all right depending on license costs
Git is out as an option as some of the machines are running Vista and it's been a nightmare getting any developer tool to function with some sense of stability on that OS.
I'm also looking at Mercurial but not sure yet if it's going to work right for how the company operates.
I'm biased here, but take a look at Plastic SCM. It's easy to use (much easier than CVS) and it's all about branching.
If you're looking at Mercurial or GIT, maybe you're interested in distributed, aren't you? If so, plastic is still an option since, AFAIK, is the only distributed commercial one together with BitKeeper.
SVN is much easier with branching now that mergeinfo properties have been implemented (since v1.5). You just branch and merge away, and it remembers which revisions of which branches have been merged where.
Obviously I'm being a little blasé, but it does make svn worth another look if branching was your main issue with it. No longer do you have to keep text files around with notes on which trunk revisions you've merged into your branch. You just say "merge trunk". Then, you can "reintegrate" a branch automatically
Although it's worth noticing that you need to upgrade your svn server to 1.5 for this to work, the clients are backwards compatible with older servers, but you won't get the new functions. Back up your repo just before you upgrade, obviously.
Oh, and I believe 1.6 is out now, so you may as well jump straight on that. Of course TortoiseSVN (and VisualSVN for Visual Studio users) goes along with it.
My company uses Perforce and I've had a reasonable time with branches, and integrating changes between branches. It will even let you integrate between files that didn't share the same root, if you absolutely insist on it.
Using TortoiseSVN (and likely many other clients as well that I have no experience with), creating branches is a piece of cake, and merging them with other branches or back into the trunk is only slightly more difficult. If you have not tried branching/merging since 1.5, then SVN definitely warrants another look!

Do you use distributed version control?

I'd like to hear from people who are using distributed version control (aka distributed revision control, decentralized version control) and how they are finding it. What are you using, Mercurial, Darcs, Git, Bazaar? Are you still using it? If you've used client/server rcs in the past, are you finding it better, worse or just different? What could you tell me that would get me to jump on the bandwagon? Or jump off for that matter, I'd be interested to hear from people with negative experiences as well.
I'm currently looking at replacing our current source control system (Subversion) which is the impetus for this question.
I'd be especially interested in anyone who's used it with co-workers in other countries, where your machines may not be on at the same time, and your connection is very slow.
If you're not sure what distributed version control is, here are a couple articles:
Intro to Distributed Version Control
Wikipedia Entry
I've been using Mercurial both at work and in my own personal projects, and I am really happy with it. The advantages I see are:
Local version control. Sometimes I'm working on something, and I want to keep a version history on it, but I'm not ready to push it to the central repositories. With distributed VCS, I can just commit to my local repo until it's ready, without branching. That way, if other people make changes that I need, I can still get them and integrate them into my code. When I'm ready, I push it out to the servers.
Fewer merge conflicts. They still happen, but they seem to be less frequent, and are less of a risk, because all the code is checked in to my local repo, so even if I botch the merge, I can always back up and do it again.
Separate repos as branches. If I have a couple development vectors running at the same time, I can just make several clones of my repo and develop each feature independently. That way, if something gets scrapped or slipped, I don't have to pull pieces out. When they're ready to go, I just merge them together.
Speed. Mercurial is much faster to work with, mostly because most of your common operations are local.
Of course, like any new system, there was some pain during the transition. You have to think about version control differently than you did when you were using SVN, but overall I think it's very much worth it.
At the place where I work, we decided to move from SVN to Bazaar (after evaluating git and mercurial). Bazaar was easy to start off, with simple commands (not like the 140 commands that git has)
The advantages that we see is the ability to create local branches and work on it without disturbing the main version. Also being able to work without network access, doing diffs is faster.
One command in bzr which I like is the shelve extension. If you start working on two logically different pieces of code in a single file and want to commit only one piece, you can use the shelve extension to literally shelve the other changes later. In Git you can do the same with playing around in the index(staging area) but bzr has a better UI for it.
Most of the people were reluctant to move over as they have to type in two commands to commit and push (bzr ci + bzr push). Also it was difficult for them to understand the concept of branches and merging (no one uses branches or merges them in svn).
Once you understand that, it will increase the developer's productivity. Till everyone understands that, there will be inconsistent behaviour among everyone.
At my workplace we switched to Git from CVS about two months ago (the majority of my experience is with Subversion). While there was a learning curve involved in becoming familiar with the distributed system, I've found Git to be superior in two key areas: flexibility of working environment and merging.
I don't have to be on our VPN, or even have network connectivity at all, to have access to full versioning capabilities. This means I can experiment with ideas or perform large refactorings wherever I happen to be when the urge strikes, without having to remember to check in that huge commit I've built up or worrying about being unable to revert when I make a mess.
Because merges are performed client-side, they are much faster and less error-prone than initiating a server-side merge.
My company currently uses Subversion, CVS, Mercurial and git.
When we started five years ago we chose CVS, and we still use that in my division for our main development and release maintenance branch. However, many of our developers use Mercurial individually as a way to have private checkpoints without the pain of CVS branches (and particularly merging them) and we are starting to use Mercurial for some branches that have up to about 5 people. There's a good chance we'll finally ditch CVS in another year. Our use of Mercurial has grown organically; some people still never even touch it, because they are happy with CVS. Everyone who has tried Mercurial has ended up being happy with it, without much of a learning curve.
What works really nicely for us with Mercurial is that our (home brewed) continuous integration servers can monitor developer Mercurial repositories as well as the mainline. So, people commit to their repository, get our continuous integration server to check it, and then publish the changeset. We support lots of platforms so it is not feasible to do a decent level of manual checks. Another win is that merges are often easy, and when they are hard you have the information you need to do a good job on the merge. Once someone gets the merged version to work, they can push their merge changesets and then no one else has to repeat the effort.
The biggest obstacle is that you need to rewire your developers and managers brains so that they get away from the single linear branch model. The best medicine for this is a dose of Linus Torvalds telling you you're stupid and ugly if you use centralised SCM. Good history visualisation tools would help but I'm not yet satisfied with what's available.
Mercurial and CVS both work well for us with developers using a mix of Windows, Linux and Solaris, and I've noticed no problems with timezones. (Really, this isn't too hard; you just use epoch seconds internally, and I'd expect all the major SCM systems get this right).
It was possible, with a fair amount of effort, to import our mainline CVS history into Mercurial. It would have been easier if people had not deliberately introduced corner cases into our mainline CVS history as a way to test history migration tools. This included merging some Mercurial branches into the CVS history, so the project looks like it was using from day one.
Our silicon design group chose Subversion. They are mainly eight timezones away from my office, and even over a fairly good dedicated line between our offices SUbversion checkouts are painful, but workable. A big advantage of centralised systems is that you can potentially check big binaries into it (e.g. vendor releases) without making all the distributed repositories huge.
We use git for working with Linux kernel. Git would be more suitable for us once a native Windows version is mature, but I think the Mercurial design is so simple and elegant that we'll stick with it.
Not using distributed source control myself, but maybe these related questions and answers give you some insights:
Distributed source control options
Why is git better than Subversion
I personnaly use Mercurial source control system. I've been using it for a bit more than a year right now. It was actually my first experience with a VSC.
I tried Git, but never really pushed into it because I found it was too much for what I needed. Mercurial is really easy to pick up if you're a Subversion user since it shares a lot of commands with it. Plus I find the management of my repositories to be really easy.
I have 2 ways of sharing my code with people:
I share a server with a co-worker and we keep a main repo for our project.
For some OSS project I work on, we create patches of our work with Mercurial (hg export) and the maintener of the project just apply them on the repository (hg import)
Really easy to work with, yet very powerful. But generally, choosing a VSC really depends on our project's needs...
Back before we switched off of Sun workstations for embedded systems development we were using Sun's TeamWare solution. TeamWare is a fully distribution solution using SCCS as the local repository file revision system and then wrappers that with a set of tools to handle the merging operations (done through branch renaming) back to the centralized repositories of which there can be many. In fact, because it is distributed, there really is no master repository per se' (except by convention if you want it) and all users have their own copies of the entire source tree and revisions. During "put back" operations, the merge tool using 3-way diffs algorithmically sorts out what is what and allows you combine the changes from different developers that have accumulated over time.
After switching to Windows for our development platform, we ended up switching to AccuRev. While AccuRev, because it depends on a centralized server, is not truely a distributed solution, logically from a workflow model comes very close. Where TeamWare would have had completely seperate copies of everything at each client, including all the revisions of all files, under AccuRev this is maintained in the central database and the local client machines only have the flat file current version of things for editing locally. However these local copies can be versioned through the client connection to the server and tracked completely seperately from any other changes (ie: branches) implicitly created by other developers
Personally, I think the distributed model implemented by TeamWare or the sort of hybrid model implemented by AccuRev is superior to completely centralized solutions. The main reason for this is that there is no notion of having to check out a file or having a file locked by another user. Also, users don't have to create or define the branches; the tools do this for you implicitly. When there are larger teams or different teams contributing to or maintaining a set of source files this resolves "tool generated" locking related collisions and allows the code changes to be coordinated more at the developer level who ultimately have to coordinate changes anyway. In a sense, the distributed model allows for a much finer grained "lock" rather than the course grained locking instituted by the centralized models.
Have used darcs on a big project (GHC) and for lots of small projects. I have a love/hate relationship with darcs.
Pluses: incredibly easy to set up repository. Very easy to move changes around between repositories. Very easy to clone and try out 'branches' in separate repositories. Very easy to make 'commits' in small coherent groups that makes sense. Very easy to rename files and identifiers.
Minuses: no notion of history---you can't recover 'the state of things on August 5'. I've never really figured out how to use darcs to go back to an earlier version.
Deal-breaker: darcs does not scale. I (and many others) have gotten into big trouble with GHC using darcs. I've had it hang with 100% CPU usage for 9 days trying to pull in
3 months' worth of changes. I had a bad experience last summer where I lost two weeks
trying to make darcs function and eventually resorted to replaying all my changes by hand into a pristine repository.
Conclusion: darcs is great if you want a simple, lightweight way to keep yourself from shooting yourself in the foot for your hobby projects. But even with some of the performance problems addressed in darcs 2, it is still not for industrial strength stuff. I will not really believe in darcs until the vaunted 'theory of patches' is something a bit more than a few equations and some nice pictures; I want to see a real theory published in a refereed venue. It's past time.
I really love Git, especially with GitHub. It's so nice being able to commit and roll back locally. And cherry-picking merges, while not trivial, is not terribly difficult, and far more advanced than anything Svn or CVS can do.
My group at work is using Git, and it has been all the difference in the world. We were using SCCS and a steaming pile of csh scripts to manage quite large and complicated projects that shared code between them (attempted to, anyway).
With Git, submodule support makes a lot of this stuff easy, and only a minimum of scripting is necessary. Our release engineering effort has gone way, way down because branches are easy to maintain and track. Being able to cheaply branch and merge really makes it reasonably easy to maintain a single collection of sources across several projects (contracts), whereas before, any disruption to the typical flow of things was very, very expensive. We've also found the scriptabability of Git to be a huge plus, because we can customize its behavior through hooks or through scripts that do . git-sh-setup, and it doesn't seem like a pile of kludges like before.
We also sometimes have situations in which we have to maintain our version control across distributed, non-networked sites (in this case, disconnected secure labs), and Git has mechanisms for dealing with that quite smoothly (bundles, the basic clone mechanism, formatted patches, etc).
Some of this is just us stepping out of the early 80s and adopting some modern version control mechanisms, but Git "did it right" in most areas.
I'm not sure of the extent of answer you're looking for, but our experience with Git has been very, very positive.
Using Subversion with SourceForge and other servers over a number of different connections with medium sized teams and it's working very well.
I am a huge proponent of centralized source control for a lot of reasons, but I did try BitKeeper on a project briefly. Perhaps after years of using a centralized model in one format or another (Perforce, Subversion, CVS) I just found distributed source control difficult to use.
I am of the mindset that our tools should never get in the way of the actual work; they should make work easier. So, after a few head pounding experiences, I bailed. I would advise doing some really hardy tests with your team before rocking the boat because the model is very different than what most devs are probably accustomed to in the SCM world.
I've used bazaar for a little while now and love it. Trivial branching and merging back in give great confidence in using branches as they should be used. (I know that central vcs tools should allow this, but the common ones including subversion don't allow this easily).
bzr supports quite a few different workflows from solo, through working as a centralised repository to fully distributed. With each branch (for a developer or a feature) able to be merged independently, code reviews can be done on a per branch basis.
bzr also has a great plugin (bzr-svn) allowing you to work with a subversion repository. You can make a copy of the svn repo (which initially takes a while as it fetches the entire history for your local repo). You can then make branches for different features. If you want to do a quick fix to the trunk while half way through your feature, you can make an extra branch, work in that, and then merge back to trunk, leaving your half done feature untouched and outside of trunk. Wonderful. Working against subversion has been my main use so far.
Note I've only used it on Linux, and mostly from the command line, though it is meant to work well on other platforms, has GUIs such as TortoiseBZR and a lot of work is being done on integration with IDEs and the like.
I'm playing around with Mercurial for my home projects. So far, what I like about it is that I can have multiple repositories. If I take my laptop to the cabin, I've still got version control, unlike when I ran CVS at home. Branching is as easy as hg clone and working on the clone.
Using Subversion
Subversion isn't distributed, so that makes me think I need a wikipedia link in case people aren't sure what I'm talking about :)
Been using darcs 2.1.0 and its great for my projects. Easy to use. Love cherry picking changes.
I use Git at work, together with one of my coworkers. The main repository is SVN, though. We often have to switch workstations and Git makes it very easy to just pull changes from a local repository on another machine. When we're working as a team on the same feature, merging our work is effortless.
The git-svn bridge is a little wonky, because when checking into SVN it rewrites all the commits to add its git-svn-id comment. This destroys the nice history of merges between my coworker's repo an mine. I predict that we wouldn't use a central repository at all if every teammember would be using Git.
You didn't say what os you develop on, but Git has the disadvantage that you have to use the command line to get all the features. Gitk is a nice gui for visualizing the merge history, but the merging itself has to be done manually. Git-Gui and the Visual Studio plugins are not that polished yet.
We use distributed version control (Plastic SCM) for both multi-site and disconnected scenarios.
1- Multi-site: if you have distant groups, sometimes you can't rely on the internet connection, or it's not fast enough and slows down developers. Then having independent server which can synchronize back (Plastic replicates branches back and forth) is very useful and speed up things. It's probably one of the most common scenarios for companies since most of them are still concerned of "totally distributed" practices where each developer has its own replicated repository.
2- Disconnected (or truly distributed if you prefer): every developer has his own repository which is replicated back and forth with his peers or the central location. It's very convenient to go to a customer's location or just go home with your laptop, and continue being able to switch branches, checkout and checkin code, look at the history, run annotates and so on, without having to access the remote "central" server. Then whenever you go back to the office you just replicate your changes (normally branches) back with a few clicks.