1. ホーム
  2. git

[解決済み] GitのHEAD、作業ツリー、インデックスの違いは何ですか?

2022-03-17 21:44:14

質問

GitにおけるHEAD、作業ツリー、インデックスの違いについて教えてください。

私が理解するところでは、これらはすべて異なるブランチの名前です。私の推測は正しいですか?

こんなものがありました。

ひとつの git リポジトリは任意の数のブランチを追跡することができますが、作業ツリーはそのうちのひとつ("current" あるいは "checked out" ブランチ)だけに関連付けられており、HEAD はそのブランチを指しているのです。

これは、HEADと作業ツリーは常に同じということでしょうか?

どのように解決するのですか?

これらのトピックに関する他の良い参考文献をいくつかご紹介します。

私は、インデックスを チェックポイント .

<ブロッククオート

うまくいかないかもしれない変更を加えようとするとき、つまり、概念的に難しいリファクタリングや表現型の変更など、やり通せるかどうか、それが良いアイデアかどうかさえわからない方向性を探りたいとき、私は自分の作業をインデックスにチェックポイントするのです。

前回のコミット以降に行った最初の変更であれば、ローカルリポジトリをチェックポイントとして使うことができますが、多くの場合、1つのコンセプトの変更を小さなステップのセットとして実装しています。
各ステップの後にチェックポイントを行いたいのですが、動作するテスト済みのコードに戻るまでコミットを保存しておきます。

<ブロッククオート

注意事項

  1. その ワークスペース は、あなたが見たり編集したりする(ソース)ファイルのディレクトリツリーです。

  2. インデックス は、単一の大きなバイナリファイルであり <baseOfRepo>/.git/index これは、現在のブランチにあるすべてのファイル、それらの sha1 チェックサム、タイムスタンプ、ファイル名 -- これは、ファイルのコピーが格納されている別のディレクトリではありません。

  3. ローカルリポジトリ は隠しディレクトリ( .git を含む)。 objects ディレクトリに、レポ内のすべてのファイルのバージョン(ローカルブランチとリモートブランチのコピー)が圧縮された "blob" ファイルとして格納されます。

上の画像で表現されている4つの「ディスク」を、レポファイルの個別のコピーと考えないでください。

<ブロッククオート

これらは基本的に、Gitのコミットに対する名前付き参照です。タグとヘッドの二種類に大別されます。

  • タグは、例えばv2.6.29のように、歴史上の特定の点をマークする固定参照です。
  • 逆にヘッドは、プロジェクト開発の現在位置を反映して常に移動しています。

(注) コメント によって ティモ・フオヴィネン この矢印はコミットが指しているものではありません。 ワークフローの順序 という矢印が表示されます。 1 -> 2 -> 3 -> 4 ここで 1 は最初のコミットで 4 は最終)

<ブロッククオート

これで、プロジェクトで何が起こっているのかがわかりました。
しかし、ここで何が起こっているかを知るために、今現在、HEADという特別な参照があります。これは大きく分けて2つの目的があります。

  • チェックアウトするときに、どのコミットからファイルを取得するかをGitに伝える。
  • は、コミットしたときに新しいコミットをどこに置くかを Git に伝えます。

を実行すると git checkout ref を指しています。 HEAD を指定し、そこからファイルを抽出します。また git commit は新しいコミットオブジェクトを作成し、それは現在の HEAD . 通常 HEAD はどちらかのヘッドを指しているので、すべてうまくいきます。