Advanced Git tips (slides)
git-tips.heroku.com
git-tips.heroku.com
One nice thing about git vs. svn is when you reach enough mastery you can make that repo dance to your tune. At some point you and git are one and working together. SVN was always some kind of imposing, opposing force; one that I had to fool into doing my desire.
One clueless contractor could put your SVN repo into hell-and-gone. With git I told the team, "don't worry, go for it; unless you do something really strange, there's nothing you can do that I can't recover from."
So it's not totally worthless.
My current impression of Git is that it's very powerful, but too low level and not that user friendly. I am currently evaluating Mercurial, since it seems to be easier to use and more user friendly.
Anybody have experiences working with both Git and Mercurial with a team of 5-10 people?
My personal switch from SVN to Git was rather painless but that's probably because I "only" used git-svn and at first used Git pretty much like I used SVN and then step by step explored the possibilities offered by Git like local branches etc. pp.
That's what I'd recommend to anyone making the switch, first try it out with git-svn, don't use every new feature at once.
DVCS is a completely different paradigm, it requires some time to wrap your head around. :)
I dont exactly remember how I handled this the last time around, but I think some rebase-fu was needed
[1] http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-me...
[2] http://hgbook.red-bean.com/read/managing-releases-and-branch...
You might want to read the first link you gave, I think.
If you have a better idea that's similar to git[3] (1 repo), I'm waiting for it. Until then I'll complain about what Mercurial is offering me, just like Groxx and cdavid (see above).
[1] http://bitbucket.org/ciupicri/satchmo
[2] http://bitbucket.org/ciupicri/satchmo-l10n-ro
[3] http://github.com/ciupicri/cobbler/tree/master-pagination-bu...
hg branch bug-fixes
hg commit -m "creating bug fix branch"
hg update default
hg branch translations
hg commit -m "creating translations branch"
then you can just "hg update <branchname>" to do an in place switching between branches (just like git checkout).I wouldn't use 2 separate repositories for that, just one.
We've got multiple named branches at work (I also use bookmarks with development branches fairly heavily, but that's a slightly different topic).
As for bookmarks, if I understand this correctly, I have to convince upstream to use them.
With git I can create a branch in my repository and upstream can pull my changes in whatever branch it wishes too. I don't need to convince anyone to do anything else, besides accepting my patches.
I use local bookmarks for this. It lets you think of it as a branch locally (it's really a floating tag), but doesn't (automatically) get pushed out.
Heck, Mercurial users / developers / websites as much as admit it sucks. The most-recommended way to branch that I've seen is to clone the remote, never develop on that copy (a "pristine" clone), and clone that repo to make your branches, pushing back into your pristine when you're ready to upload.
Git? Just branch and code.
IOW, Git complexity comes from a f*cked-up UI, but hg simplicity is only superficial. Any semi-advanced usage in hg requires queues, a lot of plugins, etc... whereas git supports all that out of the box. Some simplicity in hg is also seriously broken - the "simple" version naming is a very bad idea in DVCS. Inevitably, different people will refer to the same revision (r1234) which is in fact a different revision because they are relative to different repositories.
Merging is also not that great in hg: I really miss git index when I need to resolve conflict. But I have a strong dislike for kdiff3 and that sort of tools.
I'm not sure where you're getting your info. Sounds like you might be still thinking that the FUD from 2008 that the only way to branch in mercurial is to clone a repo is actually true.
Check out the links in the post you replied to for more info.
Bookmarks: local only, no info ever reaches the server - ie, no label on a separate branch, it's just yet another anonymous branch.
Named branches: new head even when merged and closed, default push pushes all branches, so very difficult to use locally only if you have more than one remote branch (say, prod, qa, testing, dev. You now have to "hg push -b prod qa testing dev" just to prevent pushing your local branches. Or is it a separate push for each branch? I forget. And what if there were 20? 2000?). If you allow new remote heads, suddenly everyone will get tons of branches as you add more developers, name collisions / too many useful ones used up long ago (mybranch12a7c9?) - this is desirable how?
Anonymous: an artifact of any concurrent version control software, not a feature.
[1]: 2nd paragraph of: http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-me...
edit: summary: Git = friendly to multiple developers. Such as effectively every business environment. Mercurial = friendly to a single developer (in that case, yes, it's admittedly much easier), as long as you always push all branches.
In the article you linked to, the author is recommending against using separate cloned repositories, I agree with him.
Bookmarks: As of mercurial 1.6, bookmarks aren't local only and can be pushed.
Named branches: you don't have to push everything, just do
hg push -r .
and it will only push the current revision, and any unpushed parent revisions. The linked article mentions this and talks about aliasing it to "hg nudge". If you do that, you have the same behavior as git.I think git is a solid tool and that it can work well for many teams. I also know from personal experience at 3 different jobs that mercurial can work effectively for teams.
And I'll have to see how well bookmarks function - not sure what my work repo runs.
One thing that is essential to a good transition is to have a strong evangelist who is willing to address problems, educate people and investigate when something happens that you don't understand.
ProTip: #git on freenode is a great resource if you find yourself out of your depth.
Then we we tag and branch at the end of an iteration to push code live.
Works very well for us and seems a lot less painful than the frontend guys using SVN.
> We recently switched from SVN to Git
Part of the problem is that git is not similar to SVN in the way that SVN was similar to CVS. People have to give up their old paradigm of thinking, and it certainly helps if at least one person in your group is a git guru (or at least someone that is willing to investigate/fix problems without feeling like it is a chore) otherwise you will end up in the situation where everyone feels like the whole conversion process/idea was just a chore. If there is someone that makes themselves the 'go to guy/girl' for git issues it alleviates the rest of the group from thinking about git issues all of the time.Overall, I've found git to be marginally better than hg.
The real killer feature that git has is that git talks to github and svn. Mercurial only talks to bitbucket (sorry guys, network effects are important and github won).
I think it's worth giving both git and hg a try to see which fits your head better. Mercurial feels better to me and there are quite a few people in many communities (including most of the python community).
I've found, to a person, that once they put in the work and know how to use it, it's a rewarding and fun experience to use Git. It's not easy, though.
So, after fighting the battle for far too long I'm now rolling out git/gitorious right now, with lots of early adopters using that already, on my (properly backed up..) test machine.
The biggest issue that I've seen so far are mostly general "I just don't get scm" things (no commit message or a useless one. Working around rules by just entering space if I try to prohibit this).
The only git specific issue that come up is that the people don't understand that each user's clone/working copy is a separate branch of the origin already. If 2 guys clone from the "server", you now have 2 branches of origin/master. pull by default merges remote and local branch, which leads to a huuuuuge number of completely useless merge commands in the histories of some projects. That makes the history far less useful in my book and all visualizers now show you a large numbers of branches that you don't care about.
You can work around that by educating users to, for example, using git pull --rebase - but that is a concept that needs quite some understanding first.
Apart from the thing above the introduction seems to work fine so far and people with different background (VSS.., cvs/svn mostly) are using it without (real, major) problems.
And I'm glad that we finally will have an official scm server sometime this month, after only ~5 years of nagging. Ah, it's the small things that make me happy these days...
To override this simply use --no-rebase.
A lot of great hackers/founders are dry and boring presenters. They could learn a lot from watching him.