はじめに
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ライフを送りましょう!