DUICUO

インタビュアー: Git の HEAD、作業ツリー、インデックスの違いを教えてください。

[[417066]]

この記事は、WeChat公式アカウント「JS日语問」(著者:慧慧)からの転載です。転載の許可については、「JS日语問」公式アカウントまでお問い合わせください。

1. 頭

Gitでは、複数のブランチが存在します。ブランチは、基本的にコミットオブジェクトへの可変ポインタです。一方、Headは現在作業中のローカルブランチを指す特別なポインタです。

簡単に言えば、HEAD はあなたが今いる場所を指します。

たとえば、現在マスター ブランチにいる場合、HEAD ポインターはマスター ブランチ ポインターを指します。

次に、`git checkout test` を呼び出して `test` ブランチに切り替えると、次の図に示すように、HEAD は `test` ブランチを指すようになります。

ただし、テスト ブランチで再度コミットすると、HEAD ポインターは引き続きテスト ブランチ ポインターを指し、テスト ブランチ ポインターは最後に作成されたコミットを指します (下の図を参照)。

HEAD ファイルは .git/HEAD ディレクトリに保存されており、その情報から HEAD が別のファイルを指していることがわかります。

  1. $ cat .git/HEAD
  2. 参照: refs/heads/master
  3.  
  4. $ cat .git/refs/heads/master
  5. 7406a10efcc169bbab17827aeda189aa20376f7f

ファイルにはハッシュ コードが含まれています。これは、マスター ブランチの最新のコミットに対応するハッシュ コードです。

したがって、ブランチを切り替えると、通常、HEAD ポインターは現在いるブランチを指し、ブランチに新しいコミットを作成すると、ブランチ ポインターは常に現在のブランチの最新のコミットを指します。

したがって、HEAD ポインターはブランチ ポインターにつながり、ブランチ ポインターは最新のコミットにつながります。

II. 作業ツリーとインデックス

Git では、実際に作業するディレクトリは作業ツリーまたは作業領域と呼ばれます。

データベースと作業ツリーの間にはインデックスがあります。インデックスは、データベースへの送信準備に使用される領域であり、ステージング領域とも呼ばれます。

Git がコミットを実行すると、作業ツリーの状態がデータベースに直接保存されるのではなく、中間インデックス領域に設定された状態がデータベースに保存されます。

したがって、ファイルを送信するには、まずファイルをインデックス領域に追加する必要があります。

したがって、中間インデックスを使用することで、作業ツリーでの不要なファイルコミットを回避し、ファイルの変更の一部をインデックス領域に追加してコミットすることができます。

III. 相違点

その場所から:

  • HEADポインタは通常、現在作業中のブランチを指します。ブランチに新しいコミットを作成すると、ブランチポインタは常に現在のブランチの最新のコミットを指します。
  • 作業ツリーは、表示および編集する (ソース) ファイルの実際の内容です。
  • インデックスは、Gitリポジトリにコミットしたいファイルを置く場所です。例えば、作業ツリー内のコードは`git add`を使ってGitインデックスに追加され、インデックス内のファイルは`git commit`を使ってGitリポジトリにコミットされます。

参考文献

https://backlog.com/git-tutorial/cn/intro/intro1_4.html

https://juejin.cn/post/6844903598522908686

https://www.zsythink.net/archives/3412

関連するおすすめ記事