views:

264

answers:

8

I know 1000s of similar topics floating around. I read at lest 5 threads here in SO But why am I still not convinced about DVCS?

I have only following questions (note that I am selfishly worried only about Java projects)

  • What is the advantage or value of committing locally? What? really? All modern IDEs allows you to keep track of your changes? and if required you can restore a particular change. Also, they have a feature to label your changes/versions at IDE level!?
  • what if I crash my hard drive? where did my local repository go? (so how is it cool compared to checking in to a central repo?)
  • Working offline or in an air plane. What is the big deal?In order for me to build a release with my changes, I must eventually connect to the central repository. Till then it does not matter how I track my changes locally.
  • Ok Linus Torvalds gives his life to Git and hates everything else. Is that enough to blindly sing praises? Linus lives in a different world compared to offshore developers in my mid-sized project?

Pitch me!

+1  A: 

Your central argument about the IDE doing the tracking for you is false. Most IDEs don't in fact have any such functionality besides unlimited undo levels. Think of branches, merges, reverts, commit messages (log) and such and I bet that even the IDE that you did refer to falls short. Especially I doubt it tracking your commits - quite possibly on several different branches that you work on - and properly pushing them to the repository once you get online.

If your IDE actually does all that, I would in fact call it a distributed version control system in itself.

Finally, if the central repository dies for whatever the reason (your service provider went bankrupt, there was a fire, a hacker corrupted it, ...), you have a full backup on every machine that had pulled the repository recently.

EDIT: You can use a DVCS just like a centralized repository, and I would even recommend doing so for small-to-medium sized projects at least. Having one central "authoritative" repository that is always online simplifies a lot of things. And when that machine crashes, you can temporarily switch to one of the other machines until the server gets fixed.

Tronic
for the last comment about the central repository's vulnerability: that's why you back it up, the good thing is there's only one thing to back up.
Sander Rijken
There are various reasons why backups would fail, too. Human error, a fire, bankrupt, unless you actually do take care to *frequently* backup the repository to multiple physical locations and keep multiple old versions of it. I doubt that many would stick to such procedure but simply using a DVCS gets you that for free.
Tronic
I've had SVN repositories become unreadable simply because a newer version of BerkDB (the default backend of SVN back then) could no longer read the old repository. Backups will not help you with that but a DVCS will have usable copies on machines that didn't upgrade yet even if such a software error would occur.
Tronic
A DVCS does only backup up the data if those changes have actually been shared with someone else. What you describe with the BDB format is an upgrade problem that can be avoided by following upgrade instructions and *not* a software error, and it does not mean data has been lost. Worst case you can downgrade, dump, upgrade, load, and be done.
Sander Rijken
Well, that would be the same as centralized VCS, wouldn't you say? Making a backup of the SVN server isn't going to help if I am tracking my changes in my IDE instead of committing them to server. This is why I recommend using DVCS in a centralized manner, frequently syncing with the central server.
Tronic
+1  A: 

DVCS is very interesting for me as it:

  • adds an all new dimension to the source control process: publication.
    You do not just have a merge workflow, you also have a publication workflow (to which repository will you push to/pull from), and that can have many implication in term of:

    • development lifecycle (with repositories made only for a certain type of commits, like the one made to be released into profuctions, for deployment purposes)
    • solo tasks (you can push and update a backup repo, even in the form of just one file)
    • inter-dependencies project (when a team of project A is waiting for team porject B to finally commit to the central repo, it may resort to ask B to "pass" an intermediate development as an attached zip file in a mail. Now, all that A has to do is add B repo as a potential remote, fetch it and have a peek)
  • brings a new way of producing/consuming revisions with:

    • a passive way of producing new revisions (only the one which are actively pulling from your repo will see them in their branches)
    • an active way of consuming revisions from others (by adding their repo as remote and fetching/merging what you need from them).

That means you do not depend on other delivering their work to a central repo but that you can have a more direct relationship with different actors and their repos.

VonC
+1  A: 

If you don't see the value of local history or local builds, then I'm not sure than any amount of question-answering is going to change your mind.

The history features of IDE's are limited and clumsy. They are nothing like the full function.

One good example of how this stuff gets used is on various Apache projects. I can sync up a git repo to the Apache svn repo. Then I can work for a week in a private branch all my very own. I can downmerge changes from the repo. I can report on my changes, retail or wholesale. And when I'm done, I can package them up as one commit.

bmargulies
@bmarguliesIntelliJ IDEA provides excellent local history and diff, have a look at `http://www.jetbrains.com/idea/features/local_history.html` if you do not have any first-hand experience.
ring bearer
@ring bearer I'm perfectly aware of what it does and doesn't do, I've used it. It doesn't do a command line to show me the diffs across an entire tree, just to name one. It doesn't sync remote branches and allow merges.
bmargulies
Now we are mixing up here. What I said is why? why? on earth I need local history via distributed version control?I manage by local history on IDE, then merg/check in /diff using my version control(cvs/svn .. )client(or IDE Plugin)
ring bearer
@bmargulies You've actually just pointed out the FLAW with a DVCS model. You can pull down your changes, and work in isolation for a week, and then submit some massive update to the "main" repo that no-one has reviewed or commented on. http://blog.red-bean.com/sussman/?p=20 (There is also the issue of your local hard drive crashing and taking a week's worth of work with it.)(
msemack
This is stupid. If it doesn't solve a problem for you: **don't use it**. Don't try to tell me that it doesn't solve a problem for me.
bmargulies
+1  A: 

Hi there. Interesting question.

I'm not a seasoned DVCS user but my limited exposure has felt very positive.

I love being able to 2-step commit. It suits me.

Some advantages that spring to mind:

  1. Better merge support. Branch-Merge feels more like a 1st class citizen in DVCS, whereas in my experience of centralised solutions, I've found it to be painful and tricksy. Merge tracking is now available in svn, but it's still slow and cumbersome.

  2. Large teams. DVCS is not only for single-user commits. You can push & pull commits between teams before contributing back to the master repository (or not). This is invaluable for certain flavours of collaboration.

  3. when working on experimental functionality, it makes sense to commit frequently, but only for the short-term. I don't want always to branch the main codebase, so it's nice to be able to play & re-record. Similarly, I can see it being useful when working with Continuous Integration. If I am working for days on refactoring efforts, I may break builds for an unacceptable timeframe, but I still want to keep track of my changes.

Note that my DVCS experience is more with Mercurial than with Git. Coming from a CVS/SVN background, I've found the learning curve much easier with Mercurial (Hg). Recently-added Google Code support for Mercurial is also a boon. ... I'll even go as far as to say, that my initial response to Git was negative, but more from a usability perspective than anything to do with DVCS

amir75
A: 

It might be interesting to note that Subversion will probably be getting things like offline commits in the future. Of course we can't really compare those features to what's available today, but it might be a very good way to "use DVCS in a centralized manner" as described in other answers here.

Another recent post states that Subversion is not trying to become a DVCS

These things will probably mean that the repository is still centralized, meaning you can't do disconnected branching, diffing of old versions, but you can queue up commits.

Sander Rijken
+2  A: 

Reliability

If your harddisk silently starts corrupting data, you damn well want to know about it. Git takes SHA1 hashes of everything you commit. You have 1 central repo with SVN and if its bits get silently modified by a faulty HDD controller you won't know about it till it's too late.

And since you have 1 central repo, you just blew your only lifeline.

With git, everyone has an identical repo, complete with change history, and its content can be fully trusted due to SHA1's of its complete image. So if you back up your 20 byte SHA1 of your HEAD you can be certain that when you clone from some untrusted mirror, you have the exact same repo you lost!

Branching (and namespace pollution)

When you use a centralised repo, all the branches are there for the world to see. You can't make private branches. You have to make some branch that doesn't already collide with some other global name.

"test123 -- damn, there's already a test123. Lets try test124."

And everyone has to see all these branches with stupid names. You have to succumb to company policy that might go along the lines of "don't make branches unless you really need to", which prevents a lot of freedoms you get with git.

Same with committing. When you commit, you better be really sure your code works. Otherwise you break the build. No intermediate commits. 'Cause they all go to the central repo.

With git you have none of this nonsense. Branch and commit locally all you want. When you're ready to expose your changes to the rest of the world, you ask them to pull from you, or you push it to some "main" git repo.

Performance

Since your repo is local, all the VCS operations are fast and don't require round trips and transfer from the central server! git log doesn't have to go over the network to find a change history. SVN does. Same with all other commands, since all the important stuff is stored in one location!

Watch Linus' talk for these and other benefits over SVN.

Alex
Note that in modern versions of the SVN LOG command, the results are cached, so the command doesn't necessarily need to go over the network to find change history.
William Leara
+4  A: 

I have been where you are now, sceptical of the uses of distributed version control. I had read all the articles and knew the theoretical arguments, but I was not convinced.

Until, one day, I typed git init and suddenly found myself inside a git repository.

I suggest you do the same -- simply try it. Begin with a small hobby project, just to get the hang of it. Then decide if it's worth using for something larger.

Thomas
A: 

Most likely, no one will sell you anything here. If you need git's features, just git init. If it does not fits for you, just don't.

If you don't know git features yet, type git vs (note the ending space) in the Google search, and see the results from the autocomplete.

I preferred Notepad over IDE until I needed Netbeans features. Seems that this is the same case here.

As you know, there were many successful projects without VCS at all.

PS. Selling git violates its license! ;)

takeshin