38
Mercurial Ein verteiltes Versionskontrollsystem Markus Zapke-Gründemann Ubucon 2010 Leipzig

Mercurial

Embed Size (px)

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

Page 1: Mercurial

MercurialEin verteiltes VersionskontrollsystemMarkus Zapke-Gründemann

Ubucon 2010 Leipzig

Page 2: Mercurial

Markus Zapke-Gründemann

Softwareentwickler seit 2001

Schwerpunkt: Web Application Development mit Python und Django

Freier Softwareentwickler und Berater seit 2008

www.keimlink.de

Page 3: Mercurial

Übersicht

Verteilte Versionskontrollsysteme

Mercurial

Arbeiten mit Mercurial

Workflows

Links

Page 4: Mercurial

Wer benutzt ein zentrales Versionskontrollsystem?

(CVS, SVN)

Page 5: Mercurial

Wer arbeitet mit einemverteilten

Versionskontrollsystem?

Page 6: Mercurial

Wer hat noch nie einVersionskontrollsystem

benutzt?

Page 7: Mercurial

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

Page 8: Mercurial

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)

Page 9: Mercurial

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

Page 10: Mercurial

Mercurial-Nutzer

Adium

Aptitude

Dovecot

Gajim

Google

MoinMoin

Mozilla

NetBeans

Python

RabbitMQ

Vim

Xen

Page 11: Mercurial

hg

Page 12: Mercurial

Mercurial einrichten

$ vim ~/.hgrc

$ cat ~/.hgrc[ui]username = Markus Zapke-Gründemann <[email protected]>

Page 13: Mercurial

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."

Page 14: Mercurial

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…

Page 15: Mercurial

Geschichte schreiben$ hg stM README

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

$ hg logchangeset: 1:91987b4bd926tag: tipuser: Markus Zapke-Gründemann <[email protected]>date: Fri Oct 15 12:28:26 2010 +0200summary: Pangramm hinzugefügt.

changeset: 0:3c1440dc196cuser: Markus Zapke-Gründemann <[email protected]>date: Fri Oct 15 12:15:08 2010 +0200summary: Erster Commit.

Page 16: Mercurial

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

changeset: 2:55069244c9a4user: Markus Zapke-Gründemann <[email protected]>date: Fri Oct 15 12:36:20 2010 +0200summary: Markup hinzugefügt.

changeset: 1:91987b4bd926user: Markus Zapke-Gründemann <[email protected]>date: Fri Oct 15 12:28:26 2010 +0200summary: Pangramm hinzugefügt.

changeset: 0:3c1440dc196cuser: Markus Zapke-Gründemann <[email protected]>date: Fri Oct 15 12:15:08 2010 +0200summary: Erster Commit.

Page 17: Mercurial

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

Page 18: Mercurial

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

Page 19: Mercurial

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

Page 20: Mercurial

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

Page 21: Mercurial

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

Page 22: Mercurial

Separate Clones II

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

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

Page 23: Mercurial

Separate Clones III

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

changeset: 5:876ee0430735tag: tipuser: Markus Zapke-Gründemann <[email protected]>date: Fri Oct 15 13:47:02 2010 +0200summary: Überschrift hinzugefügt.

Page 24: Mercurial

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 <[email protected]>date: Fri Oct 15 13:47:02 2010 +0200summary: Überschrift hinzugefügt.

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

Page 25: Mercurial

Separate Clones Vprojekt-clone $ hg glog -r 4:o changeset: 7:876ee0430735| tag: tip| user: Markus Zapke-Gründemann <[email protected]>| 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 <[email protected]>| date: Fri Oct 15 13:46:24 2010 +0200| summary: Text von Kafka eingefügt.|| @ changeset: 5:7678996dbc36| | user: Markus Zapke-Gründemann <[email protected]>| | 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 <[email protected]>| date: Fri Oct 15 13:40:52 2010 +0200| summary: Weitere Überschrift hinzugefügt.|

Page 26: Mercurial

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

Page 27: Mercurial

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 <[email protected]>date: Fri Oct 15 14:10:32 2010 +0200summary: Merge mit Eltern-Klon.

Page 28: Mercurial

Separate Clones VIIIprojekt-clone $ hg glog -r 4:@ changeset: 8:7f6e7b845983|\ tag: tip| | parent: 5:7678996dbc36| | parent: 7:876ee0430735| | user: Markus Zapke-Gründemann <[email protected]>| | date: Fri Oct 15 14:10:32 2010 +0200| | summary: Merge mit Eltern-Klon.| || o changeset: 7:876ee0430735| | user: Markus Zapke-Gründemann <[email protected]>| | 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 <[email protected]>| | date: Fri Oct 15 13:46:24 2010 +0200| | summary: Text von Kafka eingefügt.| |o | changeset: 5:7678996dbc36| | user: Markus Zapke-Gründemann <[email protected]>| | 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 <[email protected]>| date: Fri Oct 15 13:40:52 2010 +0200| summary: Weitere Überschrift hinzugefügt.|

Page 29: Mercurial

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

changeset: 5:7678996dbc36user: Markus Zapke-Gründemann <[email protected]>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 <[email protected]>date: Fri Oct 15 14:10:32 2010 +0200summary: Merge mit Eltern-Klon.

Page 30: Mercurial

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

Page 31: Mercurial

Separate Clones XIprojekt $ hg glog -r 4:o changeset: 8:7f6e7b845983|\ tag: tip| | parent: 7:7678996dbc36| | parent: 5:876ee0430735| | user: Markus Zapke-Gründemann <[email protected]>| | date: Fri Oct 15 14:10:32 2010 +0200| | summary: Merge mit Eltern-Klon.| || o changeset: 7:7678996dbc36| | user: Markus Zapke-Gründemann <[email protected]>| | 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 <[email protected]>| | date: Fri Oct 15 13:40:52 2010 +0200| | summary: Weitere Überschrift hinzugefügt.| |@ | changeset: 5:876ee0430735| | user: Markus Zapke-Gründemann <[email protected]>| | date: Fri Oct 15 13:47:02 2010 +0200| | summary: Überschrift hinzugefügt.| |o | changeset: 4:4347c2e33c9e|/ user: Markus Zapke-Gründemann <[email protected]>| date: Fri Oct 15 13:46:24 2010 +0200| summary: Text von Kafka eingefügt.|

Page 32: Mercurial

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

Page 33: Mercurial

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

Page 34: Mercurial

graphlog Extension

$ vim ~/.hgrc

$ cat ~/.hgrc[ui]username = Markus Zapke-Gründemann <[email protected]>

[extensions]graphlog =

Page 35: Mercurial

Mercurial Workflows I

Mit „named branches“ arbeiten

branch / update / merge / commit

Tags nutzen

tag / tags

Page 36: Mercurial

Mercurial Workflows II

Code ohne zentrales Repository austauschen

export / import

bundle / unbundle

clone / push / pull

History manipulieren

backout

clone / export / import

Page 37: Mercurial

Links

http://mercurial.selenic.com/

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

http://hginit.com/

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

http://bitbucket.org/

Page 38: Mercurial

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.