先日8/16にGitバージョン2.23.0がリリースされました。
今回の目玉機能と言えば、新しいコマンド git switch
と git restore
ですね!
本稿ではこちらの2つに絞ってどういう役割・位置づけの機能なのか英語ソースの引用も含めてご説明します。
TL;DR
- ブランチの変更は
git switch
- ファイルの変更は
git restore
- 今まで通り
git checkout
は使える - 新機能は「実験的機能」なので今後変更の可能性あり
新機能が追加された背景
Highlights from Git 2.23によると、 git checkout
に出来ることがあまりに多いため(ブランチ操作のほか、indexされたファイルの復旧、履歴上のファイルの取得など)、役割を明確に分けるためのコマンドが追加されたとのことです。
It turns out git checkout can do quite a lot.
(中略)
The new commands, by contrast, aim to clearly separate the responsibilities of git checkout into two narrower categories: operations which change branches and operations which change files. To that end, git switch takes care of the former, and git restore the latter.
ブランチの変更は git switch
に、ファイルの変更は git restore
に役割を分けています。
git 2.23.0のドキュメントを見ても、各コマンドの役割が分けられたことで分かりやすくなっています。
公式ドキュメント(英語)
git-checkout | git-switch | git-restore
git checkoutのオプション
git checkout [-q] [-f] [-m] [<branch>]
git checkout [-q] [-f] [-m] --detach [<branch>]
git checkout [-q] [-f] [-m] [--detach] <commit>
git checkout [-q] [-f] [-m] [[-b|-B|--orphan] <new_branch>] [<start_point>]
git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <paths>…
git checkout [<tree-ish>] [--] <pathspec>…
git checkout (-p|--patch) [<tree-ish>] [--] [<paths>…]
git switch
git switch [<options>] [--no-guess] <branch>
git switch [<options>] --detach [<start-point>]
git switch [<options>] (-c|-C) <new-branch> [<start-point>]
git switch [<options>] --orphan <new-branch>
restore
git restore [<options>] [--source=<tree>] [--staged] [--worktree] <pathspec>…
git restore (-p|--patch) [<options>] [--source=<tree>] [--staged] [--worktree] [<pathspec>…]
特に git restore
についてはオプションも含めて意味が明確で分かりやすくなったと感じます。
各コマンドと git checkout
との比較
基本的には「機能を分けること」が目的であり、使い勝手は大きく変わらないです。
git switch
git switch
はその名の通り、 checkout
で行っていたブランチの変更を担当します。
# ブランチの切り替え
git checkout <branch>
git switch <branch>
# ブランチを新規作成して切り替え
git checkout -b <branch>
git switch -c <branch>
git restore
git restore
はファイルの変更に使用します。ファイルを復旧させる時に使うことが多そうなので、良いネーミングですね。
# ファイルの変更を取り消す
git checkout -- <filename>
git restore <filename>
# 特定ファイルを特定のコミットの状態にする
git checkout <commit> -- <filename>
git restore --source <commit> <filename>
--worktree と --staged オプション
git restore
コマンドは git reset
のようにステージングエリアも変更出来るようになっています。
# ステージングエリアにあるファイルを復旧する(実ファイルへの変更はそのまま)
git reset <filename>
git restore --staged <filename>
# ワークツリー上のファイルを復旧する(実ファイルの変更がリセットされる。checkoutの例と同様)
git reset --hard <filename>
git restore --worktree <filename> # オプションがない場合、デフォルトで --worktree オプションが付きます
まとめ
個人的には git checkout
の「機能全部乗せ感」がちょっと使いづらく感じていたので、今回の新機能は率先して使っていくつもりです。
ただ、これらの機能はあくまで "Experimental alternatives(実験的な代替手段)" ということなので(マニュアルにも書いてある)、今後仕様変更される可能性もありますので、使用される方は気に留めるようにしてください。