Einführung Mercurial

2,162 views

Published on

Published in: Technology, Business
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,162
On SlideShare
0
From Embeds
0
Number of Embeds
13
Actions
Shares
0
Downloads
18
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Einführung Mercurial

  1. 1. Versionsverwaltung? <ul><ul><li>Real Programmers don't need version control. </li></ul></ul><ul><ul><li>N.N. </li></ul></ul>
  2. 2. Geschichte <ul><li>SCCS (1970er, Dateien, Sperren, nicht frei) </li></ul><ul><ul><li>RCS (1980er, Dateien, Sperren, frei) </li></ul></ul><ul><ul><li>CVS (1985-, Dateien, keine Sperren, frei) </li></ul></ul><ul><ul><li>Subversion (SVN) (2001-, frei) </li></ul></ul><ul><ul><li>Git (2005-, frei) </li></ul></ul><ul><ul><li>Mercurial (2005-, frei) </li></ul></ul><ul><ul><li>andere : clearcase, perforce, bitkeeper ($$$$) </li></ul></ul>
  3. 3. Installation <ul><li>Windows: TortoiseHg-0.x.y.exe http://tortoisehg.sourceforge.net/ alles drin </li></ul><ul><li>Linux/Unix/MacOS X: mercurial-1.0.2.tar.gz http://www.selenic.com/mercurial man braucht Python >=2.3, 3-way merge, gcc </li></ul><ul><li>Konfigurieren (Name, E-Mail, ...) auf Rechner oder im Repository </li></ul>
  4. 4. Kommandozeile <ul><ul><li>D:srchgtalk>hg version </li></ul></ul><ul><ul><li>Mercurial Distributed SCM (version 1.0.2+tortoisehg) </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>D:srchgtalk>hg help init </li></ul></ul><ul><ul><li>hg init [-e CMD] [--remotecmd CMD] [DEST] </li></ul></ul><ul><ul><li>create a new repository in the given directory </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>D:srchgtalk> </li></ul></ul>
  5. 5. hg init <ul><ul><li>D:srchgtalk>mkdir 1 </li></ul></ul><ul><ul><li>D:srchgtalk>cd 1 </li></ul></ul><ul><ul><li>D:srchgtalk1>hg init </li></ul></ul><ul><ul><li>oder </li></ul></ul><ul><ul><li>D:srchgtalk>hg init 1 </li></ul></ul><ul><ul><li>D:srchgtalk>cd 1 </li></ul></ul>
  6. 6. Leerer Arbeitsbereich <ul><ul><li>D:srchgtalk1>dir </li></ul></ul><ul><ul><li>12.10.2008 21:57 <DIR> . </li></ul></ul><ul><ul><li>12.10.2008 21:57 <DIR> .. </li></ul></ul><ul><ul><li>12.10.2008 21:57 <DIR> .hg </li></ul></ul><ul><ul><li>0 Datei(en), 0 Bytes </li></ul></ul><ul><ul><li>3 Verzeichnis(se), 80.418.877.440 Bytes frei </li></ul></ul>
  7. 7. TortoiseHG Kontextmenü im Explorer
  8. 8. Repository erzeugen (.hg-Verz.)
  9. 9. entspricht „hg init“
  10. 10. .hgignore ist leer (später mehr)
  11. 11. hg status (kurz st) <ul><ul><li>D:srchgtalk1>hg st </li></ul></ul><ul><ul><li>? .hgignore </li></ul></ul><ul><ul><li>? info1.pl </li></ul></ul><ul><ul><li>D:srchgtalk1> </li></ul></ul>
  12. 12. jetzt unter Windows ...
  13. 13. ... hg status
  14. 14. erstmal sieht man nichts ...
  15. 15. ... Status unbekannt anwählen
  16. 16. .hgignore blendet Dateimuster aus
  17. 17. die ignorierten Dateien sind weg <ul><ul><li>D:srchgtalk1>hg status </li></ul></ul><ul><ul><li>? info1.pl </li></ul></ul><ul><ul><li>D:srchgtalk1> </li></ul></ul>
  18. 18. die ignorierten Dateien sind weg <ul><ul><li>D:srchgtalk1>hg status </li></ul></ul><ul><ul><li>? info1.pl </li></ul></ul><ul><ul><li>D:srchgtalk1>dir </li></ul></ul><ul><ul><li>12.10.2008 18:54 <DIR> .hg </li></ul></ul><ul><ul><li>12.10.2008 20:48 111 .hgignore </li></ul></ul><ul><ul><li>12.10.2008 18:54 0 .hgignore.$$$ </li></ul></ul><ul><ul><li>12.10.2008 19:14 90 info1.pl </li></ul></ul><ul><ul><li>D:srchgtalk1> </li></ul></ul>
  19. 19. unter Windows genauso ...
  20. 20. ... oder auch die ignorierten
  21. 21. Dateien hinzufügen <ul><ul><li>D:srchgtalk1>hg add info1.pl </li></ul></ul><ul><ul><li>D:srchgtalk1>hg st </li></ul></ul><ul><ul><li>A info1.pl </li></ul></ul><ul><ul><li>D:srchgtalk1>hg commit </li></ul></ul><ul><ul><li>D:srchgtalk1>hg st </li></ul></ul><ul><ul><li>D:srchgtalk1> </li></ul></ul><ul><ul><li>Achtung: hg add ohne Parameter nimmt alle </li></ul></ul><ul><ul><li>Dateien rekursiv. </li></ul></ul>Öffnet Editor für Kommentar
  22. 22. Status im Explorer
  23. 23. Änderungen <ul><ul><li>D:srchgtalk1>type info1.pl </li></ul></ul><ul><ul><li>use strict; </li></ul></ul><ul><ul><li>print &quot;Hg steht für: Mercurial &quot;; </li></ul></ul><ul><ul><li>D:srchgtalk1>hg st </li></ul></ul><ul><ul><li>M info1.pl </li></ul></ul><ul><ul><li>D:srchgtalk1> </li></ul></ul>
  24. 24. Status „geändert“ im Explorer Neue und ignorierte Dateien ohne Symbol
  25. 25. noch jemand will arbeiten <ul><ul><li>D:srchgtalk>hg clone 1 1b </li></ul></ul><ul><ul><li>updating working directory </li></ul></ul><ul><ul><li>1 files updated, 0 files merged, 0 files removed, 0 files unresolved </li></ul></ul><ul><ul><li>D:srchgtalk>cd 1b </li></ul></ul><ul><ul><li>D:srchgtalk1b>type info1.pl </li></ul></ul><ul><ul><li>use strict; </li></ul></ul><ul><ul><li>print &quot;Hg steht für: hydrargyrum, chemisches Symbol für Quecksilber &quot;; </li></ul></ul><ul><ul><li>D:srchgtalk1b> </li></ul></ul>
  26. 26. ... und ändert, ... <ul><ul><li>D:srchgtalk1b>copy ..1.hgignore . </li></ul></ul><ul><ul><li>D:srchgtalk1b>hg diff </li></ul></ul><ul><ul><li>diff -r 134e009f9517 info1.pl </li></ul></ul><ul><ul><li>--- a/info1.pl Sun Oct 12 23:14:23 2008 +0200 </li></ul></ul><ul><ul><li>+++ b/info1.pl Sun Oct 12 23:43:29 2008 +0200 </li></ul></ul><ul><ul><li>@@ -1,4 +1,5 @@ </li></ul></ul><ul><ul><li>use strict; </li></ul></ul><ul><ul><li>print &quot;Hg steht für: hydrargyrum, chemisches Symbol für Quecksilber &quot;; </li></ul></ul><ul><ul><li>+print &quot; oder auch für Hochschulgesetz &quot;; </li></ul></ul><ul><ul><li>D:srchgtalk1b>hg commit </li></ul></ul><ul><ul><li>D:srchgtalk1b> </li></ul></ul>
  27. 27. ... es sieht gut aus <ul><ul><li>D:srchgtalk1b>hg st </li></ul></ul><ul><ul><li>D:srchgtalk1b>hg log </li></ul></ul><ul><ul><li>changeset: 1:4e94b6009d08 </li></ul></ul><ul><ul><li>tag: tip </li></ul></ul><ul><ul><li>user: Wieland </li></ul></ul><ul><ul><li>date: Sun Oct 12 23:45:13 2008 +0200 </li></ul></ul><ul><ul><li>summary: gesetz </li></ul></ul><ul><ul><li>changeset: 0:134e009f9517 </li></ul></ul><ul><ul><li>user: Wieland </li></ul></ul><ul><ul><li>date: Sun Oct 12 23:14:23 2008 +0200 </li></ul></ul><ul><ul><li>summary: start </li></ul></ul><ul><ul><li>D:srchgtalk1b> </li></ul></ul>
  28. 28. In 1 merken wir nichts, ... <ul><ul><li>D:srchgtalk1>hg diff </li></ul></ul><ul><ul><li>diff -r 134e009f9517 info1.pl </li></ul></ul><ul><ul><li>--- a/info1.pl Sun Oct 12 23:14:23 2008 +0200 </li></ul></ul><ul><ul><li>+++ b/info1.pl Sun Oct 12 23:47:16 2008 +0200 </li></ul></ul><ul><ul><li>@@ -1,4 +1,4 @@ </li></ul></ul><ul><ul><li>use strict; </li></ul></ul><ul><ul><li>-print &quot;Hg steht für: hydrargyrum, chemisches Symbol für Quecksilber &quot;; </li></ul></ul><ul><ul><li>+print &quot;Hg steht für: Mercurial &quot;; </li></ul></ul><ul><ul><li>D:srchgtalk1> </li></ul></ul>
  29. 29. ... auch nicht beim einchecken <ul><ul><li>D:srchgtalk1>hg ci -m &quot;hg4hg&quot; </li></ul></ul><ul><ul><li>D:srchgtalk1>hg log </li></ul></ul><ul><ul><li>changeset: 1:69fb82b0a16f </li></ul></ul><ul><ul><li>tag: tip </li></ul></ul><ul><ul><li>user: Wieland </li></ul></ul><ul><ul><li>date: Mon Oct 13 01:22:14 2008 +0200 </li></ul></ul><ul><ul><li>summary: hg4hg </li></ul></ul><ul><ul><li>changeset: 0:134e009f9517 </li></ul></ul><ul><ul><li>user: Wieland </li></ul></ul><ul><ul><li>date: Sun Oct 12 23:14:23 2008 +0200 </li></ul></ul><ul><ul><li>summary: start </li></ul></ul><ul><ul><li>D:srchgtalk1> </li></ul></ul>Öffnet nicht Editor für Kommentar
  30. 30. gleicher Anfang, anders weiter 1: 1b: v0 v0 v1 v1'
  31. 31. was hat 1b geändert? <ul><ul><li>D:srchgtalk1>hg incoming ..1b </li></ul></ul><ul><ul><li>comparing with ..1b </li></ul></ul><ul><ul><li>searching for changes </li></ul></ul><ul><ul><li>changeset: 1:4e94b6009d08 </li></ul></ul><ul><ul><li>tag: tip </li></ul></ul><ul><ul><li>user: Wieland </li></ul></ul><ul><ul><li>date: Sun Oct 12 23:45:13 2008 +0200 </li></ul></ul><ul><ul><li>summary: gesetz </li></ul></ul><ul><ul><li>D:srchgtalk1> </li></ul></ul>
  32. 32. wenn 1b noch geändert hat? <ul><ul><li>D:srchgtalk1>hg incoming ..1b </li></ul></ul><ul><ul><li>comparing with ..1b </li></ul></ul><ul><ul><li>searching for changes </li></ul></ul><ul><ul><li>changeset: 1:4e94b6009d08 </li></ul></ul><ul><ul><li>user: Wieland </li></ul></ul><ul><ul><li>date: Sun Oct 12 23:45:13 2008 +0200 </li></ul></ul><ul><ul><li>summary: gesetz </li></ul></ul><ul><ul><li>changeset: 2:3ceb703f893d </li></ul></ul><ul><ul><li>tag: tip </li></ul></ul><ul><ul><li>user: Wieland </li></ul></ul><ul><ul><li>date: Mon Oct 13 01:34:23 2008 +0200 </li></ul></ul><ul><ul><li>summary: !!! </li></ul></ul>
  33. 33. was genau hat 1b geändert? <ul><ul><li>D:srchgtalk1>hg incoming -p ..1b </li></ul></ul><ul><ul><li>comparing with ..1b </li></ul></ul><ul><ul><li>searching for changes </li></ul></ul><ul><ul><li>changeset: 1:4e94b6009d08 </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>diff -r 134e009f9517 -r 4e94b6009d08 info1.pl </li></ul></ul><ul><ul><li>--- a/info1.pl Sun Oct 12 23:14:23 2008 +0200 </li></ul></ul><ul><ul><li>+++ b/info1.pl Sun Oct 12 23:45:13 2008 +0200 </li></ul></ul><ul><ul><li>@@ -1,4 +1,5 @@ </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>changeset: 2:3ceb703f893d </li></ul></ul><ul><ul><li>tag: tip </li></ul></ul><ul><ul><li>... </li></ul></ul>
  34. 34. gleicher Anfang, anders weiter 1: 1b: v0 v0 v1 v1' v2'
  35. 35. von 1b holen <ul><ul><li>D:srchgtalk1>hg pull ..1b </li></ul></ul><ul><ul><li>pulling from ..1b </li></ul></ul><ul><ul><li>searching for changes </li></ul></ul><ul><ul><li>adding changesets </li></ul></ul><ul><ul><li>adding manifests </li></ul></ul><ul><ul><li>adding file changes </li></ul></ul><ul><ul><li>added 2 changesets with 2 changes to 1 files (+1 heads) </li></ul></ul><ul><ul><li>(run 'hg heads' to see heads, 'hg merge' to merge) </li></ul></ul><ul><ul><li>D:srchgtalk1> </li></ul></ul>
  36. 36. gleicher Anfang, anders weiter 1: 1b: v0 v0 v1 v1' v2' v3 tip heads tip head gleich verschieden Rep. wd
  37. 37. viele Köpfe <ul><ul><li>D:srchgtalk1>hg heads </li></ul></ul><ul><ul><li>changeset: 3:3ceb703f893d </li></ul></ul><ul><ul><li>tag: tip </li></ul></ul><ul><ul><li>user: Wieland </li></ul></ul><ul><ul><li>date: Mon Oct 13 01:34:23 2008 +0200 </li></ul></ul><ul><ul><li>summary: !!! </li></ul></ul><ul><ul><li>changeset: 1:69fb82b0a16f </li></ul></ul><ul><ul><li>user: Wieland </li></ul></ul><ul><ul><li>date: Mon Oct 13 01:22:14 2008 +0200 </li></ul></ul><ul><ul><li>summary: hg4hg </li></ul></ul><ul><ul><li>D:srchgtalk1> </li></ul></ul>
  38. 38. Konflikte lösen (hg merge)
  39. 39. ... im wd gelöst v0 v1 v2' v3
  40. 40. Knoten automatisch aufgelöst 1: 1b: v0 v0 v1 v1' v2' v3 tip heads tip head gleich verschieden Rep. wd
  41. 41. Ergebnis des Lösens <ul><ul><li>D:srchgtalk1>hg diff </li></ul></ul><ul><ul><li>diff -r 69fb82b0a16f info1.pl </li></ul></ul><ul><ul><li>--- a/info1.pl Mon Oct 13 01:22:14 2008 +0200 </li></ul></ul><ul><ul><li>+++ b/info1.pl Mon Oct 13 10:14:11 2008 +0200 </li></ul></ul><ul><ul><li>@@ -1,4 +1,5 @@ </li></ul></ul><ul><ul><li>use strict; </li></ul></ul><ul><ul><li>print &quot;Hg steht für: Mercurial &quot;; </li></ul></ul><ul><ul><li>+print &quot; oder auch für Hochschulgesetz !!! &quot;; </li></ul></ul><ul><ul><li>D:srchgtalk1> </li></ul></ul>
  42. 42. Ergebnis speichern <ul><ul><li>D:srchgtalk1>hg commit </li></ul></ul><ul><ul><li>D:srchgtalk1>hg st </li></ul></ul><ul><ul><li>D:srchgtalk1>hg log </li></ul></ul><ul><ul><li>changeset: 4:024fdf725d5d </li></ul></ul><ul><ul><li>tag: tip </li></ul></ul><ul><ul><li>parent: 1:69fb82b0a16f </li></ul></ul><ul><ul><li>parent: 3:3ceb703f893d </li></ul></ul><ul><ul><li>user: Wieland </li></ul></ul><ul><ul><li>date: Mon Oct 13 10:15:38 2008 +0200 </li></ul></ul><ul><ul><li>summary: beide Versionen zusammen </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>D:srchgtalk1> </li></ul></ul>
  43. 43. hg tip <ul><ul><li>D:srchgtalk1>hg log -r4 </li></ul></ul><ul><ul><li>changeset: 4:024fdf725d5d </li></ul></ul><ul><ul><li>tag: tip </li></ul></ul><ul><ul><li>parent: 1:69fb82b0a16f </li></ul></ul><ul><ul><li>parent: 3:3ceb703f893d </li></ul></ul><ul><ul><li>user: Wieland </li></ul></ul><ul><ul><li>date: Mon Oct 13 10:15:38 2008 +0200 </li></ul></ul><ul><ul><li>summary: beide Versionen zusammen </li></ul></ul><ul><ul><li>D:srchgtalk1>hg log -rtip </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>D:srchgtalk1>hg tip </li></ul></ul><ul><ul><li>... </li></ul></ul><ul><ul><li>D:srchgtalk1> </li></ul></ul>
  44. 44. so einfach ist mergen 1: 1b: v0 v0 v1 v1' v2' v3 tip head tip head gleich verschieden Rep. v4 pull merge
  45. 45. hgtk log
  46. 46. Änderungen schreiben <ul><ul><li>D:srchgtalk1> hg outgoing ..1b </li></ul></ul><ul><ul><li>D:srchgtalk1> hg push ..1b </li></ul></ul><ul><ul><li>Das ist zum Schreiben in ein Shared- </li></ul></ul><ul><ul><li>Repository (ohne Workdir). </li></ul></ul>
  47. 47. Änderungen austauschen <ul><ul><li>hg pull/push/clone - Abgleichen </li></ul></ul><ul><ul><li>hg export/import - Patches erz./einl </li></ul></ul><ul><ul><li>hg bundle/unbundle - kompr.Teil-Repos. </li></ul></ul><ul><ul><li>http://www.selenic.com/mercurial/wiki/index.cgi/CommunicatingChanges </li></ul></ul>
  48. 48. Wie soll man arbeiten? <ul><ul><li>z.B. </li></ul></ul><ul><ul><li>ein Dir „in“ (incomming) ohne wd (cache) </li></ul></ul><ul><ul><li>ein Dir „out“ (outgoing) </li></ul></ul><ul><ul><li>ein Dir für jeden Fix </li></ul></ul><ul><ul><li>1. Merge often! (in und fixes) </li></ul></ul><ul><ul><li>2. Commit early and commit often </li></ul></ul><ul><ul><li>http://www.selenic.com/mercurial/wiki/index.cgi/WorkingPractices </li></ul></ul>
  49. 49. Hybrid – warum zweimal? <ul><ul><li>Ein Projekt mit SVN und HG gleichzeitig. </li></ul></ul><ul><ul><li>HG lokal </li></ul></ul><ul><ul><li>z.B. SVN/GIT für den Rest der Welt </li></ul></ul><ul><ul><li>Vorteile von beiden Systemen, </li></ul></ul><ul><ul><li>wenn man es braucht. </li></ul></ul>
  50. 50. Keyword Extension <ul><ul><li>In Textdateien z.B. $Id$ ersetzen mit </li></ul></ul><ul><ul><li>$Id: prog.pl rev:hash date time user $ </li></ul></ul><ul><ul><li># .hg/hgrc </li></ul></ul><ul><ul><li>[extensions] </li></ul></ul><ul><ul><li>hgext.keyword= </li></ul></ul>
  51. 51. Keyword Extension <ul><ul><li># .hg/hgrc </li></ul></ul><ul><ul><li>[keyword] </li></ul></ul><ul><ul><li># expand keywords in all perl files </li></ul></ul><ul><ul><li>**.pl = </li></ul></ul><ul><ul><li>[keywordmaps] </li></ul></ul><ul><ul><li>Date = {date|utcdate} </li></ul></ul><ul><ul><li>Id = {file|basename} {rev}:{node|short} {date|utcdate} {author|user} </li></ul></ul><ul><ul><li>Rev = {node|short} </li></ul></ul><ul><ul><li>Node = {node} </li></ul></ul>
  52. 52. Keyword Extension <ul><ul><li># demo.pl </li></ul></ul><ul><ul><li>Date = $Date$ </li></ul></ul><ul><ul><li>Id = $Id$ </li></ul></ul><ul><ul><li>Rev = $Rev$ </li></ul></ul><ul><ul><li>Node = $Node$ </li></ul></ul><ul><ul><li>D:srchgtalk1>hg add demo.pl </li></ul></ul><ul><ul><li>D:srchgtalk1>hg kwexpand </li></ul></ul><ul><ul><li>abort: outstanding uncommitted changes in given files </li></ul></ul>
  53. 53. Keyword Extension <ul><ul><li>D:srchgtalk1>hg commit -m &quot;add kw&quot; </li></ul></ul><ul><ul><li>D:srchgtalk1>hg kwexpand </li></ul></ul><ul><ul><li>D:srchgtalk1>type demo.pl </li></ul></ul><ul><ul><li>Date = $Date: 2008/11/18 10:11:30 $ </li></ul></ul><ul><ul><li>Id = $Id: demo.pl 12:5bd2c929da87 2008/11/18 10:11:30 Wieland $ </li></ul></ul><ul><ul><li>Rev = $Rev: 5bd2c929da87 $ </li></ul></ul><ul><ul><li>Node = $Node: 5bd2c929da87c55e3761778...$ </li></ul></ul>Zeit ist UTC, weil utcdate sonst isodate !
  54. 54. Keyword Extension <ul><ul><li>hg kwshrink </li></ul></ul><ul><ul><li>hg kwexpand </li></ul></ul><ul><ul><li>bei &quot;hg ci&quot; wird automatisch aktualisiert </li></ul></ul><ul><ul><li>http://www.selenic.com/mercurial/wiki/index.cgi/KeywordExtension </li></ul></ul><ul><ul><li>keywords: .../hgbookch11.html </li></ul></ul>Vor und nach Änderungen der Keywords z.B. Ein-/Ausschalten
  55. 55. Klon über http erzeugen <ul><ul><li>D:srchgtalk>hg clone http://hg.serpentine.com/tutorial/hello </li></ul></ul><ul><ul><li>destination directory: hello </li></ul></ul><ul><ul><li>requesting all changes </li></ul></ul><ul><ul><li>adding changesets </li></ul></ul><ul><ul><li>adding manifests </li></ul></ul><ul><ul><li>adding file changes </li></ul></ul><ul><ul><li>added 5 changesets with 5 changes to 2 files </li></ul></ul><ul><ul><li>updating working directory </li></ul></ul><ul><ul><li>2 files updated, 0 files merged, 0 files removed, 0 files unresolved </li></ul></ul><ul><ul><li>D:srchgtalk> </li></ul></ul>
  56. 56. Klon ohne WD <ul><ul><li>D:srchgtalk>hg clone -U 1 public </li></ul></ul><ul><ul><li>z.B. für Shared-Repository </li></ul></ul>
  57. 57. Literatur: hg book (the book) <ul><ul><li>“ Distributed revision control with Mercurial”, by Bryan O'Sullivan </li></ul></ul><ul><ul><li>http://hgbook.red-bean.com/ </li></ul></ul>
  58. 58. Links <ul><li>http://www.selenic.com/mercurial/wiki/ </li></ul><ul><li>http://tortoisehg.sourceforge.net/ </li></ul><ul><li>Talk von Bryan O'Sullivan http://www.youtube.com/watch?v=1sV8Z_Lmpt4 </li></ul><ul><li>Talk von Linus Torvalds http://www.youtube.com/watch?v=4XpnKHJAok8 </li></ul><ul><li>Talk von Randal Schwartz http://www.youtube.com/watch?v=8dhZ9BXQgc4 </li></ul>
  59. 59. Links II Referenzkarten <ul><li>DongWoo Lee: Mercurial Cheat Sheet http://edong.net/2008v1/docs/dongwoo-Hg-120dpi.png </li></ul><ul><li>Mercurial-QuickStart + Mercurial-Usage http://www.ivy.fr/mercurial/ref/v1.0/ </li></ul>
  60. 60. Fragen?
  61. 61. Danke!

×