Gitを使い始めて最初に教わるコマンドの一つが git checkout です。しかし、この git checkout コマンドは、非常に便利である一方、使い方が多岐にわたりすぎており、初心者にとって混乱の元となっていました。
Git 2.23(2019年リリース)において、この混雑した機能を整理し、安全で分かりやすい操作を提供するために、2つの新しいコマンド git switch と git restore が導入されました。
本記事では、なぜ git checkout の利用が非推奨となってきているのか、新コマンドへの移行手順とその意義を解説します。
1. git checkout が抱えていた「二重の役割」問題
git checkout の最大の問題は、「ブランチの切り替え」と「ファイルの復元(破棄)」という全く異なる二つの重要な操作を、同じコマンド名で実行できてしまうことでした。
ブランチ切り替え操作:
# feature-branch に切り替える
git checkout feature-branch
ファイルの復元操作:
# 作業ディレクトリにある main.js の変更を破棄して直前のコミット時の状態に戻す
git checkout -- main.js
この仕様には、「ファイルを元に戻すつもりでコマンドを入力したら、同名のブランチに切り替わってしまい、作業途中の変更に問題が起きた」といった意図しない事故を誘発するリスクがありました。
2. 機能分離された新コマンド
この問題を解決するため、Git開発チームは役割を明確に分けた2つのコマンドを定義しました。
3. ブランチ操作に特化した git switch
git switch は、その名の通り「ブランチの切り替え(スイッチ)」だけを行うコマンドです。ファイル操作の機能は含まれていません。
基本的な使い方:
# 既存のブランチに切り替える
git switch feature-branch
# 新しいブランチを作成し、同時に切り替える(従来の checkout -b に相当)
git switch -c new-feature-branch
# 直前にいたブランチに戻る(従来の checkout - に相当)
git switch -
4. ファイル変更の操作に特化した git restore
git restore は、作業コピーやステージングエリアにあるファイルを過去の状態に「復元(リストア)」するコマンドです。
基本的な使い方:
# 作業ディレクトリ上のファイルの変更を破棄し、最後のコミット状態に戻す(従来の checkout -- に相当)
git restore src/main.js
# ステージングに追加(git add)したファイルを、ステージングから取り消す(従来の git reset HEAD に相当)
git restore --staged src/main.js
# ステージングの取り消しと、作業ディレクトリの変更破棄を同時に行う
git restore --source=HEAD --staged --worktree src/main.js
5. なぜ今すぐ移行すべきなのか?
- 安全性の向上: 誤ってファイルを削除してしまったり、無関係なブランチをチェックアウトしてしまうケアレスミスを防ぎます。
- 直感的な意味理解:
switchとrestoreという単語自体が操作そのものを表しているため、コマンドの意味が理解しやすくなり、チーム内のマニュアル整備や新人研修時の負担が減ります。
すでに導入から数年が経過しており、各ツールや主要ドキュメントもこれら新コマンドをベースに書き換えられています。
まとめ
現在も互換性のために git checkout コマンド自体は利用可能ですが、安全かつ明瞭なGit運用のために、今すぐ新コマンドに移行しましょう。
- ブランチの切り替えは
git switch - ファイルの差し戻しは
git restore
このシンプルな棲み分けを体得し、日々のGit操作の安全性と生産性を高めていきましょう。
