🐙

【Git】リモートブランチを引数なしでcheckoutして良いか

2022/03/04に公開

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は、参照用の便利コマンドくらいに思っときます。

https://git-scm.com/docs/git-checkout/2.23.0

ちなみに公式の説明を見ると、引数なし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 に分解されたんでしたね。

https://qiita.com/yukibear/items/4f88a5c0e4b1801ee952

書きながら思いましたが、今のGitだとこっちを使うのが筋ですね……
これからはなるべくgit switch/restore で操作する癖をつけようと思います。

ちなみにswitchだと

% git switch -c some/some origin/feature/any
% git switch feature/any

でcheckoutと同じ挙動になります。

参考

https://qiita.com/uasi/items/69368c17c79e99aaddbf

Discussion