Mercurial

Preview:

DESCRIPTION

Mercurial ist ein in Python geschriebenes Revision Control System. Befehle und Funktionen sind einfach zu erlernen. Da es unabhängig vom einem Server arbeitet kann jeder lokal und auch ohne Internetverbindung Dokumente oder Quellcode damit verwalten. Trotzdem können Mercurial Repositories untereinander Informationen austauschen und so auch über weite Entfernungen zusammen arbeiten. Mercurial ist komplett in Python geschrieben und lässt sich so einfach erweitern. Viele bekannte Open Source Projekte setzen Mercurial ein. So zum Beispiel Aptitude, Dovecot, Gajim, Mozilla, OpenOffice, Python, Vim oder Xen.

Citation preview

MercurialEin verteiltes VersionskontrollsystemMarkus Zapke-Gründemann

Ubucon 2010 Leipzig

Markus Zapke-Gründemann

Softwareentwickler seit 2001

Schwerpunkt: Web Application Development mit Python und Django

Freier Softwareentwickler und Berater seit 2008

www.keimlink.de

Übersicht

Verteilte Versionskontrollsysteme

Mercurial

Arbeiten mit Mercurial

Workflows

Links

Wer benutzt ein zentrales Versionskontrollsystem?

(CVS, SVN)

Wer arbeitet mit einemverteilten

Versionskontrollsystem?

Wer hat noch nie einVersionskontrollsystem

benutzt?

Verteilte Versionskontrollsysteme

Kein zentrales Repository nötig (aber möglich)

Jeder Client hat ein eigenes Repository

Viele Operationen sind schneller als bei einem zentralen Repository

Führt zu anderen Entwicklungsmodellen

Mercurial

Verteiltes Versionskontrollsystem

Mercurial v0.1 im April 2005

Fast vollständig in Python geschrieben

Plattformunabhängig

Erweiterbar (Extensions)

Einfach zu erlernen

Open Source (GNU GPL 2)

Mercurial (technisch)

Version 0.1 unter 600 SLOC Python

Version 1.6.4 hat 43.711 SLOC Python (71.666 total)

Changesets/Patches

SHA-1 Hashes

Netzwerkzugriffe via HTTP oder SSH

Mercurial-Nutzer

Adium

Aptitude

Dovecot

Gajim

Google

MoinMoin

Mozilla

NetBeans

Python

RabbitMQ

Vim

Xen

hg

Mercurial einrichten

$ vim ~/.hgrc

$ cat ~/.hgrc[ui]username = Markus Zapke-Gründemann <info@keimlink.de>

Ein Repository einrichten$ mkdir projekt

$ cd projekt

$ hg init

$ vim README

$ hg status? README

$ hg addadding README

$ hg stA README

$ hg commit -m "Erster Commit."

Unterschiede feststellen

$ ls -A.hg README

$ vim README

$ hg diffdiff --git a/README b/README--- a/README+++ b/README@@ -1,1 +1,3 @@ Neues Projekt++Zwei flinke Boxer jagen die quirlige Eva und…

Geschichte schreiben$ hg stM README

$ hg commit -m "Pangramm hinzugefügt."

$ hg logchangeset: 1:91987b4bd926tag: tipuser: Markus Zapke-Gründemann <info@keimlink.de>date: Fri Oct 15 12:28:26 2010 +0200summary: Pangramm hinzugefügt.

changeset: 0:3c1440dc196cuser: Markus Zapke-Gründemann <info@keimlink.de>date: Fri Oct 15 12:15:08 2010 +0200summary: Erster Commit.

Zeitreisen I$ hg logchangeset: 3:70e6670ff187tag: tipuser: Markus Zapke-Gründemann <info@keimlink.de>date: Fri Oct 15 12:37:31 2010 +0200summary: Lorem ipsum.

changeset: 2:55069244c9a4user: Markus Zapke-Gründemann <info@keimlink.de>date: Fri Oct 15 12:36:20 2010 +0200summary: Markup hinzugefügt.

changeset: 1:91987b4bd926user: Markus Zapke-Gründemann <info@keimlink.de>date: Fri Oct 15 12:28:26 2010 +0200summary: Pangramm hinzugefügt.

changeset: 0:3c1440dc196cuser: Markus Zapke-Gründemann <info@keimlink.de>date: Fri Oct 15 12:15:08 2010 +0200summary: Erster Commit.

Zeitreisen II

$ hg identify 70e6670ff187 tip

$ hg identify -n3

$ hg update -r 11 files updated, 0 files merged, 0 files removed, 0 files unresolved

$ hg identify -ni91987b4bd926 1

$ hg up tip1 files updated, 0 files merged, 0 files removed, 0 files unresolved

Zusammenfassung$ hg init # Repository erstellen

$ hg status # Status des Repositories ausgeben

$ hg st # Alias für status

$ hg add # Dateien hinzufügen

$ hg diff # Unterschiede ausgeben

$ hg commit # Commit der hinzugefügten Dateien

$ hg log # Geschichte anzeigen

$ hg identify # Revision identifizieren

$ hg update -r REV # Zu einer Revision wechseln

$ hg up -r REV # Alias für update

Weitere wichtige Befehle

$ hg help # Hilfe ausgeben

$ hg help COMMAND # Hilfe zu einem Befehl anzeigen

$ hg copy SOURCE DEST # Eine Datei kopieren

$ hg cp SOURCE DEST # Alias für copy

$ hg remove FILE # Eine Datei löschen

$ hg rm FILE # Alias für remove

$ hg mv SOURCE DEST # Eine Datei verschieben

$ hg revert FILE # Eine Revision wieder herstellen

$ hg annotate FILE # Informationen zu jeder Zeile

HTTP-Server

$ hg servelistening at http://host.local:8000/ (bound to *:8000)

$ hg clone http://host.local:8000/ projektupdating to branch default1 files updated, 0 files merged, 0 files removed, 0 files unresolved

Separate Clones I

projekt $ cd ..

$ hg clone projekt projekt-cloneupdating to branch default1 files updated, 0 files merged, 0 files removed, 0 files unresolved

$ cd projekt-clone/

projekt-clone $ ls -A.hg README

projekt-clone $ cat .hg/hgrc [paths]default = /Users/zappi/projekt

Separate Clones II

projekt-clone $ hg outcomparing with /Users/zappi/projektsearching for changeschangeset: 4:7b61da41bfceuser: Markus Zapke-Gründemann <info@keimlink.de>date: Fri Oct 15 13:40:52 2010 +0200summary: Weitere Überschrift hinzugefügt.

changeset: 5:7678996dbc36tag: tipuser: Markus Zapke-Gründemann <info@keimlink.de>date: Fri Oct 15 13:41:24 2010 +0200summary: Markup für Überschrift hinzugefügt.

Separate Clones III

projekt-clone $ hg incomparing with /Users/zappi/projektsearching for changeschangeset: 4:4347c2e33c9euser: Markus Zapke-Gründemann <info@keimlink.de>date: Fri Oct 15 13:46:24 2010 +0200summary: Text von Kafka eingefügt.

changeset: 5:876ee0430735tag: tipuser: Markus Zapke-Gründemann <info@keimlink.de>date: Fri Oct 15 13:47:02 2010 +0200summary: Überschrift hinzugefügt.

Separate Clones IVprojekt-clone $ hg pullpulling from /Users/zappi/projektsearching for changesadding changesetsadding manifestsadding file changesadded 2 changesets with 2 changes to 1 files (+1 heads)(run 'hg heads' to see heads, 'hg merge' to merge)

projekt-clone $ hg headschangeset: 7:876ee0430735tag: tipuser: Markus Zapke-Gründemann <info@keimlink.de>date: Fri Oct 15 13:47:02 2010 +0200summary: Überschrift hinzugefügt.

changeset: 5:7678996dbc36user: Markus Zapke-Gründemann <info@keimlink.de>date: Fri Oct 15 13:41:24 2010 +0200summary: Markup für Überschrift hinzugefügt.

Separate Clones Vprojekt-clone $ hg glog -r 4:o changeset: 7:876ee0430735| tag: tip| user: Markus Zapke-Gründemann <info@keimlink.de>| date: Fri Oct 15 13:47:02 2010 +0200| summary: Überschrift hinzugefügt.|o changeset: 6:4347c2e33c9e| parent: 3:70e6670ff187| user: Markus Zapke-Gründemann <info@keimlink.de>| date: Fri Oct 15 13:46:24 2010 +0200| summary: Text von Kafka eingefügt.|| @ changeset: 5:7678996dbc36| | user: Markus Zapke-Gründemann <info@keimlink.de>| | date: Fri Oct 15 13:41:24 2010 +0200| | summary: Markup für Überschrift hinzugefügt.| || o changeset: 4:7b61da41bfce|/ user: Markus Zapke-Gründemann <info@keimlink.de>| date: Fri Oct 15 13:40:52 2010 +0200| summary: Weitere Überschrift hinzugefügt.|

Separate Clones VIprojekt-clone $ cd ../projektprojekt $ hg glog -r 3:@ changeset: 5:876ee0430735| tag: tip| user: Markus Zapke-Gründemann <info@keimlink.de>| date: Fri Oct 15 13:47:02 2010 +0200| summary: Überschrift hinzugefügt.|o changeset: 4:4347c2e33c9e| user: Markus Zapke-Gründemann <info@keimlink.de>| date: Fri Oct 15 13:46:24 2010 +0200| summary: Text von Kafka eingefügt.|o changeset: 3:70e6670ff187| user: Markus Zapke-Gründemann <info@keimlink.de>| date: Fri Oct 15 13:37:31 2010 +0200| summary: Lorem ipsum.|

Separate Clones VII

projekt $ cd ../projekt-cloneprojekt-clone $ hg mergemerging README0 files updated, 1 files merged, 0 files removed, 0 files unresolved(branch merge, don't forget to commit)

projekt-clone $ hg commit -m "Merge mit Eltern-Klon."

projekt-clone $ hg heads changeset: 8:7f6e7b845983tag: tipparent: 5:7678996dbc36parent: 7:876ee0430735user: Markus Zapke-Gründemann <info@keimlink.de>date: Fri Oct 15 14:10:32 2010 +0200summary: Merge mit Eltern-Klon.

Separate Clones VIIIprojekt-clone $ hg glog -r 4:@ changeset: 8:7f6e7b845983|\ tag: tip| | parent: 5:7678996dbc36| | parent: 7:876ee0430735| | user: Markus Zapke-Gründemann <info@keimlink.de>| | date: Fri Oct 15 14:10:32 2010 +0200| | summary: Merge mit Eltern-Klon.| || o changeset: 7:876ee0430735| | user: Markus Zapke-Gründemann <info@keimlink.de>| | date: Fri Oct 15 13:47:02 2010 +0200| | summary: Überschrift hinzugefügt.| || o changeset: 6:4347c2e33c9e| | parent: 3:70e6670ff187| | user: Markus Zapke-Gründemann <info@keimlink.de>| | date: Fri Oct 15 13:46:24 2010 +0200| | summary: Text von Kafka eingefügt.| |o | changeset: 5:7678996dbc36| | user: Markus Zapke-Gründemann <info@keimlink.de>| | date: Fri Oct 15 13:41:24 2010 +0200| | summary: Markup für Überschrift hinzugefügt.| |o | changeset: 4:7b61da41bfce|/ user: Markus Zapke-Gründemann <info@keimlink.de>| date: Fri Oct 15 13:40:52 2010 +0200| summary: Weitere Überschrift hinzugefügt.|

Separate Clones IXprojekt-clone $ hg outcomparing with /Users/zappi/projektsearching for changeschangeset: 4:7b61da41bfceuser: Markus Zapke-Gründemann <info@keimlink.de>date: Fri Oct 15 13:40:52 2010 +0200summary: Weitere Überschrift hinzugefügt.

changeset: 5:7678996dbc36user: Markus Zapke-Gründemann <info@keimlink.de>date: Fri Oct 15 13:41:24 2010 +0200summary: Markup für Überschrift hinzugefügt.

changeset: 8:7f6e7b845983tag: tipparent: 5:7678996dbc36parent: 7:876ee0430735user: Markus Zapke-Gründemann <info@keimlink.de>date: Fri Oct 15 14:10:32 2010 +0200summary: Merge mit Eltern-Klon.

Separate Clones X

projekt-clone $ hg pushpushing to /Users/zappi/projektsearching for changesadding changesetsadding manifestsadding file changesadded 3 changesets with 3 changes to 1 files

projekt-clone $ cd ../projekt

Separate Clones XIprojekt $ hg glog -r 4:o changeset: 8:7f6e7b845983|\ tag: tip| | parent: 7:7678996dbc36| | parent: 5:876ee0430735| | user: Markus Zapke-Gründemann <info@keimlink.de>| | date: Fri Oct 15 14:10:32 2010 +0200| | summary: Merge mit Eltern-Klon.| || o changeset: 7:7678996dbc36| | user: Markus Zapke-Gründemann <info@keimlink.de>| | date: Fri Oct 15 13:41:24 2010 +0200| | summary: Markup für Überschrift hinzugefügt.| || o changeset: 6:7b61da41bfce| | parent: 3:70e6670ff187| | user: Markus Zapke-Gründemann <info@keimlink.de>| | date: Fri Oct 15 13:40:52 2010 +0200| | summary: Weitere Überschrift hinzugefügt.| |@ | changeset: 5:876ee0430735| | user: Markus Zapke-Gründemann <info@keimlink.de>| | date: Fri Oct 15 13:47:02 2010 +0200| | summary: Überschrift hinzugefügt.| |o | changeset: 4:4347c2e33c9e|/ user: Markus Zapke-Gründemann <info@keimlink.de>| date: Fri Oct 15 13:46:24 2010 +0200| summary: Text von Kafka eingefügt.|

Separate Clones XII

projekt $ hg identify -ni876ee0430735 5

$ hg up1 files updated, 0 files merged, 0 files removed, 0 files unresolved

$ hg identify -ni7f6e7b845983 8

Zusammenfassung

$ hg serve # Webserver starten

$ hg clone # Repository klonen

$ hg out # Changesets ausgeben, die zum Eltern-Klon gehen

$ hg in # Changesets ausgeben, die vom Eltern-Klon kommen

$ hg pull # Changesets vom Eltern-Klon holen

$ hg heads # Köpfe anzeigen

$ hg glog # Geschichte als Baum (graphlog Extension)

$ hg merge # Zwei Revisionen zusammenführen

$ hg push # Changesets zum Eltern-Klon senden

graphlog Extension

$ vim ~/.hgrc

$ cat ~/.hgrc[ui]username = Markus Zapke-Gründemann <info@keimlink.de>

[extensions]graphlog =

Mercurial Workflows I

Mit „named branches“ arbeiten

branch / update / merge / commit

Tags nutzen

tag / tags

Mercurial Workflows II

Code ohne zentrales Repository austauschen

export / import

bundle / unbundle

clone / push / pull

History manipulieren

backout

clone / export / import

Links

http://mercurial.selenic.com/

http://hgbook.red-bean.com/

http://hginit.com/

http://mercurial.selenic.com/wiki/QuickReferenceCardsAndCheatSheets

http://bitbucket.org/

LizenzDieses Werk ist unter einem

Creative CommonsNamensnennung-Weitergabe unter gleichen Bedingungen

3.0 Unported Lizenzvertraglizenziert.

Um die Lizenz anzusehen, gehen Sie bitte zu http://creativecommons.org/licenses/by-sa/3.0/

oder schicken Sie einen Brief anCreative Commons,

171 Second Street, Suite 300,San Francisco, California 94105, USA.

Recommended