1 ポイント 投稿者 GN⁺ 2026-03-23 | 1件のコメント | WhatsAppで共有
  • Manyana は Bram Cohen が開発した CRDT ベースのバージョン管理プロトタイプで、マージコンフリクトをなくし、履歴を構造的に保存する新しいアプローチを提示している
  • CRDT(Conflict-Free Replicated Data Type) を活用することでマージは常に成功し、コンフリクトは単なる 情報表示として扱われる ため、ユーザーは変更内容を明確に認識できる
  • 行順序の永続性非ブロッキングなマージ履歴の内在化 を中核とし、リベースの過程でも既存の記録を破壊しない
  • 470 行の Python コードで書かれたデモレベルの実装で、全コードと設計文書が パブリックドメイン として GitHub で公開されている
  • Git の限界を超える マージ失敗のない次世代バージョン管理モデル を実験的に提示した事例

Manyana: バージョン管理の未来に向けた一貫したビジョン

  • Manyana は Bram Cohen が公開した CRDT ベースのバージョン管理システムのプロトタイプで、既存システムのマージコンフリクト問題を解決しようとする試みである
  • CRDT はマージが常に成功することを保証し、コンフリクトを情報的な表示として扱う ことで、ユーザーが実際の変更内容を明確に確認できるようにする
  • このアプローチは 行順序の永続性非ブロッキングなコンフリクト処理構造内への履歴の内在化 という 3 つの中核的特性を持つ
  • リベース(rebase) の過程でも既存の履歴を維持し、単一の共通祖先がない複雑なマージ構造も安定して処理できる
  • Manyana は約 470 行の Python コードで書かれた デモ実装 であり、設計文書とコードは パブリックドメイン として GitHub で公開されている

CRDT ベースアプローチの核心

  • CRDT は マージが常に成功 し、マージ順序に関係なく同じ結果を保証する eventual consistency を提供する
    • 複数のユーザーが独立して作業したブランチをどの順序でマージしても、結果は同一に保たれる
  • 行順序の永続性 により、同じ位置に挿入されたコードの順序は一度決まるとその後も維持される
    • これにより、ブランチごとにコンフリクト区間の解決結果が異なってしまう問題を防げる
  • コンフリクトは情報提供用の表示としてのみ扱われ、マージを妨げない
    • マージ結果は常に生成され、コンフリクトは「近い位置で同時に変更された部分」として表示される
    • 各変更の主体と内容を追跡することで、有用なコンフリクト表示 を提供する
  • 履歴が構造の中に内在している
    • ファイルの全行を含む 「weave」構造 で状態を表現し、各行に追加・削除時点のメタデータを含める
    • マージ時には共通祖先を探したり DAG を探索したりすることなく、2 つの状態を入力すれば常に正しい結果が生成される

改善されたコンフリクト表示

  • 既存のバージョン管理システムでは、コンフリクト時に単に 2 つのコードブロックを並べて表示するため、ユーザーが自分で差分を推測しなければならない
  • Manyana は各コンフリクト区間を 「削除された」「追加された」 などと明示し、誰がどの変更を行ったのか を表示する
    • たとえば、あるユーザーが関数を削除し、別のユーザーがその関数内部に 1 行を追加した場合、Manyana は各変更の構造を明確に区別して見せる
    • これによりユーザーは 2 つのブロックを比較する代わりに、変更の意味と文脈を即座に把握 できる

リベースの再定義

  • CRDT ベースのシステムでは、リベースは 履歴を破壊しない
    • 従来のリベースはコミットを新しいベースの上に積み直し、架空の履歴を生成する
    • Manyana では同じ効果を得つつ、元の履歴をすべて維持 する
  • そのためには DAG に 「主要祖先(primary ancestor)」 の注釈を追加するだけで十分である
  • この方式は 共通祖先のないマージ構造 でも安定して動作し、従来の 3-way マージの失敗を避けられる

プロジェクトの現在の状態

  • Manyana は 完全なバージョン管理システムではなくデモ実装 であり、個別ファイル単位で動作する
    • 約 470 行の Python コード で構成されている
    • Cherry-pickローカル undo 機能はまだ実装されていないが、README に今後の実装方針が示されている
  • このプロジェクトは CRDT ベースのバージョン管理が UX の問題を解決できることを実証 しており、既存ツールより優れた結果を提供する
  • 全コードは パブリックドメイン(public domain) で配布され、設計文書全体は GitHub README に含まれている

コミュニティ反応の要約

  • あるユーザーは、Git は 10 年以上使われてきたが、新しいバージョン管理パラダイムが必要 だと評価し、Manyana の試みを好意的に言及している
    • マージが常に成功するという概念は直感的ではないと指摘し、追加の例や説明 を求めている
    • リベース改善のアイデアに関心を示し、個人プロジェクトでは 中間ブランチを通じたマージ管理方式 を使っていると述べている
    • Git の限界として バイナリファイル処理左右ブランチ区別の混乱大規模コード変更の要約不足 などを指摘している
    • 将来のバージョン管理では トークン単位認識(token-aware) 機能や 言語・ファイル形式別プラグイン をサポートするとよいと提案している
  • 別のユーザーは、Manyana が PijulDarcs と似た基盤を持つのかを質問し、Darcs の性能問題や Pijul の現在の状況との比較を求めている

結論

  • Manyana は CRDT をバージョン管理に適用した実用的なデモ であり、コンフリクト処理とリベースの問題を根本から再設計している
  • マージ失敗のない構造、コンフリクトの情報化、履歴の構造的内在化は、既存の Git モデルの限界を超える設計の方向性 を示している
  • 完全なシステムではないものの、次世代バージョン管理システムの設計青写真 として意味のある出発点である

1件のコメント

 
GN⁺ 2026-03-23
Hacker Newsの意見
  • merge の表示方法は、履歴の表現とは別問題だと思う
    私も Git の標準 merge UI は嫌いなので p4merge を使っている。4つのパネル(左、右、共通ベース、結果)を表示するツールで、衝突の原因と解決方法を一目で確認できる
    わざわざ VCS 自体を変える必要はないと思う

    • p4merge を使わなくても、Git の merge.conflictStyle 設定を "diff3""zdiff3" に変えれば、ベース版まで表示される
      こうすると衝突マーカーを見るだけで、どちらが 新しいコード を追加したのか推測できる
    • ほとんどの人はこの問題を深く考えていない
      以前あるポッドキャストで、新しい VCS を作ったゲストが Git の diff の保存方式 を誤解しているのを聞いて驚いた。何年もプロジェクトを進めていても基本概念すら調べていないのを見ると、今でも NIH(再発明) の精神は健在だと感じる
    • 私も p4merge を勧める。Git の merge がつらいのなら、それは概念的な問題というより UX デザイン の問題だ
    • JetBrains IDE(IntelliJ など)も優れた merge UI を提供している
      ただし SCM レベルで処理すれば、ユーザーの merge 履歴を 記憶 できる利点がある。Git はこういう部分でエッジケースがある
    • 一般のディレクトリも merge できるのか気になる
  • merge が絶対に失敗しないことが良いことなのかは分からない
    merge の失敗は単なる位置の衝突ではなく、意味的な衝突 を知らせるシグナルであることが多い。こういう場合は手動で処理すべきだ

    • 提案されたシステムも、重なる変更があればユーザーに表示するとしている。Git との違いは既定値の問題程度に見える
    • 実際には merge が成功しても コンパイルできないコード ができることもある。AI ツールで merge 衝突を解決しようとしたが、特に rebase ではうまくいかなかった
    • このシステムは失敗しないのではなく、衝突を 表示しつつ merge を続行 できるようにするという考え方だ。jj も似たアプローチを取っている
    • 単純なテキスト merge に依存して意味的問題を拾おうとするのには限界がある。代わりに ポスト merge 検査 やエージェントベースの意図検証のほうがよいと思う
  • CRDT はバージョン管理に向いていないと思う
    衝突はバージョン管理の本質だ。2人の開発者が別々の方向にコードを変えたなら、結局は 意味的な選択 が必要になる。CRDT はこういう状況で 見当違いなコード を作る可能性が高い
    Git の上でよりよい merge UX を提供するツールはすでに多くあり、cherry-pick や revert が容易なのも Git の利点だ

    • もちろん自動 merge は構文的衝突を解決するだけで、意味的衝突は依然として残る
      たとえば一方のブランチで定数を削除し、もう一方のブランチでその定数を使っていればコードは壊れる
      Git の衝突は大半が構文的問題なので、より賢い semantic merge や CRDT アプローチが役立つ可能性はある
    • CRDT を merge 計算にだけ使うことは可能だ
      たとえばファイル名、属性、ハッシュなどを追跡する際に OR-sethttps://en.wikipedia.org/wiki/…
      ただし衝突解決は依然として外部インターフェースで処理する必要がある
  • なぜ CRDT に集中するのかよく分からない
    衝突の意味的問題は依然として存在する。むしろ変更が 入り混じって(interleave) 見えるので、さらに混乱しそうだ
    私は rebase 中心主義者 だ。merge commit は避けるべきで、すべての commit は独立した単位であるべきだ。Gitflow は アンチパターン だと思う
    Jujutsu や Gerrit は、Git の本当の問題である「レビューのフィードバックに基づく commit チェーン管理」をうまく解決している

    • 「作業単位(unit of work)」が何かが重要だ
      Git はスナップショットを再適用するので、同じ作業が二重に存在することになる。一方 Pijulパッチ単位 で動作し、順序に関係なく同じ結果になる。これこそ本当に独立した作業単位だと思う
    • CRDT なら merge と rebase を同じ概念として扱える
      衝突がある状態でも特定の commit だけを 取り消し(undo) できる。Git より柔軟な構造を持てる
    • 常に rebase だけを使うと、各 commit ごとに衝突を解決しなければならず非効率だ
      実際には最終結果だけが重要なことも多い。squash merge を適切に混ぜるのが現実的だ
    • CRDT はすべての問題を解決すると錯覚しやすい
      しかし本質的に衝突が必要な問題もある。たとえば 同時編集で文字が混ざる現象 のように、むしろより悪い結果を招くこともある
  • このプロジェクトは Bram が以前作った Codeville のアイデアを発展させたもののようだ
    Codeville は 2000年代初頭の DVCS ブームの時期に登場し、weave ベースの保存と merge を使っていた。CRDT より 10年早い概念だが、自然につながる発想だ
    Bram が今もこの問題に取り組み、新しい試みを続けているのはうれしい

    • 真の CRDT の利点は 理解しやすい動作モデル にある。自分で実装してみると、その構造が明確に分かる
    • 2007年に Bram は私の Causal Tree アルゴリズム を weave の変形だと言っていた。その後 weave 系アルゴリズムは大きく発展し、関連論文もある
      arxiv:2002.09511
    • CRDT は単一の技術ではなく 概念的フレームワーク だ。結局 Git も eventual consistency を実装しているので、広い意味では CRDT と見なせる
  • 「CRDT ベースの VCS はまだ存在しない」という言い方には同意できない
    すでに Pijul が存在し、専門家たちが何千時間も投入したプロジェクトだ

    • Bram が VCS をあまり扱ってこなかったという意味ではない。Codeville だけ見ても 20年前からあった
    • 私は毎年 Pijul マニュアルの理論ページ を確認するのが趣味だ。今でも TeX のフォーマットエラー が直っていない
      6年間実験中で、4年前に自分で イシュー を上げたが、まだ反映されていない
    • 最初は古い GitHub リポジトリ を見つけたが、実際の公式リポジトリは Nest にある。
      Pijul は 自分自身で開発される VCS なので GitHub は使っていない
    • ときどき pijul pull -a をすると衝突が起きるので、そのまま再 clone している。追跡更新用の pull があるのか気になる
  • manana.py は 473行の 依存なしの Python コード
    実装そのものは約240行で、残りはテストコードだ。シンプルだが印象的だ

    • 名前自体がジョークだ。“Mañana” はスペイン語で 明日 だが、「いつかやろう」という意味もある。つまり 先延ばし(procrastination) を示唆している
    • 数百行のクリーンな Python でこれを作ったのは驚きだ
      JS エコシステムの left-pad 事件を思い出すと、Python にもこういう 小さくて責任あるパッケージ がもっと増えてほしいと思う
  • こういうシステムは、チーム規模ごとの merge 衝突の現れ方 を分析して設計すべきだ
    1人、10人、100人、1000人のチームがそれぞれどんな問題を抱えるのか、そして エージェントベース開発 がそれをどう変えるかも考える必要がある
    私の経験では、1〜100人規模ではチームごとにコードのサブツリーを分けるので衝突はほとんどない。
    エージェントが増えれば 100人が 1000人のようになるかもしれないが、今のところは 実際の問題より先に解決策が出てきた感じ

    • エージェントはどんなバージョン管理システムでも扱える
      最近は Codex に merge 衝突を任せれば終わり なので、わざわざ新しい VCS を使う理由は薄れている
      Git は大規模チーム向けに設計されており、エージェント時代には プロセス自動化 で十分対応できる
    • チーム規模が大きくなっても自然に コード領域ごとの専門化 が起きるので、衝突頻度は似たままだ。
      問題はむしろ 共有ライブラリのボトルネック やアクセス制限ポリシーから生じる
    • チーム規模別の分析で考えるのはむしろ非効率だ。単に 概念的に一貫した設計 が重要だ
  • 衝突より大きな問題は Git のスケーラビリティ
    リポジトリサイズと変更速度が限界に近づいており、サーバー、クライアント、プロトコル全体の再設計が必要だ

    • どんなスケーラビリティ問題があったのか気になる。もしかして モノレポ のせい?
    • 解決策の1つは、コードを モジュール化してバージョン依存関係で参照 することだ
  • 個人的には、このシステムが何の問題を解決するのかよく分からない
    抽象的には面白いが、実際には jj のほうが Git よりずっと実用的だ
    次の段階はファイル単位ではなく AST レベルでバージョン管理 するシステムだと思う。
    LightTable や Dark のような試みもあったし、こういう ツリーベースの VCS を試してみるとよさそうだ

    • すでにそういう方向の試みは進んでいる。新しい パーサーシステム を構築している