M76 schrieb am 28.07.2020 23:15:
Mich würde mal von Kennern beider Systeme interessieren, warum das vermutlich so ist. Ist Git tatsächlich so viel besser, flexibler oder eingängiger? Gibt es evt. irgendwo einen Vergleich, der das sauber ausarbeitet?
Beide VCS sehen von den internen Datenstrukturen und Konzepten sehr ähnlich aus (beides Merckle-Trees [Blockchain! Blockchain!], beide sehen die Welt als Snapshots, die Geschichte wird über Referenzen der Vorgängerversion in einem Commit ausgedrückt). Die Features der Beiden sind auch ähnlich, wobei Mercurial die destruktiven Features (z.B. rebase, mq und strip) in der Vorgabekonfiguration ausgeschaltet hat. Obwohl diese durch das Bearbeiten von ~/.hgrc eingeschaltet werden können, habt dies Mercurial den Ruf eingebracht, weniger Features im Vergleich zu Git zu haben.
Die Ähnlichkeiten gehen so weit, dass es eine Bidirektionale hg<->git Brücke gibt, die die Commits beider VCS ineinander Transformieren kann.
Features, die nur Git hat:
* git fast-export/fast-import: Das Repository kann als Textdatei exportiert, und grundlegend umgearbeitet werden. War für mich bei der Umstellung von Subversion zu Mercurial für Problemrepos sehr hilfreich (svn -> git svn clone -> git fast-export -> Magie -> git fast-import -> hg clone ../import.git). Im Prinzip hat auch Mercurial diesen Mechanismus, dort bin ich aber ständig in Probleme gelaufen.
* Octopus merge: Ein Mercurial-Commit kann 0, 1 oder 2 Eltern haben, ein git-commit beliebig viele
* Destruktives Push: ein git push -f kann Commits auf einen entferntem Repo ersetzen oder löschen, bei Mercurial ist dies nicht möglich.
Features, die es nur bei Mercurial gibt:
* feste Zweignamen in den Commit-Metadaten: Wenn mit benannten Zweigen gearbeitet wird, wird der Zweigname mit aufgezeichnet. Wir haben das in unserer Arbeitsgruppe verwendet, und es war recht angenehm, in der Projektgeschichte die einzelnen Zweige auf einem Blick auseinanderhalten zu können. In meiner jetzigen Arbeitsgruppe bauen wir dies nach, indem der Zweigname am Anfang in die Commit-Nachricht geschrieben wird
* eingebauter Webserver (hg serve), der einen Blick auf ein lokales Repo ermöglicht, und einen ad-hoc Austausch mit anderen ermöglicht (z.B. Road-warrior ohne Zugriff auf zentrale Infrastruktur). Git hat mit instaweb die Möglichkeit, ein gitweb zu konfigurieren. Allerdings ist gitweb dem mercurial webserver nicht ebenbürtig (Benötig weitere Software, kein Commit-graph, keine Clone- und Pushmöglichkeit)
* Versionierte Tags: Es ist nicht möglich, nachträglich ein Tag zu ändern oder löschen, ohne dass dies in der Projektgeschichte auffällt. Auch ist ersichtlich, wer ein Tag angelegt hat.