私の理解では、git checkout
はhead
の移動に関するものです。
たとえば、git checkout <commit id>
はhead
を<commit id>
に移動し、git checkout <branch_name>
はhead
を<branch_name>
に移動します。
ただし、git checkout .
はステージングされていない変更を破棄します。 head
についてのビジネスはないようです。
したがって、なぜgit
が同じキーワードcheckout
を使用して2つのまったく関係のないことをするのか理解できません。またはgit checkout .
はhead
に基づいて動作しますか?
お気づきのとおり、checkout
コマンドは2つの異なることを意味するためにオーバーロードされています。 git help checkout
はそれをかなり明確にしていると思います:
git-checkout - Switch branches or restore working tree files
コマンドにはいくつかの形式がありますが、あなたが尋ねているものは次のとおりです。
git checkout [<tree-ish>] [--] <pathspec>...
あなたの場合、<tree-ish>
引数は省略され、オプションとファイル名を分離する--
引数は省略され、<pathspec>
は.
(つまり、現在のディレクトリ)です。この形式のコマンドは、次のように文書化されています。
インデックスまたは
<tree-ish>
(ほとんどの場合はコミット)の内容で置き換えることにより、作業ツリーのパスを上書きします。
したがって、<tree-ish>
引数を指定しなかったため、.
のファイルのコンテンツはインデックスのコンテンツに置き換えられます。つまり、まだインデックスに追加されていない.
の変更を破棄することを意味します。
これを「リポジトリからこれらのファイルをチェックアウトする」と考えることができます。これは、コミットまたはインデックス(ステージングされたがまだコミットされていない変更を含む可能性がある)のいずれかを意味します。
git checkoutを使用してブランチ名を変更したり、ファイルを(リモートに)リセットしたり、特定のブランチのファイルにリセットしたりできます。
作業はチェックアウト後の引数に依存します。ファイル名の場合、Current Indexのようにファイルをリセットします。これは、他のブランチからファイルを取得するのにも役立ちます。
ブランチ名の場合、現在の作業ブランチを変更します。