inductor's blog

nothing but self note :)

git checkoutからちゃんと卒業する

はじめに

gitのバージョン2.23からgit switch及びgit restoreコマンドが入り、git checkoutがこれらの2つに分離されるようになりました。これに伴い、git checkoutも将来的に廃止の方向に向かうでしょう。

※switch/restoreはまだ実験的導入のため、今後文法などが変更になる場合があります。

git checkoutの機能

git checkoutには大きく分けて以下のような機能があります。

既存のブランチに移動する

例えば自分が作業ブランチbranch-aにいたとして、masterブランチに移動したい時に使います。

$ git checkout master

新しいブランチを作成してそれに移動する

ローカルに新しいブランチを作成、移動することが同時にできる機能です。

$ git checkout -b feature/hoge

このとき、何も指定がなければ現在自分が使っているブランチを起点にブランチを作成します。 もしリモートブランチや他のブランチを起点にブランチを作成したい場合、以下のように指定することができます。

$ git branch
* feature/hoge # 自分が今いるブランチ
  feature/fuga
  master
$ git checkout -b feature/fuga_foo feature/fuga
$ git branch
  feature/hoge
  feature/fuga
* feature/fuga_foo # feature/fugaを起点に新しく作られたブランチに移動している
  master

git fetchと組み合わせると、リモートの最新ブランチから直接checkoutすることもできます。

$ git fetch && git checkout -b feature/new_branch_from_some_remote origin/some_remote

あるファイルを特定のコミットハッシュ/ブランチから取得

git checkoutはブランチ移動のイメージが強いですが、ファイルに対して使うこともできます。

例えば変更をすべて取り消したい場合はHEAD(現ブランチの最新コミット)を指定することで以下のように表現できます。

$ git checkout HEAD .

また、特定のコミットからあるファイルを持ってきたい場合は以下のように表現できます。

$ git checkout hash ./path/to/file

cherry-pickはコミット単位で変更を取得するコマンドなのに対し、この場合のcheckoutはファイル単位で特定のコミット/ブランチから持ってくることができるため非常に便利です。

checkout vs switch & restore 対応表

git switch git restore
git checkout git switch
git checkout -b git switch -c
git checkout HEAD git restore
git checkout hash(branch) git restore --source hash(branch)

見て分かる通り、checkoutにはブランチを扱う機能とファイルを扱う機能が混合していて、今回のこの対応はこれら2つを分離した格好になっています。

みなさんもこれで快適git switchライフを送りましょう!