git vs Mercurial

Jag har mest praktisk erfarenhet av Mercurial (eller hg) – har kört det hos kund ett par år i projekt med flera team, många komponenter och många repon. Det funkar felfritt. Eclipse-pluginen har inga allvarliga buggar, gör det mesta och med lite kärlek så kan man köra cygwin ihop med det och nästan känna sig obehindrad. (doit.py är dock smidig när man hela tiden jobbar i flera repon och behöver göra in/out/commit/push/pull – ett script som kör ett kommando i flera kataloger samtidigt och sedan visar resultatet.)

Ändå föredrar jag git, i huvudsak på grund av en enda sak: hg har en designmiss kring brancher som gör att det blir halvt omöjligt att få till ett arbetsflöde likt git flow.

Git har också brister. Sitter man på Windows kan det (tydligen) problem med icke-ASCII-tecken i filnamn t ex, och oavsett om man kör GitExtensions eller msysGit så är det inte en “riktig” Linuxmiljö som git kör i. Sannolikheten är att man snart hamnar i konsollen ändå.

För Java-världen kommer det tack vara att Eclipse väljer att standardisera på git snart vara ett enkelt val – git-pluginen (egit+jgit) kommer helt enkelt få så mycket mer uppmärksamhet än hg-pluginen och därigenom fungera så mycket bättre.

För dotnet-världen är jag inte säker på vad som kommer hända. Jag tycker att det är solklart att git (mycket tack vare github) är den som vinner den stora massan, medan hg och bitbucket är stark tvåa. TortoiseHg vet jag är stabil och kompetent. TortoiseGit har jag aldrig beblandat mig med eftersom jag inte behövt köra git på Windows. De testskott jag gjort har varit med GitExtensions. Det har sett bra ut tycker jag, med bara en miss egentligen. I senaste versionen verkar man tappat bort “view file history”.

Slutligen har hg bra medföljande dokumentation (i CLI:et iaf), trevligt skriven, lätt att förstå. Det samma kan inte sägas om git – det är mer stekpanna mot huvud-nivå på den, även om den är tekniskt korrekt och inte så frånvarande eller inkomplett som det var i början när git fick som mest kritik (för just dokumentation).

Git är mer flexibelt, kräver lite mer av användaren. Hg har en designmiss men fungerar i övrigt klockrent. Båda är mycket kompetenta distribuerade versionshanteringssystem (DVCS).

Lite länkar

Popularitet på stackoverflow En Git vs hg-tråd Bra bloginlägg om tekniska skillnader Samma skillnader och budskap, annan paketering

Git-kurs

Git LogoJag har idag hållt en liten kurs (3 timmar) som introducerat utvecklare till Git och distribuerad versionshantering. Deltagarna jobbar dagligen i Windows och Visual Studio och trots att det inte är min dagliga hemvisst så flöt allt på bra, Git Extensions fungerade fint t ex och ingen av deltagarna fastnade på nyckelhantering eller andra “vanliga” uppstartsproblem.

Följande ämnen hanterades:

  • Grunderna: Vad är versionshantering egentligen? Vad är skillnaden mellan centraliserad och decentraliserad versionshantering? Vad är speciellt för Git?
  • Versionshanteringens bitar: blob, tree, commit, tag, branch. Repo, index, staging area och arbetsmapp
  • Installation, grundkonfigurering
  • Vardagsarbetet: commit, branch, merge, push & pull, clone & init
  • Server och dela kod via SSH, GitHub, Gitorous.

Kursen är i huvudsak praktisk och inriktad på att få den som redan jobbat med centraliserad versionshanteringssystem, såsom CVS, Subversion och Microsofts SourceSafe, att komma igång.

Det finns fler ämnen att hantera – de som ingick i kursen ger basen för det dagliga arbetet och troligen behöver man inte någonsin lära sig mer om man inte är intresserad.

Sätta upp git remote i efterhand

Set up remote server

ssh git@wendt.se
mkdir $project.git
cd $project.git
git --bare init
git --bare update-server-info
chmod +x hooks/post-update #should contain git-update-server-info
$EDITOR description
./update-cloneurl.sh
logout

Push from local

git remote add origin git@wendt.se:$project.git
git push origin master
#!/bin/sh
for i in *.git ; do
	echo "http://source.wendt.se/git-repo/$i" > $i/cloneurl
done