Dennis Heidsiek wrote:

> Stimmt, aus der (zeitlichen) Distanz wirkt das teilweise doch etwas
> übertrieben, aber die waren halt mit Herzblut bei der Sache … und jede
> Zeit hat ja sowieso ihre eignen Glaubenskriege, ich nenne jetzt einfach
> mal hg vs. git ;).

Oh ja ;) 


>>   (deutlich leichter für SVN Nutzer zu verwenden¹),
> 
> Würde ich nicht mehr sagen, die beiden sind sich auch in der Bedienung
> doch sehr ähnlich – siehe Vortrag.

Ich selbst habe mir inzwischen schon mehrfach mit git bei Standardaufgaben 
böse in den Fuß geschossen (soweit, dass ich neu klonen musste), mit 
Mercurial dagegen noch nie. 

Und Mercurial bedient sich grundlegend wie Subversion, wenn man im Kopf 
behält, dass commit nur lokal wirkt und pull/push neue Änderungen holen bzw. 
rausschicken. 

> Ansonsten verweise ich auf:
> http://www.whygitisbetterthanx.com/

Als Gegenpunkt zur besseren Lernbarkeit: 


### Git ###

$ git version
git version 1.6.4.4



$ git checkout -h
fatal: Not a git repository (or any of the parent directories): .git

(Warum keine Hilfe?)



$ git checkout --help
…(man page)…
NAME
       git-checkout - Checkout a branch or paths to the working tree

SYNOPSIS
           git checkout [-q] [-f] [-m] [<branch>]
           git checkout [-q] [-f] [-m] [-b <new_branch>] [<start_point>]
           git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-
ish>] [--] <paths>...
…
       When <paths> are not given, this command switches branches…

       If -b is given, a new branch is created and checked out, as if 
       git-branch(1) were called…

       When <paths> are given, this command does not switch branches…In this 
       case, the -b and --track options are meaningless and giving either of 
       them results in an error…
…



$ git pull -h
Usage: git pull [-n | --no-stat] [--[no-]commit] [--[no-]squash] [--[no-]ff] 
[-s strategy]... [<fetch-options>] <repo> <head>...

Fetch one or more remote refs and merge it/them into the current HEAD.




### Mercurial ###

$ hg version
Mercurial Distributed SCM (version 1.5.2)

Copyright (C) 2005-2010 Matt Mackall <m...@selenic.com> und andere
Dies ist freie Software; siehe Quellen für Kopierbestimmungen. Es besteht
KEINE Gewährleistung für das Programm, nicht einmal der Marktreife oder der
Verwendbarkeit für einen bestimmten Zweck.



$ hg update -h
hg update [-c] [-C] [-d DATUM] [[-r] REV]

Aliase: up, checkout, co

Aktualisiert das Arbeitsverzeichnis

    Hebt das Arbeitsverzeichnis auf die angegebene Revision an.

    Wird keine Revision angegeben, wird zum Kopf des derzeitigen Zweigs 
    aktualisiert, falls dieser ein Nachfahr des direkten
    Vorgängers der Arbeitskopie ist. Ansonsten bricht die Operation ab.
…
Optionen:

 -C --clean  Entferne nicht versionierte Änderungen (kein Backup)
…



$ hg pull -h
hg pull [-u] [-f] [-r REV]... [-e CMD] [--remotecmd CMD] [QUELLE]

Holt Änderungen aus dem angegebenen Projektarchiv

    Überträgt Änderungen aus einem entfernten Archiv in das lokale.

    Dabei werden alle Änderungen vom Archiv am angegebenen Pfad oder URL 
    gesucht und dem lokalen Archiv hinzugefügt.
    Standardmäßig wird die Kopie des Projektes im Arbeitsverzeichnis nicht 
    aktualisiert.
…



> Wie schon auf Identi.ca gesagt, haben die GitHuber ein Plugin
> geschrieben, mit der ein Hg-Client mit einem Git-Repository arbeiten
> kann, schon von daher würde ich bei Neo eher zu einem Git-Repo
> tendieren, dann kann jeder den Client benutzen, der ihm am besten passt
> :).  Leider haben die Bitbucker noch kein Hg-Plugin für Git geschrieben …

Doch: Das Mercurial Plugin funktioniert auch in die andere Richtung: Du 
kannst einfach mit Mercurial clonen, in dem hg repo ein Git repo erzeugen 
(hg gexport) und dann mit git von da ziehen. 

→ Details: http://mercurial.selenic.com/wiki/HgGit

Es funktioniert also in jede Richtung – und Mercurial baut auf jedem System 
auf dem auch git baut (Mercurial ist in Python[¹] geschrieben, so dass es 
überall läuft wo es Python gibt – also fast überall). 

¹: plus ein paar kleine, portable C Erweiterungen

> Ist doch schön, dann steckst Du doch in der Materie :). Und ich verhehle
> auch nicht, dass meine Sympatien eher bei Git liegen (obwohl ich am
> Anfang auch eher zu Mercurial tendierte, da es da einen schöneren und
> einfacheren Windows-Installer hatte … aber inzwischen finde ich die
> Git-Datenstruktur doch ziemlich elegant :)).

Für mich ist seltsamerweise gerade die Datenstruktur ein Grund Mercurial zu 
nutzen. Es verwendet zwar auch Patches, speichert sie aber in einem 
Dateibaum, der bessere Zugriffssemantiken bietet (Festplatten-seeks 
vermeiden) und nutzt snapshots (wie in Videokomprimierung), um den Zugriff 
zu beschleunigen. 

→ http://hgbook.red-bean.com/read/behind-the-scenes.html

Das ist optimiert für das, was ich damit machen will, also 
Versionsverwaltung. Und das gleiche gilt für das UI von Mercurial, seine 
Hilfe usw.

Konzeptuell passiert dasselbe, aber das Datenformat von Mercurial ist meinem 
Meinung nach einfach eleganter als einzelne patches zu speichern (mit 
Metadaten, welcher wohin gehört) und dann und wann zu packen. Es zeigt die 
gleiche Sorgfalt und Klarheit, die ich auch sonst in Mercurial sehe (und die 
Git meinem Eindruck nach fehlt). 

Liebe Grüße, 
Arne

Antwort per Email an