Next: バージョンコントロールにおける変更セットベースとファイルベース, Previous: バージョンコントロールの概念, Up: バージョンコントロールの紹介 [Contents][Index]
バージョンコントロールシステムは通常、同じファイルを変更したい複数ユーザーを調整するために、何らかのメカニズムをもちます。これを行うには2つの方法 — マージとロック — があります。
マージを使うバージョンコントロールシステムでは、各ユーザーはいつでも作業ファイルを変更します。バージョンコントロールシステムは、コミットされていない変更を含むユーザーの作業ファイルを、他のユーザーによりコミットされた最新の変更とマージします。
古いバージョンコントロールシステムは、かわりにロック(locking)を使います。この場合、作業ファイルは通常は読み取り専用です。ファイルを編集するには、それをロックすることにより書き込み可能にできるか、バージョンコントロールシステムに尋ねます。ある時点で、そのファイルをロックできるユーザーは1人だけです。この手順は、通常のファイルの同時編集をEmacsが検知する方法と類似しているようですが、異なります(同時編集からの保護を参照してください)。変更をコミットすると、ファイルはアンロック(unlocks)され、作業ファイルは再び読み取り専用になります。他のユーザーは、変更するためにそのファイルをロックすることができます。
ロックおよびマージの両方のシステムは、複数ユーザーが同じときに同じファイルの変更を試みたときに問題が発生し得ます。ロックを使うシステムには、ロックの衝突(lock conflicts)があります。あるユーザーはファイルのチェックアウトを試みますが、それがすでにロックされている場合はロックできません。マージを使うシステムには、マージの衝突(merge conflicts)があります。これはファイルに行った変更をコミットするとき、それが後からチェックアウトした他の誰かによる変更のコミットと衝突するときに発生します。どちらの衝突も、人間の判断と意思疎通により解決する必要があります。経験から、開発者に取っての利便性と、実際に発生する衝突の重大性と数を最小にするという両方の点で、マージはロックに優ります。
SCCSは常にロックを使います。RCSはデフォルトではロックベースですが、マージスタイルで処理するように指示できます。CVSとSubversionはデフォルトではマージベースですが、ロックモードで処理するように指示できます。Git、Mercurialのような分散型のバージョンコントロールシステムは、マージベースだけです。
VCはロックとマージの両方のバージョンコントロールをサポートします。“commit(コミット)”と“update(更新)”という用語は、新しいバージョンコントロールシステムで使用されます。古いロックベースのシステムでは、“check in(チェックイン)”と“check out(チェックアウト)”という用語が使用されます。VCはこれらの違いをできる限り隠蔽します。