次世代バージョン管理システムの基礎となる堅牢なアーキテクチャ「Manyana」、CRDTの利用によりマージやリベースに強みを発揮

バージョン管理システムの歴史は1972年のSCCS(Source Code Control System)から始まり現在ではGitが主流となっています。長い歴史の中でバージョン管理システムはどんどん便利になりましたが、「今後はどのように進化していくのだろうか」という疑問に対する回答ともいえる、次世代のバージョン管理システムを構成するアーキテクチャの候補として「Manyana」というプロジェクトが注目されています。
bramcohen/manyana
https://github.com/bramcohen/manyana
Manyana - by Bram Cohen - Bram’s Thoughts
https://bramcohen.com/p/manyana
Bram Cohen氏が開発したManyanaの特徴はCRDT(Conflict-free Replicated Data Type)を利用することが挙げられます。CRDTは「競合のない複製データ型」を意味しており、バージョン管理システムでCRDTを利用することにより定義上マージが必ず成功するという特性を得ることが期待できます。言い換えると従来のバージョン管理システムではコンフリクトの解決に失敗するような事態を回避できるということです。Manyanaは変更が互いに影響し合う状況で「コンフリクト」フラグを立てることにより、決してコンフリクトの解決を失敗しない上に有益なコンフリクト情報を提示することができます。
従来のバージョン管理システムではコンフリクトが発生した場合、状況によっては「何が起こったのか」を推理しなくてはならないケースが起こり得ます。わかりやすい例として、以下に示す関数に対して2人が同時に編集した結果をマージするケースを想定してみます。
def calculate(x):
a = x * 2
b = a + 1
return b
上記の関数について1人は関数自体を削除し、もう1人は関数の中にデバッグ出力を追加したものとします。すると従来のバージョン管理システムでは以下のような結果になります。
<<<<<<< left
=======
def calculate(x):
a = x * 2
logger.debug(f"a={a}")
b = a + 1
return b
>>>>>>> right
上記だけを見て何が発生したのかを瞬時に理解するのは難しいですが、Manyanaでは以下のように表示されます。
<<<<<<< begin deleted left
def calculate(x):
a = x * 2
======= begin added right
logger.debug(f"a={a}")
======= begin deleted left
b = a + 1
return b
>>>>>>> end conflict
上記の情報ならば「一方では関数が丸ごと削除された」「一方では関数中にデバッグ出力の一行が追加された」ということが一目で理解できるため、コンフリクトの内容をより把握しやすくなっています。作業者にゆだねられる判断は「どちらの変更を採用するのか」という一点に絞られるのでコンフリクトの解決もより簡単になります。
CRDTを導入することによりバージョン管理システムが得られるものは「結果整合性」です。結果整合性とは「すべてのユーザーが同じデータを見られるようになること」を意味しており、マージが決して失敗することはなくマージの順序にかかわらず結果は常に同じになることが保証されます。したがって、バージョン管理の様々な局面で以下の効果が得られます。
・行の順序の固定化:挿入されたコードの順序はCRDTによって決定・維持されるため、異なるブランチで解決順序が違うことで発生し得る問題を防止する
・競合は情報提供のためのもの:競合は解決の失敗を意味するものではなくなり、ユーザーに「各操作の履歴」という情報を提供するためのものとなる
・構造化された履歴:CRDTは操作の履歴を構造化された形式で保持し提供するため、変更前の状態を探したりDAGを辿ったりせずとも常に正しい結果が得られる

とりわけCohen氏が期待しているアイデアは「リベースの改善」です。従来のリベースでは最新のメインコミットに対して自分の変更を適用する場合、最新のメインコミットの上にコミットが行われたという架空の履歴が作成されるため、本来の履歴が破壊されてしまうことになります。Gitでリベース操作を原則的にローカルリポジトリ内で完結させなければいけない理由がまさに履歴の破壊にあります。CRDTを利用するとリベースの際に必要な追加要素はDAGに「最も重要な先祖コミット」という情報を追加してやるだけとなるため、リベースによって履歴が破壊されることはなくなります。
Manyanaは記事作成時点では個々のファイルを対象として最低限の動作をする約470行のPythonコードで構成されたデモ版の位置付けであり、まだ本格的なバージョン管理システムではありません。しかしながら、CRDTを利用することでマージやコンフリクトに強いバージョン管理システムの基礎となる堅牢なアーキテクチャを構築できることを十分示しており、Manyanaは今後の展開に期待が持てるプロジェクトです。
・関連記事
妻のパン屋のために作ったERP「Craftplan」、小ロットの受注生産を念頭にワークフローが設計されておりオープンソースでセルフホスト可能 - GIGAZINE
GitをCUIで強力にサポートする超高機能ツール「lazygit」 - GIGAZINE
GitHubのコードレビュー用ヒートマップを付けてくれるdiffビューア「0github.com」 - GIGAZINE
SQLiteがバージョン管理システムとしてGitを採用しない理由 - GIGAZINE
混乱を引き起こしがちなGitの用語まとめ - GIGAZINE
Gitを利用してブログ・サイトのバージョンを管理できる開発者向けのヘッドレスCMS「TinaCMS」を使ってみた - GIGAZINE
Gitコマンドの結果一体どうなるのかをすばやくアニメーション画像を生成して視覚的にわかりやすく見せてくれる「git-sim」 - GIGAZINE
・関連コンテンツ
in ソフトウェア, Posted by log1c_sh
You can read the machine translated English article Manyana, a robust architecture that form….







