Versionsverwaltung mit mercurial
@copyright: 2008-2009 ReimarBauer
@license: GPL
Sachverhalt
Unter einer Versionsverwaltung versteht man ein System, welches typischerweise in der Softwareentwicklung zur Versionierung und um den gemeinsamen Zugriff auf Quelltexte zu kontrollieren, eingesetzt wird.
Hierzu werden alle laufenden Änderungen erfasst und alle Versionsstände der Dateien in einem Archiv mit Zeitstempel und Benutzerkennung gesichert.
mercurial
ist ein plattformunabhängiges, verteiltes Versionskontrollsystem zur Software-Entwicklung, wobei es auch für andere Bereiche eingesetzt werden kann.
Es wurde in Python entwickelt, verwendet allerdings eine binäre diff-Implementierung, die in C geschrieben wurde.
Mercurial wird primär über die Kommandozeile benutzt.
Alle seine Befehle beginnen mit hg, einen Verweis auf das chemische Symbol für Quecksilber.
Mercurial benötigt keinen Server. Ein einziger Befehl reicht aus, um ein normales Verzeichnis unter die Kontrolle von Mercurial zu stellen: hg init
Installation von mercurial
Da mercurial im cheese shop liegt bietet es sich an:
$ easy_install -U mercurial
Hilfe
$ hg Mercurial Distributed SCM basic commands: add add the specified files on the next commit annotate show changeset information per file line clone make a copy of an existing repository commit commit the specified files or all outstanding changes diff diff repository (or selected files)
Beispiel
Das Repository wird vollständig in einem einzigen Unterverzeichnis .hg verwaltet. Mit hg add kann man alle Dateien für die Verwaltung im Repository anmelden. Mit hg commit checkt man eine Version des Projektes ein.
$ cd projekt $ hg init # erstellt das .hg-Verzeichnis im aktuellen Verzeichnis $ hg add # alle Dateien beim Repository anmelden adding foo adding bar/baz $ hg commit -m "Projekt Version 0.1 importiert"
Kontrolle
$ hg log changeset: 0:c2c6bcd0ecd4 tag: tip user: Reimar Bauer <R.Bauer AT whereeveriam DOT de> date: Sun Jun 15 22:31:03 2008 +0200 summary: Projekt Version 0.1 importiert
Konfiguration
Dein Name
Editiere ~/.hgrc oder %USERPROFILE%\mercurial.ini und füge hinzu:
[ui] username=My Name <my address>
push (Erlaubnis für einen zentralen Server)
(Dein ssh key muss auf dem Server vorliegen.) Editiere .hg/hgrc Deines Repository / Clones und füge eine Zeile für das pushen hinzu.
default-push = ssh://hg-USER@URL/MAIN
Schema
master repository (zentraler Server)
enthält das Haupt repository des Projekts (URL).
von diesem repository erstellt man den ersten clone und beginnt dann mit den Änderungen
$ hg clone http://hg.moinmo.in/moin/1.9/ moin-1.9
bzw.
$ hg clone ssh://hg@hg.moinmo.in/moin/1.9/ moin-1.9
pull holt von hier die Änderungen
-u führt auch das update direkt aus
push spielt Deine Änderungen dort ein
working repository
Dein Clone (können auch mehrere beim Einzelnen sein)
ist Dein clone des main repository
- hier kochst Du Deine eigene Suppe
- implementierst features
- bug fixes
- überarbeitest (refactor)
- probierst aus
Wenn Du fertig bist kannst Du Deine Änderungen mit commit in Deinem repository in einer Revision speichern und mit push in das main repository übertragen. Erst mit dem push stehen dann Deine Änderungen den anderen Entwicklern zur Verfügung.
Änderungen im öffentlichen Repository verfolgen
Wenn im öffentlichen Repository neue Changesets verfügbar sind, können die dortigen Änderungen zu den eigenen hinzugemischt (merge) werden.
Der Befehl zum Holen von Änderungen heisst hg pull und benutzt die beim ersten clone-Befehl verwendete Adresse, sofern nichts anderes angegeben wird.
Durch den pull-Befehl wird nur das Repository (.hg-Verzeichnis) beeinflusst. Das Arbeitsverzeichnis wird nicht aktualisiert, hierzu dient der Befehl hg update (oder kurz hg up).
hg pull -u macht dies in einem Schritt
Arbeiten mit dem clone
- Änderungen machen
hg diff (zum Anschauen)
ok, dann hg commit -m"sinnvoller text"
doch nicht so gut, hg revert MEINEDATEI
- es ist alles nur bei Dir, und Du bist jetzt mit einer Aufgabe fertig
hg pull -u
- jemand anderes hat zwischenzeitlich was gemacht.
- evtl. ein drei Wege diff und merge, weil man die gleiche Datei in der gleichen Zeile verändert hat
- keine merge Konflikte
Du kannst Deine Änderungen mit hg push aufspielen
- jemand anderes hat zwischenzeitlich was gemacht.
changeset/patch regeln
- nur zusammengehörende Änderungen in ein changeset
- möglichst kleine Einheiten
- überarbeiten nicht mit neuem vermischem
Quellen
Ende
Danke für die Aufmerksamkeit!