Differences between revisions 4 and 20 (spanning 16 versions)
Revision 4 as of 2008-01-15 10:05:05
Size: 6782
Editor: abuehl
Comment: link
Revision 20 as of 2016-03-22 04:22:19
Size: 452
Editor: GonzaloL22
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
Mercurials Model dezentraler Entwicklung kann neue Benutzer verwirren. Diese Seite beleuchtet einige grundlegende Konzepte.
Im [:GermanTutorial:Tutorial] finden sie eine Schritt-für-Schritt-Anleitung.

''(This page in English: UnderstandingMercurial)''

[[TableOfContents]]

== Was ist in einem Repository ==

Mercurial-Repositories enthalten ein Arbeitsverzeichnis gekoppelt mit einem Speicher:

{{{#!dot
digraph G {
 compound=true;
 rankdir = LR
 background="#999999";
 subgraph cluster_1 {
  style=filled;
  color="#eeeeee";
  node [shape=box,style=filled,color=lightgray];
  "rev 0" -> "rev 1" -> "rev 2" -> "rev 3";
  label = "Speicher";
 }
 subgraph cluster_0 {
  style=filled;
  color=lightgrey;
  node [style=filled,color=white];
  edge [style=invis];
  "main.c"-> "main.h" -> ".hgignore" -> ".hgtags"
  label="Arbeitsverzeichnis";
 }
 "rev 2" -> ".hgtags" [lhead = cluster_0 constraint=false]
}
}}}

Der Speicher enthält die '''vollständige''' History (alle jemals durchgeführten Änderungen) des Projekts. Anders als traditionelle SCMs, bei denen es nur eine zentrale Kopie dieser History gibt, besitzt jedes Arbeitsverzeichnis eine eigene private Kopie der History. Dies erlaubt es, parallel zu entwickeln.

Das Arbeitsverzeichnis enthält eine Kopie der Dateien eines Projekts zu einem gegebenen Zeitpunkt (beispielsweise rev 2), bereit zum Bearbeiten. Auch Tags and ignorierte Dateien werden von der Revisionskontrolle verwaltet, sind als ebenfalls enthalten.

== Änderungen comitten ==

Wenn sie '''commit'''ten, wird der Zustand des Arbeitsverzeichnisses mit den Änderungen im Vergleich zu seinen Eltern als eine neue Revision aufgezeichnet:

{{{#!dot
digraph G {
 compound=true;
 rankdir = LR
 background="#999999";
 subgraph cluster_1 {
  style=filled;
  color="#eeeeee";
  node [shape=box,style=filled,color=lightgray];
  "rev 0" -> "rev 1" -> "rev 2" -> "rev 3";
  "rev 2" -> "rev 4";
  label = "Speicher";
 }
 subgraph cluster_0 {
  style=filled;
  color=lightgrey;
  node [style=filled,color=white];
  edge [style=invis];
  "main.c"-> "main.h" -> ".hgignore" -> ".hgtags"
  label="Arbeitsverzeichnis";
 }
 "rev 2" -> ".hgtags" [style = dotted lhead = cluster_0 constraint=false]
 "rev 4" -> ".hgtags" [lhead = cluster_0 constraint=false]
 ".hgtags" -> "rev 4" [color = red label = "commit" ltail = cluster_0 constraint=false]
}
}}}

Beachten sie, dass Revision 4 ein '''branch''' (Zweig) der Revision 2 ist, die zuvor die Revision im Arbeitsverzeichnis war. Jetzt ist Revision 4 der '''parent''' des Arbeitsverzeichnisses.

== Revisionen, Changesets, Heads, und Tip ==

Mercurial fasst zusammengehörige Änderungen an verschiedenen Dateien jeiweils zu einem einzigen atomaren '''Changeset''' zusammen. Solche changesets sind die '''Revisionen''' des gesamten Projekts, die jeweils eine aufeinanderfolgender Nummer erhalten. Da Mercurial gleichzeitiges verteiltes Entwickeln erlaubt, können diese Nummben sich zwischen den einzelnen Benutzern unterscheiden. Darum weist Mercurial außerdem jeder Revision eine globale '''Changeset-ID''' zu. Changeset-IDs sind 40-stellige Hexadezimalzahlen, können jedoch auf die Anfangsstellen (z. B. "e38487") abgekürzt werden, solange dadurch keine Zweideutigkeit entsteht.

{{{#!dot
digraph {
   rankdir = LR
   node [shape=box]
   "rev 0:838e" -> "rev 1:34ef" -> "rev 2:4563"
   "rev 1:34ef" -> "rev 3:fe56"
   "rev 2:4563" -> "rev 4:ac98"
   "rev 3:fe56" -> "rev 4:ac98"
   "rev 4:ac98" -> "rev 5:0345"
   "rev 4:ac98" -> "rev 6:19e3 (tip)"
   label="Beispiel-History"
}
}}}

Zweige (branches) und Merges (Zusammenführungen) in der Revision-History können an jedem Punkt auftreten. Jeder nicht zusammengeführte Zweig erzeugt einen neuen '''Head''' der Revisionshistory.
Hier sind die Revisionen 5 und 6 die Heads. Mercurial behandelt Revision 6 als '''Tip''' des Repositorys, also den Head mit der höchsten Revisionsnummer.

== Klonen, Änderungen vollziehen, zusammenführen, und Pulling ==

Beginnen wir mit einem Benutzer Alice, deren Speicher so aussieht:

{{{#!dot
digraph {
   label="Alices Repo"
   rankdir = LR
   node [shape=box]
   a->b->c->d
}
}}}

Bob '''klont''' das Repository, und gelangt zu einer vollständigen Kopie des Speichers von Alice (wobei sein Arbeitsverzeichnis unabhängig von ihrem ist!):

{{{#!dot
digraph {
   label="Bobs Repo"
   rankdir = LR
   node [shape=box]
   a->b->c->d
}
}}}

Jetzt '''committet''' Bob einige Änderungen:

{{{#!dot
digraph {
   label="Bobs Repo"
   rankdir = LR
   node [shape=box]
   a->b->c->d->e->f
   e [color=blue]
   f [color=blue]
}
}}}

Parellel dazu führt Alice ihre eigenen Änderungen durch:

{{{#!dot
digraph {
   label="Alices Repo"
   rankdir = LR
   node [shape=box]
   a->b->c->d->g
   g [color=red]
}
}}}

Nun '''pullt''' Bob Alice' Repo für eine Synchronisation. Damit werden alle von Alice durchgeführten Änderungen in Bobs Repo übernommen:

{{{#!dot
digraph {
   label="Bobs Repo"
   rankdir = LR
   node [shape=box]
   a->b->c->d->e->f
   e [color=blue]
   f [color=blue]
   d->g
   g [color=red;label="g (tip)"]
}
}}}

Weil Alice' '''g''' der jüngste "head" in Bobs Repository ist, wird er jetzt zum '''tip'''. Bob führt dann einen '''merge''' durch das das seine letzte Änderung ('''f''') mit dem Tip verbindet, committet das Ergebnis, und erhält folgendes:

{{{#!dot
digraph {
   label="Bobs Repo"
   rankdir = LR
   node [shape=box]
   a->b->c->d->e->f
   e [color=blue]
   f [color=blue]
   d->g
   g [color=red]
   f->h
   g->h
   h [color=green;label="h (tip)"]
}
}}}

Wenn Alice jetzt von Bob '''pullt''', erhält sie seine Änderungen e, f, und h, und sie sind vollkommen synchron:

{{{#!dot
digraph {
   label="Alice' Repo"
   rankdir = LR
   node [shape=box]
   a->b->c->d->g
   d->e->f
   e [color=blue]
   f [color=blue]
   g [color=red]
   f->h
   g->h
   h [color=green;label="h (tip)"]
}
}}}

== Ein dezentrales System ==

Mercurial arbeitet vollkommen dezentral kommt ohne internes Konzept eines zentralen Repositorys aus. Daher steht es den Benutzern frei, eigene Topologien zu definieren über die sie Änderungen teilen wollen:

{{{#!dot
digraph {
   Alice -> Zentrale
   Zentrale -> Alice
   Bob -> Zentrale
   Alice -> Bob
   Alice -> Carl
   Carl -> Zentrale
   Bob -> Carl
   Carl -> Bob
   "Carls Laptop" -> Carl
   Carl -> "Carls Laptop"
   "Carls Laptop" -> Zentrale
   Zentrale [style=fill;color=blue;label="Main Public Repo"]
   label="Mercurial, ein Netzwerkbeispiel"
}
}}}

Für eine praktische Einführung in die Benutzung von Mercurial, siehe ["GermanTutorial"].
Friends phone him constantly Ali. Distributing production is what she does but she's already signed another one particular particular. What her as well as friends her love is acting but she doesn't have got the time lately. Some time ago I thought i would live in West The state of virginia. She's terrible at design but may think that want to check her website: http://greatsampleoffers.com/free-samples/personal-care/free-incontinence-samples-tena/

Friends phone him constantly Ali. Distributing production is what she does but she's already signed another one particular particular. What her as well as friends her love is acting but she doesn't have got the time lately. Some time ago I thought i would live in West The state of virginia. She's terrible at design but may think that want to check her website: http://greatsampleoffers.com/free-samples/personal-care/free-incontinence-samples-tena/

GermanUnderstandingMercurial (last edited 2016-03-22 06:29:32 by Pierre-YvesDavid)