Differences between revisions 18 and 20 (spanning 2 versions)
Revision 18 as of 2013-01-31 00:39:52
Size: 10374
Editor: KevinBullock
Comment: Add section 6 from English version
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:
#pragma section-numbers 2
#language de

= Mercurial verstehen =

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 Archiv ==

Mercurial-Archive enthalten ein Arbeitsverzeichnis gekoppelt mit einem Speicher:

{{{#!dot
digraph G {
 rankdir = LR;
 compound=true;
 background="#999999";
 subgraph cluster_0 {
  label="Arbeitsverzeichnis";
  style=filled;
  color=lightgrey;
  node [style=filled,color=white];
  edge [style=invis];
  "main.c" -> "main.h" -> ".hgignore" -> ".hgtags";
 }
 subgraph cluster_1 {
  label = "Speicher";
  labelloc = b;
  style=filled;
  color="#eeeeee";
  node [shape=box, style=filled, color=lightgray];
  "rev 0" -> "rev 1" -> "rev 2" -> "rev 3" [dir=back, label="Vorgänger"];
 }
 "main.c" -> "rev 2" [ltail=cluster_0, label="parent", labeldistance=5, minlen=2];
}
}}}

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

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

== Änderungen übernehmen ==

Wenn sie '''übernehmen''', wird der Zustand des Arbeitsverzeichnisses mit den Änderungen im Vergleich zu seinen Vorgängern als eine neue Revision aufgezeichnet:

{{{#!dot
digraph G {
 compound=true;
 rankdir = LR
 background="#999999";
 subgraph cluster_0 {
  label="Arbeitsverzeichnis";
  style=filled;
  color=lightgrey;
  node [style=filled,color=white];
  edge [style=invis];
  "main.c"-> "main.h" -> ".hgignore" -> ".hgtags"
 }
 subgraph cluster_1 {
  label = "Speicher";
  labelloc = b;
  style=filled;
  color="#eeeeee";
  node [shape=box,style=filled,color=lightgray];
  "rev 0" -> "rev 1" -> "rev 2" -> "rev 3" [dir=back];
  "rev 2" -> "rev 4" [dir=back];
 }
 "rev 2" -> ".hgtags" [dir=back, style=dotted, lhead=cluster_0, label="Vorgänger vor Übernehmen"]
 "rev 4" -> ".hgtags" [dir=back, color=red, lhead=cluster_0, headlabel="übernehmen", labelfontcolor=red ]
}
}}}

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

== Revisionen, Änderungssätze, Köpfe, und Spitze ==

Mercurial fasst zusammengehörige Änderungen an verschiedenen Dateien jeweils zu einem einzigen atomaren '''Änderungssatz''' zusammen. Solche Änderungssätze sind die '''Revisionen''' des gesamten Projekts, die jeweils eine aufeinanderfolgender Nummer erhalten. Da Mercurial gleichzeitiges verteiltes Entwickeln erlaubt, können diese Nummern sich zwischen den einzelnen Benutzern unterscheiden. Darum weist Mercurial außerdem jeder Revision eine globale '''Änderungssatz-ID''' zu. Änderungssatz-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=record]
   rev0 [label="{{<p1> p1 | <p2> p2} | rev 0:838e}"];
   rev1 [label="{{<p1> p1 | <p2> p2} | rev 1:34ef}"];
   rev2 [label="{{<p1> p1 | <p2> p2} | rev 2:4563}"];
   rev3 [label="{{<p1> p1 | <p2> p2} | rev 3:fe56}"];
   rev4 [label="{{<p1> p1 | <p2> p2} | rev 4:ac98}"];
   rev5 [label="{{<p1> p1 | <p2> p2} | rev 5:0345}"];
   rev6 [label="{{<p1> p1 | <p2> p2} | rev 6:19e3 (tip)}"];
   workingdir [label="{{<p1> p1 | <p2> p2} | Arbeitsverzeichnis}"];
   rev0 -> rev1:p1 [dir=back]
   rev1 -> rev2:p1 [dir=back]
   rev1 -> rev3:p1 [dir=back]
   rev2 -> rev4:p1 [dir=back]
   rev3 -> rev4:p2 [dir=back]
   rev4 -> rev5:p1 [dir=back]
   rev4 -> rev6:p1 [dir=back]
   rev6 -> workingdir:p1 [dir=back]
   label="Beispiel-Archiv"
}
}}}

Zweige (branches) und Zusammenführungen (merges) in der Revision-Historie können an jedem Punkt auftreten. Jeder nicht zusammengeführte Zweig erzeugt einen neuen '''Kopf''' der Revisionshistorie.
Hier sind die Revisionen 5 und 6 die Heads. Mercurial behandelt Revision 6 als '''Spitze''' des Archivs, also den Kopf mit der höchsten Revisionsnummer.

== Klonen, Änderungen vornehmen, Zusammenführen und Abrufen ==

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

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

Bob '''klont''' den Archiv, und gelangt zu einer vollständigen, unabhängigen, lokalen Kopie des Speichers von Alice, sowie einem Arbeitsverzeichnis, das mit dem Speicher gleich lautet:

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

Jetzt kann Bob unabhängig von Alice entwickeln. Er '''übernimmt''' danach einige Änderungen e und f:

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

Gleichzeitig dazu übernimmt Alice ihre eigene Änderung g, wobei ihr Archiv von Bobs abzweigt (daher ein Zweig):

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

Nun '''ruft''' Bob von Alices Archiv für eine Synchronisation '''ab'''. Damit werden alle von Alice übernommen Änderungen in Bobs Speicher abgeschrieben (hier nur eine einzige Änderungssatz, g). Beachten sie, dass Bobs Arbeitsverzeichnis dabei '''nicht''' verändert wird:

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

Da Alices '''g''' der jüngste Kopf in Bobs Repository ist, wird er jetzt zum '''Spitze''' (tip).

Bob führt dann eine '''Zusammenführung''' (merge) durch, die seine letzte Änderung (f) mit der Spitze in sein Arbeitsverzeichnis verbindet. Nun hat sein Arbeitsverzeichnis zwei Vorgänger (f und g):

{{{#!dot
digraph {
   label="Bobs Archiv"
   rankdir = LR
   node [shape=box]
   a -> b -> c -> d -> e -> f [dir=back]
   e [color=blue]
   f [color=blue]
   d -> g [dir=back]
   g [color=red]
   f -> "Arbeitsverzeichnis" [dir=back, weight=3.0]
   g -> "Arbeitsverzeichnis" [dir=back, weight=3.0]
}
}}}

Nachdem Bob das Ergebnis der Zusammenführung beobachtet, um zu überzeugen, es vollkommen sei, übernimmt Bob das Ergebnis, und erhält eine neue '''Zusammenführung-Änderungssatz''' in seinem Speicher:

{{{#!dot
digraph {
   label="Bobs Archiv"
   rankdir = LR
   node [shape=box]
   a -> b -> c -> d -> e -> f [dir=back]
   e [color=blue]
   f [color=blue]
   d -> g [dir=back]
   g [color=red]
   f -> h [dir=back, weight=3.0]
   g -> h [dir=back, weight=3.0]
   h -> "Arbeitsverzeichnis" [dir=back]
   h [color=green, label="h (Spitze)"]
}
}}}

Wenn Alice jetzt von Bob '''abruft''', erhält sie seine Änderungen e, f, und h in ihren Speicher:

{{{#!dot
digraph {
   label="Alices Archiv"
   rankdir = LR
   node [shape=box]
   a -> b -> c -> d -> e -> f [dir=back]
   e [color=blue]
   f [color=blue]
   d -> g -> "Arbeitsverzeichnis" [dir=back]
   g [color=red]
   f -> h [dir=back, weight=3.0]
   g -> h [dir=back, weight=3.0]
   h [color=green, label="h (Spitze)"]
}
}}}

Beachten sie, dass Alices Arbeitsverzeichnis von Abruf nicht verändert wird. Um ihren Arbeitsverzeichnis mit der Änderungssatz h abzugleichen, muss sie es '''aktualisieren'''. Damit wird der Vorgänger ihres Arbeitsverzeichnisses zur Änderungssatz h verändert und die Dateien im Arbeitsverzeichnis zur Änderungssatz h aktualisiert.

{{{#!dot
digraph {
   label="Alices Archiv"
   rankdir = LR
   node [shape=box]
   a -> b -> c -> d -> e -> f [dir=back]
   e [color=blue]
   f [color=blue]
   d -> g [dir=back]
   g [color=red]
   f -> h [dir=back, weight=3.0]
   g -> h [dir=back, weight=3.0]
   h -> "Arbeitsverzeichnis" [dir=back]
   h [color=green, label="h (Spitze)"]
}
}}}

== Ein dezentrales System ==

Mercurial arbeitet vollkommen dezentral und kommt ohne internes Konzept eines zentralen Projektarchivs 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"
}
}}}

Im Gegensatz zu einer zentralisierten Versionsverwaltung, wobei Experimente verheerend sein können, mit ein DVCS wie Mercurial kann man bloß klonen und experimentieren. Wenn sie das Ergebnis gern haben, so übertragen sie es zurück, wenn nicht, löschen sie den geklonten Archive und versuchen sie etwas anderes.

== Was Mercurial nicht kann ==

Viele SVN- und CVS-Benutzer annehmen, verwandte Projekte in einem Archiv zusammen zu veranstalten. Mercurial ist eigentlich dafür nicht bestimmt, also sie sollen versuchen, anders zu arbeiten. Das heißt namentlich, dass es nicht möglich ist, ein einziger Verzeichnis von einem Archiv abzurufen.

Falls sie mehrere Projekte etwa in einem Meta-Archiv veranstalten müssen, könnten sie das bei Mercurial 1.3 eingeführt "Subrepositories" Merkmal ausprobieren.

Für eine praktische Einführung in die Benutzung von Mercurial, siehe [[GermanTutorial]].
----
CategoryGerman
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)