Gitのcheckout
sとは何ですか?
特定のブランチをcheckout
すると、HEAD
はそのブランチを指します。しかし、それは本当に何を意味するのでしょうか?そのブランチで作業できるということですか?はいの場合、ブランチをチェックアウトせずに作業することはできませんか?
また、remote checkout
はどういう意味ですか?どのように役立ちますか?
既に述べたように、HEAD
は、コミットツリーのどこにいるかを示すラベルです。あるコミットから別のコミットに移動すると、それも一緒に移動します。 git checkout <commit>
は、コミットツリー内を移動し、フォーカス(HEAD
)を指定されたコミットに移動するための基本的なメカニズムです。
コミットは、いくつかの方法、コミットハッシュ、ブランチ名、タグ名、相対構文(HEAD^
、HEAD~1
など)のいずれかで指定できます。チェックアウトを変更ブランチと見なすことはしばしば有用であり、その観点から機能するオプションがいくつかありますが、それらはすべてコミットを参照します。
コミットをチェックアウトするには、HEAD
を移動する以外の何らかの副作用があります。
-b
オプションを使用すると、現在のコミットに基づいて新しいブランチが作成され、アクティブになります。--track
オプションを使用すると、チェックアウトされたブランチにリモートブランチを認識させることができます。--Orphan
オプションを使用すると、新しいブランチが作成されます(-b
の場合と同様)が、既存のコミットに基づいていません。さらにいくつかのオプションがあります git checkout man-page で読むことができます。すべてのオプションは、あるコミットから別のコミットへの移動を中心にしています。 HEAD
に移動します。
理解に役立つように、ファイル、フォルダー、ブランチを使用したチェックアウトの使用例をいくつか説明します。
dev
およびindex.html
という名前のフォルダーがあるとしましょう。また、すべてが追跡され、作業ディレクトリはクリーンです。
誤ってファイル名を変更した場合index.html
を元に戻したい場合は、git checkout index.html
を使用するだけで、現在選択されているリポジトリのリポジトリからそのファイルの状態を復元します。
dev
フォルダーに変更を加えて、それを回復したい場合。 git checkout dev
を使用できますが、そのフォルダーをチェックアウトする代わりにdev
という名前のブランチが既にある場合は、そのブランチをプルダウンします。それを避けるために、git checkout -- dev
をしたいです。
ここで、裸の二重ダッシュは現在のブランチを表し、現在選択されているブランチからdev
フォルダーをgitに要求します。
同様にgit checkout alpha dev
を実行すると、アルファブランチからdevフォルダーがプルダウンされます。
この回答は、最初の質問「git checkout really mean」に対するものです。
「チェックアウトする」とは、リポジトリから任意のコミットを取得し、関連するファイルとディレクトリツリーの状態を作業ディレクトリに再作成することを意味します。
notブランチヘッド(たとえば、git checkout HEAD~2
)であるコミットをチェックアウトすると、いわゆるdetached headになります。ここでコミットを作成できますが、別のブランチに切り替えると、それらのコミットはブランチ名によって回復できなくなり、しばらくするとガベージコレクタによって削除されることもあります。