Git 2.23.0でswitchとrestoreコマンドが追加!git checkoutから乗り換え
2019年8月16日にGitが大きくアップデートし、バージョン2.23.0がリリースされました。
バージョン2.23.0では、新しいコマンドとして「git switch」と「git restore」が追加されております。
この2つのコマンドは、「git checkout」と大きく関連性があり、今後「git checkout」から置き換わる可能性があるので調べてみました。
Git 2.23.0のgit switchとgit restoreの要点
Gitの問題点として、「git checkout」がブランチの変更だったり、作業ファイルの取り消しなど、多様な使い方が可能である点が挙げられます。
そのため、エンジニアは1日になんども「git checkout」を打ち続けおります。
過去のコマンドを遡り、「history |grep ‘git checkout’」と叩くと悲惨な結果が見えるはずです。
こうした問題を解決するために誕生したのが「git switch」と「git restore」です。
「git switch」は、ブランチの変更に使用され、「git restore」はファイルの変更に使用される役割があります。
もちろん、これまでどおり「git checkout」を使用することができますが、役割によってコマンドを使い分けたほうが目的がはっきりしますし、historyを追った結果から過去に何を行ったのかひと目で分かるようになります。
なお、バージョン「2.23.0」で正式に追加された機能ではありますが、「実験的な機能」であるため、扱い方が変更される可能性もあるようです。
- ブランチの変更:git switch
- ファイルの変更:git restore
git checkoutとgit switch
ブランチの変更を行う場合、「git checkout」と「git switch」の使い方を比較してみましょう。
まずは、ブランチの切り替えを行う場合のコマンド例です。
ブランチの切り替え
git checkout <branch> git switch <branch>
このとおり、「git checkout」と全く同じ文法で記述することが可能です。
続いてブランチの作成を行う場合のコマンドはこちらとなります。
ブランチの作成
git checkout -b <branch> git switch -c <branch>
2つのコマンド例から「git checkout」と「git switch」ではコマンドの使い方に大きな差がないことがわかります。
これを踏まえて、「git checkout」と「git switch」のコマンドオプションを見てみましょう。
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 [] [--] <pathspec>… git checkout (-p|--patch) [<tree-ish>] [--] [<paths>…]
git switchのオプション
git switch [] [--no-guess] <branch> git switch [] --detach [<start-point>] git switch [] (-c|-C) <new-branch> [<start-point>] git switch [] --orphan <new-branch>
見てのとおり「git checkout」と「git switch」のオプションがほとんど変わらないことがわかります。
これは、「git switch」は新しい機能として追加されたコマンドではなく、「機能を分けること」が目的であるため、使い方に大きな違いが無いことがわかります。
git checkoutとgit restore
「git switch」でもコマンドオプションに触れたので、「git restore」のコマンドオプションも見てみましょう。
git switchのオプション
git restore [<options>] [--source=] [--staged] [--worktree] <pathspec>… git restore (-p|--patch) [<options>] [--source=] [--staged] [--worktree] [<pathspec>…]
こちらのコマンドも「git checkout」と大きな変更がないことがわかります。
「git restore」は、名前のとおりファイルを復旧することを事を目的としております。
「git checkout」と「git restore」で同じ動作をしたときのコマンドを比較するとこのようになります。
ファイルの変更を取り消し
git checkout -- <filename> git restore <filename>
「git restore」には、「git reset」のようにステージングエリアも変更できる「–worktree」オプションと「–staged」オプションが存在しております。
ステージングエリアにあるファイルを普及する場合の「git reset」と「git restore」の違いはこのようになります。
git restore –stagedとgit resetでステージングエリアにあるファイルを復旧
git reset <filename> git restore --staged <filename>
この場合、実ファイルへの変更がそのままであることに注意して下さい。
もう一つのオプションである「–worktree」を使用したワークツリー状のファイルを普及するコマンドの違いは以下のとなります。
git restore –worktreeとgit resetでワークツリーにあるファイルを復旧
git reset --hard <filename> git restore --worktree <filename>
この場合、「–staged」と違い、実ファイルの変更がリセットされるので注意が必要です。
また、オプション無しで「git restore <filename>」を実行した場合、デフォルトで「–worktree」が付く仕様となっているようです。
今後はgit checkoutよりもgit switchとgit restoreが流行ると予想
今回追加された「git switch」と「git restore」は、今後「git checkout」が古いものに見えるほど流行ると思われます。
「Experimental alternatives(実験的な代行手段)」として追加されたコマンドですが、「git checkout」と比較しても目的がはっきりとしており、今後推奨されるコマンドとなることが期待されております。
なお、冒頭でも書きましたが「git switch」と「git restore」は実験段階であるため、仕様変更が行われる可能性が十分にあります。
使われる際は、今後のバージョンアップで大きく変更される可能性があることを強く意識したほうが良いでしょう。
詳しい内容は、公式ドキュメントである「git-checkout」と「git-switch」、「git-restore」を参照して下さい。