スナップショットとは
「git」の主要な機能の一つに、ファイルの変更履歴管理があります。「スナップショット」は、ファイルの変更履歴管理で使用する仕組みです。
スナップショット
「Git」では、変更されたファイルをデータベースに保存する際、「Git」が管理しているすべてのファイル及びファイルの情報を記録し、データベースに保存します。この記録のことを「スナップショット」と言います。
「スナップショット」により、以前のファイルを取り出したり変更点を調べるなど、過去の作業を抽出できるようになります。
デジカメに置き換えてみる
デジカメに置き換えると、デジカメで撮影した写真が「スナップショット」です。デジカメで同じ外の風景を撮影しても、時間の経過とともに風景が変化します。
もし1時間前に撮影した写真や、5つ前に撮影した写真が見たければ、過去の写真を探すことになります。
写真にはExifに撮影日時や撮影者など、様々な情報が含まれています。
それらの情報から見たい写真を探し出します。
スナップショットも同様
「スナップショット」も同様に、ユーザーがプロジェクトで使用するファイルを編集すれば、ファイルの中身は変化していきます。ユーザーはファイルの編集が一段落ついたら、「スナップショット」を作成しデータベースに保存します。
この「スナップショット」には、作成日時や作成者など様々な情報が含まれています。
例えば、昨日変更したファイルを取得したければ、昨日作成した「スナップショット」を探します。
それらの情報から「スナップショット」を探し出しファイルを展開すれば、「スナップショット」作成時のファイル群が取得できます。
「スナップショット」には、以下のデータが含まれています。
- スナップショットの情報(メタデータ)
- スナップショット作成時のファイル群
デジカメの例で言えば、「スナップショット」の作成は風景を撮影する行為です。
「スナップショットの情報」は、撮影した写真に含まれるExifの情報です。
「スナップショット作成時のファイル群」は、撮影した写真です。
「スナップショット」の作成は、プロジェクトで使用するファイル群のバックアップと捉えても良いです。
変更されていないファイルも記録される
この「スナップショット」には、「スナップショット」作成時のすべてのファイルが記録されるため、変更されていないファイルも記録されます。変更されていないファイルもそのまま「スナップショット」に記録してしまうと、重複してファイルを記録することになり、大変な容量になります。
例えば100MBの変更されないファイルがあるとすると、「スナップショット」を作成するたびに、100MBのファイルも「スナップショット」に記録されます。
このままでは「スナップショット」の容量が増えいく一方です。
「Git」では、変更されていないファイルはそのまま記録せず、代わりに以前のバージョンを参照する情報を記録します。
そのため、変更されていないファイルが重複して記録されることはありません。
スナップショットの例
スナップショットの例です。「Git」で管理しているファイルが3つあるとします。
赤色のファイルが、内容を編集したファイルです。
青色のファイルは、以前のバージョンを参照する情報です。
スナップショット (バージョン) |
ファイル1 | ファイル2 | ファイル3 | 操作内容 |
---|---|---|---|---|
1.0 | ファイル1 | ファイル2 | ファイル3 | 最初のバージョン |
2.0 | ファイル1 | ファイル2への参照 | ファイル3への参照 | ファイル1を変更 |
3.0 | ファイル1への参照 | ファイル2への参照 | ファイル3 | ファイル3を変更 |
例えば、一度も変更されていない「ファイル2」は、バージョン1.0の「ファイル2」を参照する情報が「スナップショット」に記録されます。
データはチェックサムで管理される
「Git」では、データベースに保存するデータにチェックサムを生成します。プロジェクトで使用するファイル群もデータベースに保存されるため、これらのファイルにもチェックサムが生成されます。
チェックサムは、データベースに保存するファイルの中身やフォルダー構造からチェックサムが生成され、チェックサムの情報を元に管理が行われます。
チェックサムはデータの識別子
一般的にチェックサムというと、データが破損していないか破損を検出する仕組みでよく利用されます。「Git」ではデータの破損に加え、データを一意に識別する識別子としても利用します。
この識別子は、ユーザーがデータを操作する際に必要になることもあります。
従ってこのチェックサムには、データの破損チェック以上の意味があります。
直接編集できない
チェックサムの情報を元に管理を行うため、「Git」のデータベースに格納しているプロジェクトのフォルダー構造やファイルの中身を直接編集することはできません。ファイル名も変更されるため、直接ファイルを特定することもできません。
編集を行うには、データベースからプロジェクトのファイルを取り出す必要があります。
これらの操作は、「Git」を経由して行います。
整合性のチェック
チェックサムにより、ファイルが破損していないか、情報が欠損していないかチェックが行われ、ファイルの破損を検出することができます。SHA-1
チェックサムの計算に「SHA-1」ハッシュ関数が使用されます。フォルダー構造やファイルの中身から、チェックサムが計算されます。
「SHA-1」は、40文字の文字列で構成されます。
例:5a2938398124652417e79e68edd97b3f10669d6a
「git」からデータに対して直接操作を行う際、このチェックサムが各々のデータを識別する識別子になります。
この識別子は重複しません。
またこの識別子により、どのデータに対して操作を行うのか、操作対象の指定を行うことができます。
もちろん、より分かりやすい方法でデータを指定することもできます。