Commits

Takumi IINO committed 3bfa1ca

リビジョングラフの画像化

Comments (0)

Files changed (1)

 
 例として、次のリポジトリを2人(Alice, Bob)で作業した場合を考えます。
 
-  ::
+  .. graphviz::
 
-    @    1:f8148c10efce:default
-    |    README 更新
-    |
-    o    0:ec60efd545e6:default
-         initial import
-    
-    中央リポジトリ
-    
-    図 リポジトリ
+    digraph {
+      rankdir="BT"
+      c_0 [ label = "0" ]
+      c_1 [ label = "1" ]
+
+      subgraph cluster_central {
+        label = "Central Repository";
+	c_0
+        c_1
+      }
+
+      c_0 -> c_1
+    }
 
 まず作業するためにAliceとBobがリポジトリを複製(hg clone)します。
 
-  ::
+  .. graphviz::
 
-    @    1:f8148c10efce:default       @    1:f8148c10efce:default        @    1:f8148c10efce:default
-    |    README 更新                  |    README 更新                   |    README 更新
-    |                                 |                                  |
-    o    0:ec60efd545e6:default       o    0:ec60efd545e6:default        o    0:ec60efd545e6:default
-         initial import                    initial import                     initial import
-    
-    中央リポジトリ                    Aliceリポジトリ                    Bobリポジトリ
-    
-    図 クローン
+    digraph {
+      rankdir="BT"
+      c_0 [ label = "0" ]
+      c_1 [ label = "1" ]
+
+      a_0 [ label = "0" ]
+      a_1 [ label = "1" peripheries = 2 ]
+
+      b_0 [ label = "0" ]
+      b_1 [ label = "1" peripheries = 2 ]
+
+      subgraph cluster_central {
+        label = "Central Repository";
+	c_0
+        c_1
+      }
+
+      subgraph cluster_alice {
+        label = "Alice's Repository";
+	a_0
+        a_1
+      }
+
+      subgraph cluster_bob {
+        label = "Bob's Repository";
+	b_0
+        b_1
+      }
+
+      c_0 -> c_1
+      a_0 -> a_1
+      b_0 -> b_1
+    }
 
 Aliceが先に編集してコミットしました。
 
-  ::
+  .. graphviz::
 
-                                      @    2:501185e47b97:default
-                                      |    index.htmlにメニューを追加
-                                      |
-    @    1:f8148c10efce:default       o    1:f8148c10efce:default        @    1:f8148c10efce:default
-    |    README 更新                  |    README 更新                   |    README 更新
-    |                                 |                                  |
-    o    0:ec60efd545e6:default       o    0:ec60efd545e6:default        o    0:ec60efd545e6:default
-         initial import                    initial import                     initial import
-    
-    中央リポジトリ                    Aliceリポジトリ                    Bobリポジトリ
-    
-    図 Aliceは手が早い
+    digraph {
+      rankdir="BT"
+      c_0 [ label = "0" ]
+      c_1 [ label = "1" ]
+
+      a_0 [ label = "0" ]
+      a_1 [ label = "1" ]
+      a_2 [ label = "A" peripheries = 2 style = "filled" fillcolor = "yellow" ]
+
+      b_0 [ label = "0" ]
+      b_1 [ label = "1" peripheries = 2 ]
+
+      subgraph cluster_central {
+        label = "Central Repository";
+	c_0
+        c_1
+      }
+
+      subgraph cluster_alice {
+        label = "Alice's Repository";
+	a_0
+        a_1
+        a_2
+      }
+
+      subgraph cluster_bob {
+        label = "Bob's Repository";
+	b_0
+        b_1
+      }
+
+      c_0 -> c_1
+      a_0 -> a_1 -> a_2
+      b_0 -> b_1
+    }
 
 Bobも編集を加えてコミットしました。
 
-  ::
+  .. graphviz::
 
-                                      @    2:501185e47b97:default        @    2:bd6a69bda4c6:default
-                                      |    index.htmlにメニューを追加    |    画像ファイルサイズ圧縮
-                                      |                                  |
-    @    1:f8148c10efce:default       o    1:f8148c10efce:default        o    1:f8148c10efce:default
-    |    README 更新                  |    README 更新                   |    README 更新
-    |                                 |                                  |
-    o    0:ec60efd545e6:default       o    0:ec60efd545e6:default        o    0:ec60efd545e6:default
-         initial import                    initial import                     initial import
-    
-    中央リポジトリ                    Aliceリポジトリ                    Bobリポジトリ
-    
-    図 Bobの作業は手がかかる
+    digraph {
+      rankdir="BT"
+      c_0 [ label = "0" ]
+      c_1 [ label = "1" ]
+
+      a_0 [ label = "0" ]
+      a_1 [ label = "1" ]
+      a_2 [ label = "A" peripheries = 2 style = "filled" fillcolor = "yellow" ]
+
+      b_0 [ label = "0" ]
+      b_1 [ label = "1" ]
+      b_2 [ label = "B" peripheries = 2 style = "filled" fillcolor = "green" ]
+
+      subgraph cluster_central {
+        label = "Central Repository";
+	c_0
+        c_1
+      }
+
+      subgraph cluster_alice {
+        label = "Alice's Repository";
+	a_0
+        a_1
+        a_2
+      }
+
+      subgraph cluster_bob {
+        label = "Bob's Repository";
+	b_0
+        b_1
+        b_2
+      }
+
+      c_0 -> c_1
+      a_0 -> a_1 -> a_2
+      b_0 -> b_1 -> b_2
+    }
 
 Aliceは作業が完了したのでみんなに見てもらうように中央リポジトリに変更を反映します。(hg push)
 
-  ::
+  .. graphviz::
 
-    @    2:501185e47b97:default       @    2:501185e47b97:default        @    2:bd6a69bda4c6:default
-    |    index.htmlにメニューを追加   |    index.htmlにメニューを追加    |    画像ファイルサイズ圧縮
-    |                                 |                                  |
-    o    1:f8148c10efce:default       o    1:f8148c10efce:default        o    1:f8148c10efce:default
-    |    README 更新                  |    README 更新                   |    README 更新
-    |                                 |                                  |
-    o    0:ec60efd545e6:default       o    0:ec60efd545e6:default        o    0:ec60efd545e6:default
-         initial import                    initial import                     initial import
-    
-    中央リポジトリ                    Aliceリポジトリ                    Bobリポジトリ
-    
-    図 Aliceの変更を中央リポジトリに反映
+    digraph {
+      rankdir="BT"
+      c_0 [ label = "0" ]
+      c_1 [ label = "1" ]
+      c_2 [ label = "A" style = "filled" fillcolor = "yellow" ]
+
+      a_0 [ label = "0" ]
+      a_1 [ label = "1" ]
+      a_2 [ label = "A" peripheries = 2 style = "filled" fillcolor = "yellow" ]
+
+      b_0 [ label = "0" ]
+      b_1 [ label = "1" ]
+      b_2 [ label = "B" peripheries = 2 style = "filled" fillcolor = "green" ]
+
+      subgraph cluster_central {
+        label = "Central Repository";
+	c_0
+        c_1
+        c_2
+      }
+
+      subgraph cluster_alice {
+        label = "Alice's Repository";
+	a_0
+        a_1
+        a_2
+      }
+
+      subgraph cluster_bob {
+        label = "Bob's Repository";
+	b_0
+        b_1
+        b_2
+      }
+
+      c_0 -> c_1 -> c_2
+      a_0 -> a_1 -> a_2
+      b_0 -> b_1 -> b_2
+    }
 
 Bobも作業が完了したのでみんなに見てもらうように中央リポジトリに変更を反映します。(hg push)
 が、実はここで変更を反映する事が出来ません(演習で体験する事になると思います)。
 理由は、中央リポジトリにマルチプルヘッドが作成されてしまうからです。
 
-  ::
+  .. graphviz::
 
-    @    2:501185e47b97:default       @    2:501185e47b97:default        @    2:bd6a69bda4c6:default
-    |    index.htmlにメニューを追加   |    index.htmlにメニューを追加    |    画像ファイルサイズ圧縮
-    |                                 |                                  |
-    o    1:f8148c10efce:default       o    1:f8148c10efce:default        o    1:f8148c10efce:default
-    |    README 更新                  |    README 更新                   |    README 更新
-    |                                 |                                  |
-    o    0:ec60efd545e6:default       o    0:ec60efd545e6:default        o    0:ec60efd545e6:default
-         initial import                    initial import                     initial import
-    
-    中央リポジトリ                    Aliceリポジトリ                    Bobリポジトリ
-    
-    図 この状態でBobの変更を中央リポジトリに反映する事は出来ない
+    digraph {
+      rankdir="BT"
+      c_0 [ label = "0" ]
+      c_1 [ label = "1" ]
+      c_2 [ label = "A" style = "filled" fillcolor = "yellow" ]
+      c_3 [ label = "B" style = "filled, dotted" fillcolor = "greenyellow" ]
+
+      a_0 [ label = "0" ]
+      a_1 [ label = "1" ]
+      a_2 [ label = "A" peripheries = 2 style = "filled" fillcolor = "yellow" ]
+
+      b_0 [ label = "0" ]
+      b_1 [ label = "1" ]
+      b_2 [ label = "B" peripheries = 2 style = "filled" fillcolor = "green" ]
+
+      subgraph cluster_central {
+        label = "Central Repository";
+	c_0
+        c_1
+        c_2
+        c_3
+      }
+
+      subgraph cluster_alice {
+        label = "Alice's Repository";
+	a_0
+        a_1
+        a_2
+      }
+
+      subgraph cluster_bob {
+        label = "Bob's Repository";
+	b_0
+        b_1
+        b_2
+      }
+
+      c_0 -> c_1 -> c_2
+      c_1 -> c_3
+      a_0 -> a_1 -> a_2
+      b_0 -> b_1 -> b_2
+    }
 
 Bobは中央リポジトリに自分の変更を反映する事は出来ませんが、中央リポジトリの変更を取り込むことが出来ます。(hg pull)
 試して見ましょう。
 
-  ::
+  .. graphviz::
 
-                                                                         o    3:501185e47b97:default
-                                                                         |    index.htmlにメニューを追加
-                                                                         |
-    @    2:501185e47b97:default       @    2:501185e47b97:default        | @  2:bd6a69bda4c6:default
-    |    index.htmlにメニューを追加   |    index.htmlにメニューを追加    |/   画像ファイルサイズ圧縮
-    |                                 |                                  |
-    o    1:f8148c10efce:default       o    1:f8148c10efce:default        o    1:f8148c10efce:default
-    |    README 更新                  |    README 更新                   |    README 更新
-    |                                 |                                  |
-    o    0:ec60efd545e6:default       o    0:ec60efd545e6:default        o    0:ec60efd545e6:default
-         initial import                    initial import                     initial import
-    
-    中央リポジトリ                    Aliceリポジトリ                    Bobリポジトリ
-    
-    図 Bobリポジトリに中央リポジトリの変更を取り込む
+    digraph {
+      rankdir="BT"
+      c_0 [ label = "0" ]
+      c_1 [ label = "1" ]
+      c_2 [ label = "A" style = "filled" fillcolor = "yellow" ]
+
+      a_0 [ label = "0" ]
+      a_1 [ label = "1" ]
+      a_2 [ label = "A" peripheries = 2 style = "filled" fillcolor = "yellow" ]
+
+      b_0 [ label = "0" ]
+      b_1 [ label = "1" ]
+      b_2 [ label = "B" peripheries = 2 style = "filled" fillcolor = "green" ]
+      b_3 [ label = "A" style = "filled" fillcolor = "yellow" ]
+
+      subgraph cluster_central {
+        label = "Central Repository";
+	c_0
+        c_1
+        c_2
+      }
+
+      subgraph cluster_alice {
+        label = "Alice's Repository";
+	a_0
+        a_1
+        a_2
+      }
+
+      subgraph cluster_bob {
+        label = "Bob's Repository";
+	b_0
+        b_1
+        b_2
+        b_3
+      }
+
+      c_0 -> c_1 -> c_2
+      a_0 -> a_1 -> a_2
+      b_0 -> b_1 -> b_2
+      b_1 -> b_3
+    }
 
 マルチプルヘッドが出来てしまいました。
 
-グラフを統合する作業をもう少し詳しく見てみます。
-
-Bobのリポジトリと中央リポジトリの「リビジョン1:f8148c10efce」は共通で、Bobのリポジトリには「リビジョン2:501185e47b97」は存在しません。
-
-「リビジョン2:501185e47b97」をBobのリポジトリに取り込む場合も「リビジョン1:f8148c10efce」の子として取り込まれる必要が有ります。
-(子として取り込まないと、中央リポジトリと親子関係が異なってしまいます)
-
-その結果、次の様なグラフが作成されます。
-
-  ::
-
-                                                                                     o    3:501185e47b97:default
-                                                                                     |    index.htmlにメニューを追加
-                                                                                     |
-    @    2:501185e47b97:default              @    2:bd6a69bda4c6:default             | @  2:bd6a69bda4c6:default
-    |    index.htmlにメニューを追加          |    画像ファイルサイズ圧縮             |/   画像ファイルサイズ圧縮
-    |                                 |      |                              ----     |
-    o    1:f8148c10efce:default     --+--    o    1:f8148c10efce:default             o    1:f8148c10efce:default
-    |    README 更新                  |      |    README 更新               ----     |    README 更新
-    |                                        |                                       |
-    o    0:ec60efd545e6:default              o    0:ec60efd545e6:default             o    0:ec60efd545e6:default
-         initial import                           initial import                          initial import
-    
-    中央リポジトリ                           Bobリポジトリ                           新Bobリポジトリ
-    
-    図 中央リポジトリ + Bobリポジトリ = 新Bobリポジトリ
-
 マージ
 ------
 マルチプルヘッドの様に、二つの分離してしまった履歴を統合する作業をマージと呼びます。
 
 マージ手順例
 ^^^^^^^^^^^^^^^^^^^^
-先ほどの新Bobリポジトリでマージを行うと次の様になります。
+先ほどの新Bobリポジトリでマージ(hg merge)を行うと次の様になります。
 
-  ::
+  .. graphviz::
 
-    @    3:501185e47b97:default
-    |    index.htmlにメニューを追加
-    |
-    | @  2:bd6a69bda4c6:default
-    |/   画像ファイルサイズ圧縮
-    |
-    o    1:f8148c10efce:default
-    |    README 更新
-    |
-    o    0:ec60efd545e6:default
-         initial import
+    digraph {
+      rankdir="BT"
+      b_0 [ label = "0" ]
+      b_1 [ label = "1" ]
+      b_2 [ label = "B" peripheries = 2 style = "filled" fillcolor = "green" ]
+      b_3 [ label = "A" peripheries = 2 style = "filled" fillcolor = "yellow" ]
 
-    図 新Bobリポジトリでマージしてみる
+      subgraph cluster_bob {
+        label = "Bob's Repository";
+	b_0
+        b_1
+        b_2
+        b_3
+      }
 
-「@」が増えました、これは現在の作業領域がリビジョン2:bd6a69bda4c6とリビジョン3:501185e47b97の内容を含んでいるという事を表しています。
+      b_0 -> b_1 -> b_2
+      b_1 -> b_3
+    }
+
+「二重丸」が増えました、これは現在の作業領域がリビジョンBとリビジョンAの内容を含んでいるという事を表しています。
 この状態でコミットすると、マージ完了です。
 
-  ::
+  .. graphviz::
 
-    @    4:d7553b7b7e59:default
-    |\   マージ
-    | |
-    o |  3:501185e47b97:default
-    | |  index.htmlにメニューを追加
-    | |
-    | o  2:bd6a69bda4c6:default
-    |/   画像ファイルサイズ圧縮
-    |
-    o    1:f8148c10efce:default
-    |    README 更新
-    |
-    o    0:ec60efd545e6:default
-         initial import
+    digraph {
+      rankdir="BT"
+      b_0 [ label = "0" ]
+      b_1 [ label = "1" ]
+      b_2 [ label = "B" style = "filled" fillcolor = "green" ]
+      b_3 [ label = "A" style = "filled" fillcolor = "yellow" ]
+      b_4 [ label = "C" peripheries = 2 style = "filled" fillcolor = "cyan" ]
 
-    図 新Bobリポジトリでマージをコミット
+      subgraph cluster_bob {
+        label = "Bob's Repository";
+	b_0
+        b_1
+        b_2
+        b_3
+        b_4
+      }
+
+      b_0 -> b_1 -> b_2 -> b_4
+      b_1 -> b_3 -> b_4
+    }
 
 この状態で初めて中央リポジトリに変更を反映できます。
 
-  ::
+  .. graphviz::
 
-    @    4:d7553b7b7e59:default                                          @    4:d7553b7b7e59:default
-    |\   マージ                                                          |\   マージ
-    | |                                                                  | |
-    | o  3:bd6a69bda4c6:default                                          o |  3:501185e47b97:default
-    | |  画像ファイルサイズ圧縮                                          | |  index.htmlにメニューを追加
-    | |                                                                  | |
-    o |  2:501185e47b97:default       @    2:501185e47b97:default        | o  2:bd6a69bda4c6:default
-    |/   index.htmlにメニューを追加   |    index.htmlにメニューを追加    |/   画像ファイルサイズ圧縮
-    |                                 |                                  |
-    o    1:f8148c10efce:default       o    1:f8148c10efce:default        o    1:f8148c10efce:default
-    |    README 更新                  |    README 更新                   |    README 更新
-    |                                 |                                  |
-    o    0:ec60efd545e6:default       o    0:ec60efd545e6:default        o    0:ec60efd545e6:default
-         initial import                    initial import                     initial import
+    digraph {
+      rankdir="BT"
+      c_0 [ label = "0" ]
+      c_1 [ label = "1" ]
+      c_2 [ label = "A" style = "filled" fillcolor = "yellow" ]
+      c_3 [ label = "B" style = "filled" fillcolor = "green" ]
+      c_4 [ label = "C" style = "filled" fillcolor = "cyan" ]
 
-    中央リポジトリ                    Aliceリポジトリ                    Bobリポジトリ
-    
-    図 Bobリポジトリのマージの成果を中央リポジトリの変更を取り込む
+      a_0 [ label = "0" ]
+      a_1 [ label = "1" ]
+      a_2 [ label = "A" peripheries = 2 style = "filled" fillcolor = "yellow" ]
+
+      b_0 [ label = "0" ]
+      b_1 [ label = "1" ]
+      b_2 [ label = "B" style = "filled" fillcolor = "green" ]
+      b_3 [ label = "A" style = "filled" fillcolor = "yellow" ]
+      b_4 [ label = "C" peripheries = 2 style = "filled" fillcolor = "cyan" ]
+
+      subgraph cluster_central {
+        label = "Central Repository";
+	c_0
+        c_1
+        c_2
+        c_3
+        c_4
+      }
+
+      subgraph cluster_alice {
+        label = "Alice's Repository";
+	a_0
+        a_1
+        a_2
+      }
+
+      subgraph cluster_bob {
+        label = "Bob's Repository";
+	b_0
+        b_1
+        b_2
+        b_3
+        b_4
+      }
+
+      c_0 -> c_1 -> c_2 -> c_4
+      c_1 -> c_3 -> c_4
+      a_0 -> a_1 -> a_2
+      b_0 -> b_1 -> b_2 -> b_4
+      b_1 -> b_3 -> b_4
+    }
 
 コミット済み成果ベースのマージ
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 しかしこれはとても安全な方法なのです。
 
 AliceとBobの操作をSubversionで行った場合は次のようなグラフになるでしょう。
-Subversionの場合は「Subversionが自動的にマージした変更」がそのままコミットされます。
 
-  ::
+リビジョンAの次はリビジョンBではなく実はリビジョンCが作成されます。これは「Subversionが自動的にマージした変更」がそのままコミットされているからです。
 
-    o   3:bd6a69bda4c6:default <-- 実は「Subversionが自動的にマージした変更」
-    |    画像ファイルサイズ圧縮
-    |
-    o    2:501185e47b97:default
-    |    index.htmlにメニューを追加
-    |
-    o    1:f8148c10efce:default
-    |    README 更新
-    |
-    o    0:ec60efd545e6:default
-         initial import
-    
-    中央リポジトリ
+  .. graphviz::
 
-    図 Subversionの場合の中央リポジトリ
+    digraph {
+      rankdir="BT"
+      c_0 [ label = "0" ]
+      c_1 [ label = "1" ]
+      c_2 [ label = "A" style = "filled" fillcolor = "yellow" ]
+      c_4 [ label = "C" style = "filled" fillcolor = "cyan" ]
+
+      subgraph cluster_central {
+        label = "Central Repository";
+	c_0
+        c_1
+        c_2
+        c_4
+      }
+
+      c_0 -> c_1 -> c_2 -> c_4
+    }
 
 これは次の点で不便です。
 
 
 Mercurialの場合を再度確認してみましょう。
 
-  ::
+  .. graphviz::
 
-    @    4:d7553b7b7e59:default
-    |\   マージ
-    | |
-    o |  3:501185e47b97:default
-    | |  index.htmlにメニューを追加
-    | |
-    | o  2:bd6a69bda4c6:default
-    |/   画像ファイルサイズ圧縮
-    |
-    o    1:f8148c10efce:default
-    |    README 更新
-    |
-    o    0:ec60efd545e6:default
-         initial import
-    
-    Bobのリポジトリ
-    
-    図 Mercurialの場合のBobリポジトリ(中央リポジトリに反映前)
+    digraph {
+      rankdir="BT"
+      b_0 [ label = "0" ]
+      b_1 [ label = "1" ]
+      b_2 [ label = "B" style = "filled" fillcolor = "green" ]
+      b_3 [ label = "A" style = "filled" fillcolor = "yellow" ]
+      b_4 [ label = "C" peripheries = 2 style = "filled" fillcolor = "cyan" ]
+
+      subgraph cluster_bob {
+        label = "Bob's Repository";
+	b_0
+        b_1
+        b_2
+        b_3
+        b_4
+      }
+
+      b_0 -> b_1 -> b_2 -> b_4
+      b_1 -> b_3 -> b_4
+    }
 
 Mercurialではマルチプルヘッドをマージしています。この方法を「コミット済み成果ベースのマージ」と呼びます。