きっかけ
前回の記事(「こんなことしたい」って時にどんな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
がどうなるのか注目しておいたほうが良さそうですね。