= Mercurial =

Mercurial ist ein dezentrales Versionskontrollsystem (VersionsVerwaltung). Es ist unter http://www.selenic.com/mercurial/wiki/ zu finden. Die Standard-Dokumentation ist auf http://hgbook.red-bean.com/read/ zu finden.

* Auf der Seite [SwingApplikation.Projektumgebung] steht ein bisschen was allgemeines zu dezentralen Versionskontrollsystemen und zu Mercurial von ThomasBayen.
* Eine Seite zu einem MercurialVersionControlServer hat JensKapitza geschrieben.
* Laut [Vergleich Mercurial vs. GIT|http://importantshock.wordpress.com/2008/08/07/git-vs-mercurial/] scheint mir Mercurial, momentan in der [Version 1.3|http://www.linux-community.de/Internal/Nachrichten/Neue-Version-1.3-von-Mercurial-unterstuetzt-Sub-Repositories], hier die passende Wahl zu sein. --MarkusMonderkamp
* Eine deutsche Erklärung zu Mercurial: http://intevation.net/~thomas/mercurial-lt2006/#id2452004 -- ThomasThiessen




== einige Mercurial-Befehle ==

  hg clone ssh://username@hg.javaproject.de/../groups/mercurial/repos/meinprojekt meinprojekt

Holt das angegebene Repository vom angegebenen Server. Es entsteht ein neues
Verzeichnis "meinprojekt", in dem man dann arbeiten kann.

Die weiteren Befehle innerhalb des Repositories ausführen:

  hg status

Zeigt von mir selber geänderte Dateien (vorne 'M') und neue Dateien (vorne '?') an.

  hg add
  
Nimmt alle neue Dateien in die Versionsverwaltung auf. Beachtet dabei
die Filter-Einstellungen in ".hgignore".
   
  hg commit -m "texttexttext"

Schreibt alle Änderungen in das lokale Repository.

  hg outgoing ssh://tbayen@hg.javaproject.de/../groups/mercurial/repos/meinprojekt

Zeigt die ausgehenden Unterschiede zwischen dem Repository auf dem Server
und meinem eigenen Repository (d.h. dem ,was ich mit commit auch eingecheckt
habe) an.

  hg incoming ssh://tbayen@hg.javaproject.de/../groups/mercurial/repos/meinprojekt

Wie outgoing, zeigt aber die neuen Änderungen auf dem Server an.

Diesen Befehl wieder eine Verzeichnisebene oberhalb des Repositories ausführen:

  hg push ssh://username@hg.javaproject.de/../groups/mercurial/repos/meinprojekt

schreibt alle Änderungen aus dem lokalen Repository in das entfernte Repository
auf dem Server hg.javaproject.de, auf dem ich einen SSH-Zugang habe. Ist das das
Repository, von dem ich mich geklont habe (der häufigste Fall), so reicht es, im
Arbeitsverzeichnis zu bleiben und

  hg push
  
zu schreiben.

Man sollte übrigens vor dem push immer sicher sein, daß sich das Repository nicht inzwischen geändert hat. Das kann man mit "incoming" prüfen und, falls es eine Änderung gibt, ggf. vorher ein "pull" und "update", ggf. gefolgt von einem "merge" und "commit" machen. Bevor man Fremde Daten in sein Repository holt, ist natürlich ein "clone" als Kopie immer eine gute Idee.



== Branches ==

Mit "hg branch" kann man in Mercurial einen Branch definieren. (Das funktioniert so ähnlich wie in Subversion.) Ein Branch ist aus der Sicht von Mercurial nichts anderes als ein Head. Er wird allerdings nicht automatisch für merges vorgeschlagen. Ein Branch hat einen Namen (z.B. einen Release-Titel), anhand dessen man erkennen kann, wofür er gut ist. Gibt man bei "hg update" einen Branchnamen an, so landet man im aktuellsten Head dieses Branches.



=== Nachträgliche Änderungen, die mehrere Branches betreffen ===

Ein Branch soll ja eigentlich Codeänderungen voneinander trennen. Natürlich gibt es auch Gründe, Änderungen in mehreren Branches vorzunehmen. Wenn ich also einen Bug habe, dessen Ursprung in der Vergangenheit liegt (also vor der Verzweigung), so gehe ich in die Version mit dem Bug zurück. Um diese festzustellen, kann ich mit

  hg annotate 

herausfinden, welche Zeile wann eingeführt bzw. das letzte Mal geändert wurde. Dann behebe ich den Bug und committe, so das ich einen neuen Head erhalte. Diesen merge ich dann mit beiden Branch-heads.


=== Branch separieren ===

Wenn man mit "clone" ein Repository klont, kann man mit der "-b" Option dafür sorgen, das man nur einen Branch in den Klon übernimmt. Das sorgt dafür, das der Klon wirklich nur Daten dieses einen Branches enthält. Man kann allerdings immer noch Änderungen zwischen den beiden Repositories austauschen.


== öffentliche Repositories ==

Wer ein Repository veröffentlichen will, kann das mit dem "serve"-Befehl machen, er kann einen SSH-Zugang für die Projekt-Mitglieder einbauen und er kann einen Dienst wie https://bitbucket.org nutzen, der es einfach erlaubt, ein öffentliches Repository aufzusetzen.


----
[{Tag VersionsVerwaltung}]