Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

git switchとrestoreの役割と機能について

今回の目玉機能と言えば、新しいコマンド git switchgit restore ですね!


  • ブランチの変更は 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>


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(実験的な代替手段)" ということなので(マニュアルにも書いてある)、今後仕様変更される可能性もありますので、使用される方は気に留めるようにしてください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
Help us understand the problem. What are the problem?