きっかけ
前回の記事(「こんなことしたい」って時にどんなgitコマンド使えば良いのか?)を書いているときに、
コマンドについて下図のようなお絵かきをして整理していたのですが
git checkoutって状況/条件によって挙動が色々ありすぎじゃない?
※ちなみにお絵かきしている途中で同じような物を公式がチートシートとして用意していることに気づきました...
git checkoutの挙動整理
ブランチ名を指定した場合
| ローカルブランチに存在する | リモート追跡ブランチに存在する |
git checkoutの挙動 |
|---|---|---|
| × | × | ブランチを切り出す |
| × | ○ | リモートからブランチをローカルリポジトリ内に持ってくる |
| ○ | ○ | 参照するローカルブランチを切り替える |
ファイル名を指定した場合
ワーキングツリー内の指定したファイルの編集内容をローカルブランチの内容でもとに戻す
チェックアウトという名前の範囲から逸脱していないか?
ブランチを切り出したり、ブランチを切り替えたり、ファイルの編集内容をもとに戻したりと
チェックアウトという名前を付けられていながら、実際にはある意味やりたい放題のコマンドになっている印象が強いです。
(svnをずっと触っていたこともあり)チェックアウトとは、「リポジトリから何かしらを持ってくる」ものだと思っていまいたため、gitを触り始めたときに「???」となったポイントの一つでした
新しいオフィシャル見てみたら新しいコマンドが追加されてた
このやりたい放題のgit checkoutについてgitのオフィシャルを読んでいたら最後のsee alsoにそれっぽい名前のコマンドが書かれていました。
| コマンド | 内容 |
|---|---|
git switch |
Switch branches(ブランチ切替) |
git restore |
Restore working tree files(ワーキングツリー内ファイルの復元) |
どうやら去年(2019年)の8月のアップデート2.23.0で追加されたコマンドのようです。
※使っていたgitが2.21.?だったので気づきませんでした……
新コマンド含めて、役割を再整理しよう
| やりたいこと | 使うコマンド |
|---|---|
| ブランチ切り出し | git branch |
| ブランチ取得 | git checkout |
| ブランチ切替 | git switch |
| ファイル復元/編集内容取消 | git restore |
以後こんな感じで整理してコマンドを理解しておけば変なこともないよね?
と思っていたのですが
git switchとgit restoreのDESCRIPTIONにこんな記載がありました
THIS COMMAND IS EXPERIMENTAL. THE BEHAVIOR MAY CHANGE.
- これは実験的なコマンドなので、挙動が変わる可能性があるよ
結論
| やりたいこと | 使うコマンド |
|---|---|
| ブランチ切り出し | git branch |
| ブランチ取得 | git checkout |
| ブランチ切替 |
git checkout git switch |
| ファイル復元/編集内容取消 |
git checkout git restore |
- コマンドの役割分担的に考えて、少なくともブランチ切り出しは
git branchで良いと思う - ブランチ切替、ファイル復元は新コマンド(
git switchとgit restore)が用意されているが、変更される可能性があるのでしばらくは様子見してgit checkoutを使い続けた方が良さそう
と言う微妙な結論になりました。
新コマンドの注意書きにでは挙動が変更となる可能性という書き方なので、少なくともコマンドがなくなる事はなさそうなので、今後のgitのリリースでgit switchとgit restoreがどうなるのか注目しておいたほうが良さそうですね。
