web-dev-qa-db-ja.com

git checkoutの理解方法[ドット]

私の理解では、git checkoutheadの移動に関するものです。

たとえば、git checkout <commit id>head<commit id>に移動し、git checkout <branch_name>head<branch_name>に移動します。

ただし、git checkout .はステージングされていない変更を破棄します。 headについてのビジネスはないようです。

したがって、なぜgitが同じキーワードcheckoutを使用して2つのまったく関係のないことをするのか理解できません。またはgit checkout .headに基づいて動作しますか?

7
Yves

お気づきのとおり、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>引数を指定しなかったため、.のファイルのコンテンツはインデックスのコンテンツに置き換えられます。つまり、まだインデックスに追加されていない.の変更を破棄することを意味します。

これを「リポジトリからこれらのファイルをチェックアウトする」と考えることができます。これは、コミットまたはインデックス(ステージングされたがまだコミットされていない変更を含む可能性がある)のいずれかを意味します。

7
Jonathan Wakely

git checkoutを使用してブランチ名を変更したり、ファイルを(リモートに)リセットしたり、特定のブランチのファイルにリセットしたりできます。

作業はチェックアウト後の引数に依存します。ファイル名の場合、Current Indexのようにファイルをリセットします。これは、他のブランチからファイルを取得するのにも役立ちます。

ブランチ名の場合、現在の作業ブランチを変更します。

1
Akhil Surapuram