QA@IT

Gitでリモートのブランチを追いかけるには?

7319 PV

Gitでリモート(GitHub)に新しくブランチができたとき、これをチェックアウトする正しいやり方は?

$ (master) git remote -v
origin  git@github.com:foo/bar.git (fetch)
origin  git@github.com:foo/bar.git (push)
$ (master)

とある場合に、普通にチェックアウトだけすると、

$ (master) git checkout origin/new_branch
Note: checking out 'origin/new_branch'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at d8c9e63... bugfix

$ (no-branch) git status
# Not currently on any branch.
nothing to commit (working directory clean)
$ (no-branch)

と、no-branchに落とされてしまいます。そうではなく、リモートを追跡するのはどうすればいいでしょうか?

回答

エラーメッセージにあるように、

$  git checkout origin/new_branch -b new_branch_name

でどうでしょうか。
元のコマンドでcheckoutしているのはリモートのリポジトリの(表現であるところの)ブランチであってローカルブランチじゃないというのがポイントです。-bつけることで、チェックアウト時に自分のリポジトリを作ってます。

元の話とはずれますが、追いかけるだけなら

$  git log -p ..origin/new_branch

なんかで差分commitを表示するほうが好みです。

編集 履歴 (0)
  • なるほど、必ずしもチェックアウトしなくても読むことはできるんですね。知りませんでした! -
$ git checkout -t orign/new_branch

が、私の目的にはよさそうです。

git-checkoutは、 -b オプションで、git-branch を実行したことになりますが、このとき、trackオプションを付けられるんですね。つまり、

$ git checkout -b --track origin/new_branch

でオッケー。trackの場合は、-bも不要で、さらに短縮形として -t があるので、結局、

$ git checkout -t orign/new_branch

となります。

追記:ローカルにnew_branchブランチがなくnew_branchoriginにしかないときは,git checkout -t origin/new_branchgit checkout new_branchとも書けます。

編集 履歴 (3)
  • ローカルに`new_branch`ブランチがなく`new_branch`が`origin`にしかないときは,`git checkout -t origin/new_branch`は`git checkout new_branch`とも書けます. -
  • ありがとうございます! 回答に追記しました -
ウォッチ

この質問への回答やコメントをメールでお知らせします。