Git がブランチからのすべてのデータをどこに保存するのか疑問に思っていました。ブランチを切り替えるたびに、すべてのデータが元の場所に戻され、別の特定のブランチからのデータが削除されます。
低速の CPU/HDD では、別のブランチからデータを戻すのに時間がかかりますか? 内部はどのように機能しますか?
Git がブランチからのすべてのデータをどこに保存するのか疑問に思っていました。ブランチを切り替えるたびに、すべてのデータが元の場所に戻され、別の特定のブランチからのデータが削除されます。
低速の CPU/HDD では、別のブランチからデータを戻すのに時間がかかりますか? 内部はどのように機能しますか?
Git はファイル データを「blob」と呼ばれるオブジェクトに保存します。これらは.git/objects
、リポジトリ内のディレクトリに格納されます。
ディレクトリ構造へのブロブのマッピングは、再帰的な「ツリー」と呼ばれるオブジェクトによって行われます。サブディレクトリの場合、1 つのツリーが他のツリーを参照できます。
コミットは、コミット時のリポジトリのルート ディレクトリの状態である特定のツリーを参照します。
ブランチは、特定のコミットへの単なるポインターです。
ブランチをチェックアウトすると、Git はそのブランチが指しているコミットを調べます。そこから、コミットによって参照されるツリーをロードし、それらから、ツリー内の各場所に一致する必要がある正確なブロブを取得します。次に、これらの BLOB のコンテンツを適切なファイル パスに読み込みます。
これを支援するために、インデックスを使用します。これは、ファイルの状態をディレクトリ ツリー内のパスにマッピングしたものであり、内容のハッシュと最終変更時刻の記録も含まれます。Git はこれらのハッシュと mtimes を使用して、更新が必要なファイルをすばやく特定し、適切なコンテンツを読み込みます。
特に時間に拘束されないため、低速の CPU + HDD ではあらゆる種類の作業に時間がかかります。可能な限り多くの CPU/ディスク速度を使用します。とはいえ、Git は非常に効率的であるため、かなりの数のファイルや非常に大きなファイル コンテンツの変更 (または非常に遅いデバイス) がない限り、通常は非常に迅速に処理されます。