社内でgit checkout
でブランチを切り替えたり、変更を破棄したりしている方がいたので、git checkout
を使用している方に向けて「checkout
は使わんで!」という内容を書きます。
git checkout
は多機能で怖いから switch
, restore
使え!
突然ですが、ブランチの切り替えやちょっとした修正の取り消しに、git checkout コマンドを使っていませんか? 手に馴染んだコマンドで、つい指が動いてしまう方も多いかと思います。自分ちょうど一年前まではcheckout
使ってました。
ですが、その便利なはずの git checkout
には、 意図しない事故を引き起こしかねない「怖さ」 が潜んでいるんです。
checkout
の何がそんなに「怖い」のか?
結論から言うと、checkout
は役割が多すぎるのが問題です。
このコマンドは、大きく分けて以下の2つの全く異なる操作を実行します。
- ブランチを切り替える
- ファイルの変更を元に戻す
「ブランチ操作」と「ファイル操作」という、コンテキストが全く違う作業を同じコマンドが担当しているため、こんな悲劇が起こり得ます。
[怖い話] ブランチ名とファイル名を間違えたら…?
あなたが feature/AB-123 というブランチに切り替えようとして、うっかりこう入力したとします。
# ブランチ名をタイポした
$ git checkout feature/AB-12
もし feature/AB-12 という名前のファイルやディレクトリが過去のコミットに存在した場合、Gitは「お、このファイルの状態に戻したいんだな」と解釈して、あなたの作業ツリーにある同名のファイルを警告なしに上書きしてしまう可能性があります。
安全な新コマンド switch
と restore
を使おう
このような事故を防ぐため、Git 2.23から checkout の機能は2つの専門家コマンドに分割されました。
ブランチ操作の専門家 git switch
ブランチを「切り替える(switch)」ことだけに責任を持ちます。ファイル操作は一切行いません。
ファイル復元の専門家 git restore
ファイルの変更を「元に戻す(restore)」ことだけに責任を持ちます。ブランチ操作は一切行いません。
役割が完全に分かれているため、もう間違うことはありません。
まとめ
今日から checkout 依存を卒業しよう!
もちろん、git checkout がすぐに使えなくなるわけではありませんが、コードを守るために、より安全で明確な方法があるなら、それを使わない手はありません。
今日からブランチを移動するときは git switch
を、**ファイルの変更を取り消すときは git restore
** を意識して使ってみてください。
皆さんの日々の開発が、少しでも安全で快適になりますように。