Git はどのようにファイルを保存するのでしょうか? 質問する

Git はどのようにファイルを保存するのでしょうか? 質問する

私はGitを学び始めたばかりで、そのために読み始めましたGit コミュニティブックこの本ではこう言っていますSVNそしてCVs についてファイル間の差分を保存し、Git はすべてのファイルのスナップショットを保存します。

しかし、スナップショットの意味がよく分かりませんでした。Git は本当にコミットごとにすべてのファイルのコピーを作成するのでしょうか? 彼らの説明から私が理解したのはその通りです。

ベストアンサー1

Git では、コミットごとにすべてのファイルの完全なコピーが含まれますが、Git リポジトリにすでに存在するコンテンツについては、スナップショットはそれを複製するのではなく、そのコンテンツを指すだけです。
つまり、同じコンテンツを持つ複数のファイルは 1 回だけ保存されるということです。

したがって、スナップショットは基本的に、ディレクトリ構造の内容を参照するコミットです。

良い参考資料としては次のようなものがあります:

Git commitコマンドでプロジェクトのスナップショットを保存したいことをGitに伝えると、基本的にその時点でプロジェクト内のすべてのファイルがどのようになっているかのマニフェストが記録されます。

ラボ12以前のスナップショットを取得する方法を示します


プロジットブックスナップショットのより包括的な説明は次のとおりです。

Gitと他のVCS(Subversionやその仲間を含む)との主な違いは、Gitがデータを扱う方法です。
概念的には、他のほとんどのシステムは、情報をファイルベースの変更のリストとして保存します。これらのシステム(CVS、Subversion、Perforce、Bazaarなど)は、保持する情報をファイルのセットと、時間の経過とともに各ファイルに加えられた変更として考えます。

デルタベースの VCS

Git はデータをこのように考えたり保存したりしません。その代わりに、Git はデータを小さなファイルシステムのスナップショットのセットのように考えます。
コミットするたび、または Git でプロジェクトの状態を保存するたびに、基本的にその時点でのすべてのファイルの状態の写真が撮られ、そのスナップショットへの参照が保存されます。
効率を上げるため、ファイルが変更されていない場合、Git はファイルを再度保存せず、すでに保存されている以前の同一ファイルへのリンクのみを保存します。Git
はデータを次のように考えます。

スナップショットベースの VCS

これは、Git とほぼすべての他の VCS との重要な違いです。これにより、Git は、他のほとんどのシステムが前世代からコピーしたバージョン管理のほぼすべての側面を再検討することになります。これにより、Git は単なる VCS ではなく、非常に強力なツールが組み込まれたミニファイルシステムのようになります。

参照:


ヤン・フデックこれを追加する重要なコメント:

これは概念レベルでは真実であり重要ですが、ストレージレベルでは真実ではありません。Git
はストレージにデルタを使用します
それだけでなく、他のどのシステムよりも効率的です。ファイルごとの履歴を保持しないため、デルタ圧縮を行う場合は、各 BLOB を受け取り、類似している可能性のある BLOB をいくつか選択し (以前のバージョンとその他のバージョンの最も近い近似値を含むヒューリスティックを使用)、デルタを生成して最小のものを選択します。この方法では (多くの場合、ヒューリスティックに依存しますが)、他の類似ファイルや、以前のバージョンよりも類似している古いバージョンを利用できます。「パック ウィンドウ」パラメータを使用すると、デルタ圧縮の品質とパフォーマンスをトレードできます。デフォルト (10) では通常、適切な結果が得られますが、スペースが限られている場合やネットワーク転送を高速化する場合は、git gc --aggressive値 250 を使用します。これにより、実行速度は非常に遅くなりますが、履歴データの圧縮が強化されます。

おすすめ記事