【Git】リモートブランチを引数なしでcheckoutして良いか
Github上のリポジトリにあるブランチを、ローカルに持ってくるとき、どのコマンドを使ってますか?
例えば、リモートリポジトリにあるfeature/any
というブランチに対して、ローカルにsome/some
というブランチをつくりたいとします。
僕は今まで、このコマンドでやっていました。
(% git fetch)
% git checkout -b some/some origin/feature/any
ただこっちでもできます。
% git checkout feature/any
こっちだと、ローカルにfeature/any
というブランチができます。
基本的には開発するブランチのときは上で丁寧にやって、レビューのときは雑に下を使うときもある、みたいな感じでしたが、
違いをちゃんと把握していなかったので、調べました。
※ git checkout
ではなく、git switch
を使う方が今のGitとしては良さそうな話は、 「git checkout
が分解された話」で後述します。
参照目的なら引数なしcheckout(switch)で問題なし
結論を先に書くと、参照目的なら引数なしcheckout(switch)で問題なしです。
コードレビューのときなら、引数なしで問題ないでしょう。
上流ブランチに注意
引数なしの方が短いんで使いたくなりますが、上流ブランチの設定に注意が必要です。
% git checkout feature/any
Branch 'feature/any' set up to track remote branch 'feature/any' from 'origin'.
Switched to a new branch 'feature/any'
引数なしでcheckoutした場合、
- ローカルブランチでそのブランチ名があったら、そのブランチにHEADを移動
- なかった場合、origin(リモートリポジトリ)にそのブランチ名があったら、同名同内容のローカルブランチを作成
- 上流ブランチを設定
- ローカルブランチを移動
という挙動になります。
なので、このブランチの上流ブランチは下記のように、checkout先のリモートブランチとなります。
% git branch -vv
feature/any fffffffff [origin/feature/any] xxx
この状態だと、コードレビュー時の参照には向いてますが、
変更を加えてpushしたいときは、ブランチ名を変える必要があります。
また、mainブランチに対してプルリクを送りたいなら、上流ブランチの変更が必要です。
それはそれでめんどくさいと思うので、開発ブランチをつくるときはちょっと長くても、-b
付きで、
% git checkout -b feature/some origin/main
と打つのが良さそうです。
あくまで引数なしcheckoutは、参照用の便利コマンドくらいに思っときます。
ちなみに公式の説明を見ると、引数なしcheckoutの挙動は、下記コマンドと同義とされていました。
If <branch> is not found but there does exist a tracking branch in exactly one remote (call it <remote>) with a matching name and --no-guess is not specified, treat as equivalent to
git checkout -b <branch> --track <remote>/<branch>
git checkout
が分解された話
git checkout
は、そういえばgit switch/restore
に分解されたんでしたね。
書きながら思いましたが、今のGitだとこっちを使うのが筋ですね……
これからはなるべくgit switch/restore
で操作する癖をつけようと思います。
ちなみにswitchだと
% git switch -c some/some origin/feature/any
% git switch feature/any
でcheckoutと同じ挙動になります。
参考
Discussion