[解決済み】gitはどのようにファイルを保存するのですか?
質問
私はgitの勉強を始めたばかりで、そのために以下の本を読み始めた。 Git コミュニティブック この本では、SVNとCVSはファイルの差分を保存し、gitは全ファイルのスナップショットを保存すると言っています。
でも、スナップショットの意味がよくわからなかったんです。なぜなら、彼らの説明で理解できたのは、gitは本当に各コミットですべてのファイルのコピーを作成するのか、ということだったからです。
PS: gitを学ぶのにもっと良いソースがあれば、感謝します。
どのように解決するのですか?
ただし、Git リポジトリにすでに存在するコンテンツについては、スナップショットは複製するのではなく、単にそのコンテンツを指すようにします。
それは、同じ内容の複数のファイルが一度だけ保存されることも意味します。
つまり、スナップショットとは基本的にコミットであり、その際に参照されるのが 内容 ディレクトリ構造の
良い参考文献をいくつか紹介します。
<ブロッククオートgit commitコマンドでプロジェクトのスナップショットを保存したいことをGitに伝えると、基本的にその時点でプロジェクト内のすべてのファイルがどのような状態になっているのかをマニフェストとして記録してくれます。
ラボ12 以前のスナップショットを取得する方法を説明します
は プロギットブック には、スナップショットについてのより包括的な説明があります。
<ブロッククオート
Gitと他のVCS(Subversionやその仲間も含む)との大きな違いは、Gitがそのデータをどう考えるかということです。
概念的には、他のほとんどのシステムは、情報をファイルベースの変更点のリストとして保存します。これらのシステム (CVS, Subversion, Perforce, Bazaar など) は、保持している情報をファイルの集合と、各ファイルに対して行われた時間の経過に伴う変更として考えています。
Gitはこのようにデータを考えたり保存したりしません。その代わりに、Gitはそのデータを、ミニ・ファイルシステムのスナップショットの集合のように考えています。
コミットするたび、あるいはGitでプロジェクトの状態を保存するたび、基本的にはその時点のすべてのファイルがどのようなものであるかを撮影し、そのスナップショットへの参照を保存するのです。
効率的にするために、ファイルが変更されていない場合、Gitはファイルを再度保存せず、すでに保存した以前の同一のファイルへのリンクだけを保存します。
Gitは、データを次のように考えています。
これは、Gitと他のほとんど全てのVCSとの間の重要な違いです。これは、他のほとんどのシステムが前世代からコピーしてきたバージョン管理のほとんど全ての側面を、Gitに再考させるものです。これによってGitは、単なるVCSというよりも、その上に信じられないほど強力なツールを構築したミニ・ファイルシステムのようなものとなっています。
こちらもご覧ください。
概念的には正しいし重要なことですが、ストレージレベルでは正しくありません。
Gitはストレージにデルタを使用します .
それだけでなく、他のどのシステムよりも効率的にそれを行うことができます。なぜなら、ファイルごとの履歴を残さないからです。 デルタ圧縮を行いたい場合 各blobを受け取り、類似していると思われるblobをいくつか選択し(前バージョンの最も近い近似値やその他のヒューリスティックを使用)、差分を生成しようと試み、最も小さいものを選びます。この方法では、(ヒューリスティックによりますが、多くの場合)他の類似ファイルや、前バージョンよりも類似している旧バージョンを利用することができます。pack window"パラメータは、デルタ圧縮の品質と性能を交換することができます。デフォルト(10)は一般的に適切な結果をもたらしますが、スペースが限られている場合やネットワーク転送を高速化する場合などには有効です。git gc --aggressive
は値250を使用しているため、動作は非常に遅くなりますが、ヒストリーデータの圧縮を強化することができます。
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] リモートのGitブランチをチェックアウトするには?
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] Git で、ステージされていない変更を破棄するにはどうしたらいいですか?
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】fatal: 有効なオブジェクト名ではない: 'master'
-
[解決済み】なぜ「git commit」は私の変更を保存しないのですか?
-
[gitコミット失敗の解決] 現在のブランチの先端が後ろにあるため、更新が拒否されました。
-
gitアップロードの共通エラー処理
-
[解決済み] .gitignore と "以下の追跡されていない作業ツリーファイルはチェックアウトによって上書きされるでしょう"
-
[解決済み] git ls-remote と git ls-remote origin の違い。
-
[解決済み] git rebase: "error: cannot stat 'file': パーミッションが拒否されました"
-
[解決済み] Gitのフォルダ構造で変更・追加されたファイルのみをエクスポートする機能
-
[解決済み] なぜGitはSubversionよりも優れているのですか?
-
[解決済み] gitでコミットをつぶすとはどういう意味ですか?