Git が「継承メカニズム」(コミットを含まない) と呼ばれるものを提供しない理由を理解するには、まず、これらの SCM のコア概念の 1 つを理解する必要があります (Git と ClearCase など)。
ClearCase は線形バージョン ストレージを使用します。要素 (ファイルまたはディレクトリ) の各バージョンは、同じ要素の前のバージョンと直接線形関係でリンクされます。
Git はDAG - Directed Acyclic Graphを使用します。ファイルの各「バージョン」は、実際には、それ自体がコミットの一部であるツリー内の変更のグローバル セットの一部です。の以前のバージョンは、単一の有向非巡回グラフ パスを介してアクセスできる、以前のコミットで見つける必要があります。
線形システムでは、構成仕様は、表示される「継承」を実現するためのいくつかのルールを指定できます (特定のファイルについて、最初に特定のバージョンを選択し、存在しない場合は別のバージョンを選択し、存在しない場合は別のバージョンを選択します)。 3 番目など)。
ブランチは、特定の選択規則の特定のバージョンの線形履歴のフォークです (その選択規則より前の他のすべての選択規則は引き続き適用されるため、「継承」効果が発生します)。
DAG では、コミットは取得するすべての「継承」を表します。バージョンの「累積的な」選択はありません。このグラフには、この正確な時点 (コミット) で表示されるすべてのファイルを選択するパスが 1 つしかありません。
ブランチは、このグラフの単なる新しいパスです。
他のバージョンの Git に適用するには、次のいずれかを行う必要があります。
ただし、Git は DAG ベースの SCM であるため、常に新しいコミットが発生します。
Gitで「失っている」のは、ある種の「構成」です(連続する異なる選択ルールで異なるバージョンを選択している場合)が、D VCS(「分散」の場合のように)では実用的ではありません。 Git でブランチを作成するには、開始点とコンテンツを明確に定義し、他のリポジトリに簡単に複製する必要があります。
純粋に中央の VCS では、必要なルールを使用してワークスペース (ClearCase では、スナップショットまたは動的のいずれかの「ビュー」) を定義できます。
unknown-googleはコメント (および上記の彼の質問) に次のように追加します。
したがって、2 つのモデルが異なること (線形と DAG) を達成できることがわかったら、私の質問は次のとおりです。線形が DAG では不可能なことを実行できる実際のシナリオはどれですか (特に OSS よりも多くの企業にとって)。彼らはそれだけの価値がありますか?
選択ルールに関して「実際のシナリオ」になると、線形モデルでできることは、同じファイルのセットに対して複数の選択ルールを持つことです。
次の「構成仕様」(つまり、ClearCase での選択ルールの「構成仕様」) を検討してください。
element /aPath/... aLabel3 -mkbranch myNewBranch
element /aPath/... aLabel2 -mkbranch myNewBranch
' ' というラベルが付いたすべてのファイルaLabel2
(およびそこから分岐したファイル) を選択しますが、' ' というラベルが付いたファイルとそこから分岐したファイルは除きaLabel3
ます (そのルールは ' ' に言及しているルールよりも前にあるためaLabel2
)。
その価値はありますか?
いいえ。
実際には、ClearCase の UCM フレーバー (ClearCase 製品に含まれる「統合構成管理」方法論であり、基本的な ClearCase の使用法から推定されるすべての「ベスト プラクティス」を表す) では、単純化の理由からそれが許可されていません。ファイルのセットは「コンポーネント」と呼ばれ、特定のラベル (「ベースライン」と呼ばれる) に分岐する場合は、次の構成仕様のように変換されます。
element /aPath/... .../myNewBranch
element /aPath/... aLabel3 -mkbranch myNewBranch
element /aPath/... /main/0 -mkbranch myNewBranch
1 つの開始点 (ここでは ' aLabel3
') を選択し、そこから移動する必要があります。' ' のファイルも必要な場合aLabel2
は、すべての ' aLabel2
' ファイルを 'myNewBranch' のファイルにマージします。
これは、DAG で作成する必要のない「単純化」です。グラフの各ノードは、関係するファイルのセットが何であれ、ブランチの一意に定義された「開始点」を表します。
マージとリベースは、その開始点を特定のファイルセットの他のバージョンと組み合わせて、目的の「構成」を実現し、その特定の履歴をブランチに分離して保持するのに十分です。
一般的な目標は、「一貫したコンポーネントに適用される一貫したバージョン管理操作」を推論することです。ファイルの「一貫した」セットは、明確に定義された一貫した状態のファイルです。
- ラベルが付けられている場合、そのすべてのファイルにラベルが付けられます
- 分岐した場合、そのすべてのファイルは同じ一意の開始点から分岐します
これは、DAG システムで簡単に実行できます。線形システムではより困難になる可能性があります (特に、「構成仕様」が扱いにくい「ベース ClearCase」の場合) が、同じ線形ベースのツールの UCM 方法論で実施されます。
「プライベート選択ルールのトリック」(ClearCase、いくつかの選択ルールの順序)を介してその「構成」を達成する代わりに、VCS操作(リベースまたはマージ)のみでそれを達成し、全員が従うべき明確な痕跡を残します(反対に開発者専用の構成仕様、またはすべてではなく一部の開発者間で共有される構成仕様)。繰り返しになりますが、後で再現するのに苦労する可能性がある「動的な柔軟性」とは対照的に、一貫性の感覚を強制します。
これにより、VCS (バージョン管理システム)の領域を離れ、主に「再現性」に関係するSCM (ソフトウェア構成管理)の領域に入ることができます。そして、それ (SCM 機能) は、線形ベースまたは DAG ベースの VCS で実現できます。