SlideShare ist ein Scribd-Unternehmen logo
Mercurial
Ein verteiltes Versionskontrollsystem
Markus 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 einem
       verteilten
Versionskontrollsystem?
Wer hat noch nie ein
Versionskontrollsystem
       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         Mozilla
 Aptitude      NetBeans
 Dovecot       Python
 Gajim         RabbitMQ
 Google        Vim
 MoinMoin      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 add
adding README

$ hg st
A README

$ hg commit -m "Erster Commit."
Unterschiede feststellen
$ ls -A
.hg README

$ vim README

$ hg diff
diff --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 st
M README

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

$ hg log
changeset:   1:91987b4bd926
tag:         tip
user:        Markus Zapke-Gründemann <info@keimlink.de>
date:        Fri Oct 15 12:28:26 2010 +0200
summary:     Pangramm hinzugefügt.

changeset:   0:3c1440dc196c
user:        Markus Zapke-Gründemann <info@keimlink.de>
date:        Fri Oct 15 12:15:08 2010 +0200
summary:     Erster Commit.
Zeitreisen I
$ hg log
changeset:   3:70e6670ff187
tag:         tip
user:        Markus Zapke-Gründemann <info@keimlink.de>
date:        Fri Oct 15 12:37:31 2010 +0200
summary:     Lorem ipsum.

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

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

changeset:   0:3c1440dc196c
user:        Markus Zapke-Gründemann <info@keimlink.de>
date:        Fri Oct 15 12:15:08 2010 +0200
summary:     Erster Commit.
Zeitreisen II
$ hg identify
70e6670ff187 tip

$ hg identify -n
3

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


$ hg identify -ni
91987b4bd926 1

$ hg up tip
1 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 serve
listening at http://host.local:8000/ (bound to *:8000)

$ hg clone http://host.local:8000/ projekt
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
Separate Clones I

projekt $ cd ..

$ hg clone projekt projekt-clone
updating to branch default
1 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 out
comparing with /Users/zappi/projekt
searching for changes
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.

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

projekt-clone $ hg in
comparing with /Users/zappi/projekt
searching for changes
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.

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.
Separate Clones IV
projekt-clone $ hg pull
pulling from /Users/zappi/projekt
searching for changes
adding changesets
adding manifests
adding file changes
added 2 changesets with 2 changes to 1 files (+1 heads)
(run 'hg heads' to see heads, 'hg merge' to merge)

projekt-clone $ hg heads
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.

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.
Separate Clones V
projekt-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 VI
projekt-clone $ cd ../projekt
projekt $ 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-clone
projekt-clone $ hg merge
merging README
0 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: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.
Separate Clones VIII
projekt-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 IX
projekt-clone $ hg out
comparing with /Users/zappi/projekt
searching for changes
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.

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.

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.
Separate Clones X

projekt-clone $ hg push
pushing to /Users/zappi/projekt
searching for changes
adding changesets
adding manifests
adding file changes
added 3 changesets with 3 changes to 1 files

projekt-clone $ cd ../projekt
Separate Clones XI
projekt $ 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 -ni
876ee0430735 5

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

$ hg identify -ni
7f6e7b845983 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/
Lizenz
              Dieses Werk ist unter einem
                  Creative Commons
Namensnennung-Weitergabe unter gleichen Bedingungen
              3.0 Unported Lizenzvertrag
                       lizenziert.
     Um die Lizenz anzusehen, gehen Sie bitte zu
   http://creativecommons.org/licenses/by-sa/3.0/
            oder schicken Sie einen Brief an
                  Creative Commons,
             171 Second Street, Suite 300,
        San Francisco, California 94105, USA.

Weitere ähnliche Inhalte

Andere mochten auch

Node.js Security
Node.js SecurityNode.js Security
Node.js Security
Sebastian Springer
 
Python crash-kurs
Python crash-kursPython crash-kurs
Python crash-kurs
klausbremer
 
Die freie Programmiersprache Python
Die freie Programmiersprache Python Die freie Programmiersprache Python
Die freie Programmiersprache Python
Andreas Schreiber
 
Distributed Version Control (DVCS) With Mercurial
Distributed Version Control (DVCS) With MercurialDistributed Version Control (DVCS) With Mercurial
Distributed Version Control (DVCS) With Mercurial
Ted Naleid
 
A Provenance Model for Quantified Self Data
A Provenance Model for Quantified Self DataA Provenance Model for Quantified Self Data
A Provenance Model for Quantified Self Data
Andreas Schreiber
 
node.js Einführung
node.js Einführungnode.js Einführung
node.js Einführung
Benjamin-Timm Broich
 

Andere mochten auch (7)

Node.js Security
Node.js SecurityNode.js Security
Node.js Security
 
Python crash-kurs
Python crash-kursPython crash-kurs
Python crash-kurs
 
Die freie Programmiersprache Python
Die freie Programmiersprache Python Die freie Programmiersprache Python
Die freie Programmiersprache Python
 
Distributed Version Control (DVCS) With Mercurial
Distributed Version Control (DVCS) With MercurialDistributed Version Control (DVCS) With Mercurial
Distributed Version Control (DVCS) With Mercurial
 
Python & PyDev
Python & PyDevPython & PyDev
Python & PyDev
 
A Provenance Model for Quantified Self Data
A Provenance Model for Quantified Self DataA Provenance Model for Quantified Self Data
A Provenance Model for Quantified Self Data
 
node.js Einführung
node.js Einführungnode.js Einführung
node.js Einführung
 

Ähnlich wie Mercurial

Extreme Fluid - Status Quo der modernen Templating Engine
Extreme Fluid - Status Quo der modernen Templating EngineExtreme Fluid - Status Quo der modernen Templating Engine
Extreme Fluid - Status Quo der modernen Templating Engine
die.agilen GmbH
 
Git Grundlagen
Git GrundlagenGit Grundlagen
Git Grundlagen
Benjamin Schürmann
 
Version management mit Git und Github
Version management mit Git und Github Version management mit Git und Github
Version management mit Git und Github
fg.informatik Universität Basel
 
Lokale TYPO3 Entwicklungsumgebung mit DDEV
Lokale TYPO3 Entwicklungsumgebung mit DDEVLokale TYPO3 Entwicklungsumgebung mit DDEV
Lokale TYPO3 Entwicklungsumgebung mit DDEV
Peter Kraume
 
Git
GitGit
G&L Tech News 02/17
G&L Tech News 02/17G&L Tech News 02/17
Logstash: Open Source Log-Management (Webinar vom 20.02.2014)
Logstash: Open Source Log-Management (Webinar vom 20.02.2014)Logstash: Open Source Log-Management (Webinar vom 20.02.2014)
Logstash: Open Source Log-Management (Webinar vom 20.02.2014)
NETWAYS
 
Versionskontrolle mit Git
Versionskontrolle mit GitVersionskontrolle mit Git
Versionskontrolle mit Git
NETUserGroupBern
 
Keynote der 1. webEdition Benutzer Konferenz 2011 in Frankfurt
Keynote der 1. webEdition Benutzer Konferenz 2011 in FrankfurtKeynote der 1. webEdition Benutzer Konferenz 2011 in Frankfurt
Keynote der 1. webEdition Benutzer Konferenz 2011 in Frankfurt
webEdition
 
BI-System with OData and SharePoint Online App (SharePoint Konferenz ppEDV Er...
BI-System with OData and SharePoint Online App (SharePoint Konferenz ppEDV Er...BI-System with OData and SharePoint Online App (SharePoint Konferenz ppEDV Er...
BI-System with OData and SharePoint Online App (SharePoint Konferenz ppEDV Er...
atwork
 
Childthemes mit git – WordPress MeetUp CGN
Childthemes mit git – WordPress MeetUp CGNChildthemes mit git – WordPress MeetUp CGN
Childthemes mit git – WordPress MeetUp CGN
pixolin
 
Feature teams
Feature teamsFeature teams
Feature teams
Walter Strametz
 

Ähnlich wie Mercurial (12)

Extreme Fluid - Status Quo der modernen Templating Engine
Extreme Fluid - Status Quo der modernen Templating EngineExtreme Fluid - Status Quo der modernen Templating Engine
Extreme Fluid - Status Quo der modernen Templating Engine
 
Git Grundlagen
Git GrundlagenGit Grundlagen
Git Grundlagen
 
Version management mit Git und Github
Version management mit Git und Github Version management mit Git und Github
Version management mit Git und Github
 
Lokale TYPO3 Entwicklungsumgebung mit DDEV
Lokale TYPO3 Entwicklungsumgebung mit DDEVLokale TYPO3 Entwicklungsumgebung mit DDEV
Lokale TYPO3 Entwicklungsumgebung mit DDEV
 
Git
GitGit
Git
 
G&L Tech News 02/17
G&L Tech News 02/17G&L Tech News 02/17
G&L Tech News 02/17
 
Logstash: Open Source Log-Management (Webinar vom 20.02.2014)
Logstash: Open Source Log-Management (Webinar vom 20.02.2014)Logstash: Open Source Log-Management (Webinar vom 20.02.2014)
Logstash: Open Source Log-Management (Webinar vom 20.02.2014)
 
Versionskontrolle mit Git
Versionskontrolle mit GitVersionskontrolle mit Git
Versionskontrolle mit Git
 
Keynote der 1. webEdition Benutzer Konferenz 2011 in Frankfurt
Keynote der 1. webEdition Benutzer Konferenz 2011 in FrankfurtKeynote der 1. webEdition Benutzer Konferenz 2011 in Frankfurt
Keynote der 1. webEdition Benutzer Konferenz 2011 in Frankfurt
 
BI-System with OData and SharePoint Online App (SharePoint Konferenz ppEDV Er...
BI-System with OData and SharePoint Online App (SharePoint Konferenz ppEDV Er...BI-System with OData and SharePoint Online App (SharePoint Konferenz ppEDV Er...
BI-System with OData and SharePoint Online App (SharePoint Konferenz ppEDV Er...
 
Childthemes mit git – WordPress MeetUp CGN
Childthemes mit git – WordPress MeetUp CGNChildthemes mit git – WordPress MeetUp CGN
Childthemes mit git – WordPress MeetUp CGN
 
Feature teams
Feature teamsFeature teams
Feature teams
 

Mehr von Markus Zapke-Gründemann

Writing multi-language documentation using Sphinx
Writing multi-language documentation using SphinxWriting multi-language documentation using Sphinx
Writing multi-language documentation using Sphinx
Markus Zapke-Gründemann
 
Celery eine asynchrone task queue (nicht nur) für django
Celery   eine asynchrone task queue (nicht nur) für djangoCelery   eine asynchrone task queue (nicht nur) für django
Celery eine asynchrone task queue (nicht nur) für djangoMarkus Zapke-Gründemann
 
Bottle - Python Web Microframework (english)
Bottle - Python Web Microframework (english)Bottle - Python Web Microframework (english)
Bottle - Python Web Microframework (english)
Markus Zapke-Gründemann
 
Bottle - Python Web Microframework
Bottle - Python Web MicroframeworkBottle - Python Web Microframework
Bottle - Python Web Microframework
Markus Zapke-Gründemann
 
Django - The Web framework for perfectionists with deadlines
Django - The Web framework  for perfectionists with deadlinesDjango - The Web framework  for perfectionists with deadlines
Django - The Web framework for perfectionists with deadlines
Markus Zapke-Gründemann
 

Mehr von Markus Zapke-Gründemann (6)

Writing multi-language documentation using Sphinx
Writing multi-language documentation using SphinxWriting multi-language documentation using Sphinx
Writing multi-language documentation using Sphinx
 
Celery eine asynchrone task queue (nicht nur) für django
Celery   eine asynchrone task queue (nicht nur) für djangoCelery   eine asynchrone task queue (nicht nur) für django
Celery eine asynchrone task queue (nicht nur) für django
 
Bottle - Python Web Microframework (english)
Bottle - Python Web Microframework (english)Bottle - Python Web Microframework (english)
Bottle - Python Web Microframework (english)
 
EuroDjangoCon 2009 - Ein Rückblick
EuroDjangoCon 2009 - Ein RückblickEuroDjangoCon 2009 - Ein Rückblick
EuroDjangoCon 2009 - Ein Rückblick
 
Bottle - Python Web Microframework
Bottle - Python Web MicroframeworkBottle - Python Web Microframework
Bottle - Python Web Microframework
 
Django - The Web framework for perfectionists with deadlines
Django - The Web framework  for perfectionists with deadlinesDjango - The Web framework  for perfectionists with deadlines
Django - The Web framework for perfectionists with deadlines
 

Mercurial

  • 1. Mercurial Ein verteiltes Versionskontrollsystem Markus Zapke-Gründemann Ubucon 2010 Leipzig
  • 2. Markus Zapke-Gründemann Softwareentwickler seit 2001 Schwerpunkt: Web Application Development mit Python und Django Freier Softwareentwickler und Berater seit 2008 www.keimlink.de
  • 3. Übersicht Verteilte Versionskontrollsysteme Mercurial Arbeiten mit Mercurial Workflows Links
  • 4. Wer benutzt ein zentrales Versionskontrollsystem? (CVS, SVN)
  • 5. Wer arbeitet mit einem verteilten Versionskontrollsystem?
  • 6. Wer hat noch nie ein Versionskontrollsystem benutzt?
  • 7. 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
  • 8. 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)
  • 9. 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
  • 10. Mercurial-Nutzer Adium Mozilla Aptitude NetBeans Dovecot Python Gajim RabbitMQ Google Vim MoinMoin Xen
  • 11. hg
  • 12. Mercurial einrichten $ vim ~/.hgrc $ cat ~/.hgrc [ui] username = Markus Zapke-Gründemann <info@keimlink.de>
  • 13. Ein Repository einrichten $ mkdir projekt $ cd projekt $ hg init $ vim README $ hg status ? README $ hg add adding README $ hg st A README $ hg commit -m "Erster Commit."
  • 14. Unterschiede feststellen $ ls -A .hg README $ vim README $ hg diff diff --git a/README b/README --- a/README +++ b/README @@ -1,1 +1,3 @@ Neues Projekt + +Zwei flinke Boxer jagen die quirlige Eva und…
  • 15. Geschichte schreiben $ hg st M README $ hg commit -m "Pangramm hinzugefügt." $ hg log changeset: 1:91987b4bd926 tag: tip user: Markus Zapke-Gründemann <info@keimlink.de> date: Fri Oct 15 12:28:26 2010 +0200 summary: Pangramm hinzugefügt. changeset: 0:3c1440dc196c user: Markus Zapke-Gründemann <info@keimlink.de> date: Fri Oct 15 12:15:08 2010 +0200 summary: Erster Commit.
  • 16. Zeitreisen I $ hg log changeset: 3:70e6670ff187 tag: tip user: Markus Zapke-Gründemann <info@keimlink.de> date: Fri Oct 15 12:37:31 2010 +0200 summary: Lorem ipsum. changeset: 2:55069244c9a4 user: Markus Zapke-Gründemann <info@keimlink.de> date: Fri Oct 15 12:36:20 2010 +0200 summary: Markup hinzugefügt. changeset: 1:91987b4bd926 user: Markus Zapke-Gründemann <info@keimlink.de> date: Fri Oct 15 12:28:26 2010 +0200 summary: Pangramm hinzugefügt. changeset: 0:3c1440dc196c user: Markus Zapke-Gründemann <info@keimlink.de> date: Fri Oct 15 12:15:08 2010 +0200 summary: Erster Commit.
  • 17. Zeitreisen II $ hg identify 70e6670ff187 tip $ hg identify -n 3 $ hg update -r 1 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg identify -ni 91987b4bd926 1 $ hg up tip 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  • 18. 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
  • 19. 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
  • 20. HTTP-Server $ hg serve listening at http://host.local:8000/ (bound to *:8000) $ hg clone http://host.local:8000/ projekt updating to branch default 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  • 21. Separate Clones I projekt $ cd .. $ hg clone projekt projekt-clone updating to branch default 1 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
  • 22. Separate Clones II projekt-clone $ hg out comparing with /Users/zappi/projekt searching for changes 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. changeset: 5:7678996dbc36 tag: tip user: Markus Zapke-Gründemann <info@keimlink.de> date: Fri Oct 15 13:41:24 2010 +0200 summary: Markup für Überschrift hinzugefügt.
  • 23. Separate Clones III projekt-clone $ hg in comparing with /Users/zappi/projekt searching for changes 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. 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.
  • 24. Separate Clones IV projekt-clone $ hg pull pulling from /Users/zappi/projekt searching for changes adding changesets adding manifests adding file changes added 2 changesets with 2 changes to 1 files (+1 heads) (run 'hg heads' to see heads, 'hg merge' to merge) projekt-clone $ hg heads 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. 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.
  • 25. Separate Clones V projekt-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. |
  • 26. Separate Clones VI projekt-clone $ cd ../projekt projekt $ 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. |
  • 27. Separate Clones VII projekt $ cd ../projekt-clone projekt-clone $ hg merge merging README 0 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: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.
  • 28. Separate Clones VIII projekt-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. |
  • 29. Separate Clones IX projekt-clone $ hg out comparing with /Users/zappi/projekt searching for changes 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. 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. 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.
  • 30. Separate Clones X projekt-clone $ hg push pushing to /Users/zappi/projekt searching for changes adding changesets adding manifests adding file changes added 3 changesets with 3 changes to 1 files projekt-clone $ cd ../projekt
  • 31. Separate Clones XI projekt $ 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. |
  • 32. Separate Clones XII projekt $ hg identify -ni 876ee0430735 5 $ hg up 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg identify -ni 7f6e7b845983 8
  • 33. 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
  • 34. graphlog Extension $ vim ~/.hgrc $ cat ~/.hgrc [ui] username = Markus Zapke-Gründemann <info@keimlink.de> [extensions] graphlog =
  • 35. Mercurial Workflows I Mit „named branches“ arbeiten branch / update / merge / commit Tags nutzen tag / tags
  • 36. Mercurial Workflows II Code ohne zentrales Repository austauschen export / import bundle / unbundle clone / push / pull History manipulieren backout clone / export / import
  • 37. Links http://mercurial.selenic.com/ http://hgbook.red-bean.com/ http://hginit.com/ http://mercurial.selenic.com/wiki/ QuickReferenceCardsAndCheatSheets http://bitbucket.org/
  • 38. Lizenz Dieses Werk ist unter einem Creative Commons Namensnennung-Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenzvertrag lizenziert. Um die Lizenz anzusehen, gehen Sie bitte zu http://creativecommons.org/licenses/by-sa/3.0/ oder schicken Sie einen Brief an Creative Commons, 171 Second Street, Suite 300, San Francisco, California 94105, USA.