Gitの「現在のブランチ」コンセプトは、近くで検討すると、明らかに複雑です。Gitの用語集が、.git/HEADファイルの内容として定義する一方で、他にも、"git status"の出力、最後にチェックアウトされたブランチ、シェルプロンプトなどの解釈があります。これらの解釈は、一般的に一致しますが、デタッチドHEAD状態、チェックアウトされたタグ、リベース中の状況など、特定のシナリオで異なる結果を示します。例えば、タグをチェックアウトすると、.git/HEADはコミットIDを格納するが、"git status"は、ユーザー便宜のためにタグ名を表示します。同様に、リベース中は、"git status"がリベース状態を強調し、シェルプロンプトは元のブランチを示します。さらには、"git init"が行われると、明示的なチェックアウトなしで「現在のブランチ」が自動的に設定されるというニュアンスもあります。裸のリポジトリの場合、"git status"と"git checkout"が動作しないという状況もあります。これらの不一致は、「現在のブランチ」を厳格に定義する限界を示し、状況に応じて理解することが重要です。
「現在のブランチ」が、新しいコミットのターゲットであるという定義は、リベース中でコミットが元のブランチに着陸するため、一般的に真です。"現在のブランチ"がGit操作の文脈を表すという考え方も有効ですが、裸のリポジトリでの"git status"の異なる動作など、不一致があります。結局、「現在のブランチ」を理解するためには、.git/HEAD、"git status"の出力、最後のチェックアウトアクションなど、状況に応じて異なる指標を組み合わせて捉えることが必要です。
jvns.ca
The "current branch" in git
Create attached notes ...
