開発ブログ

WWWクリエイターズが送る、Git、CSS、HTML、コマンドライン、Macの便利機能など、開発に関する役立ち情報発信します。気まぐれに更新。

gitでリモートのブランチをcheckoutして作業する方法

最終更新:2017-09-20 by Joe

チームメンバーがリモートレポジトリにPushしたブランチを更新したい時、そのブランチをcheckoutして作業する方法です。

リモートブランチをfetchしてcheckoutする

リモートブランチは直接更新することはできません。編集できるのはローカルブランチだけですので、(1)ローカルに落としてから、(2)編集して、(3)Pushする、という手順を踏む必要があります。

まずはコマンドから。リモート「origin」にある「some-cool-feature」というブランチで作業するという例です。

//(1)リモートのすべてのブランチを、ローカルのリモート追跡ブランチに反映する
git fetch

// もし、特定のブランチだけ取ってくるのであれば、ブランチを限定してもよい。
git fetch origin some-cool-feature

//(2)所望のブランチをチェックアウトする
git checkout some-cool-feature

誤解されやすい点で、抑えておく必要があるのは「リモートにあるブランチをチェックアウトする」はできないですし、「リモート追跡ブランチをチェックアウトしてそこで作業する」事もできない、という点です。

git fetch =リモート追跡ブランチの最新化

git fetch で起きているのは、remote レポジトリ(レポジトリ名を指定しない場合、すべてのリモートが対象)を、ローカルのリモート追跡ブランチに反映する、という動作です。これがgit  fetch のそもそもの動作仕様です。

マニュアルより抜粋します:

抜粋:https://git-scm.com/docs/git-fetch より

Fetch branches and/or tags (collectively, “refs”) from one or more other repositories, along with the objects necessary to complete their histories. Remote-tracking branches are updated.

<snip>

git fetch can fetch from either a single named repository or URL, or from several repositories at once if <group> is given and there is a remotes.<group> entry in the configuration file. (See git-config[1]).

When no remote is specified, by default the origin remote will be used, unless there’s an upstream branch configured for the current branch.

日本語訳:

一つ以上のレポジトリから、タグと/かブランチ(まとめて、refsと呼ばれます)、およびその完全な履歴をすべて取得します。リモート追跡ブランチは更新されます。

<中略>

git fetch は唯一の名前をもつレポジトリかURL、もしくは、コンフィグファイルにremotes.<group>が記載されていれば、複数のレポジトリを一度にすべて取得します。

もしremoteが指定されなければ、他の上流ブランチが現在いるブランチに指定されていない限り、デフォルトでoriginが使われます。

git checkout の親切機能

(2)git checkoutは、ローカルにある「some-cool-feature」ブランチをチェックアウトするコマンドです。

実際まだローカルには、「some-cool-feature」は無い場合は、(gitの親切機能で)自動的にリモート追跡ブランチ「origin/some-cool-feature」という同名のブランチを見つけ出して、そのブランチを上流ブランチとする、ローカルブランチ「some-cool-feature」を新しく作成してくれる、というわけです。

この新設機能を使わないとしたら、こんな感じのコマンドが’必要になります。です。

// リモート追跡「some-cool-feature」をトラックするローカルブランチを
// 作成してからチェックアウト
git branch some-cool-feature origin/some-cool-feature
git checkout some-cool-feature

// 同義
git checkout -b some-cool-feature origin/some-cool-feature

-b オプションは、あたかもgit branch を実行したかのように、ブランチを新規作成してくれるオプションでしたね。

リモートブランチをチェックアウトする?

繰り返しですが、リモートも、リモート追跡ブランチもチェックアウトできません。あなたが作業できるのは「ローカルブランチ」だけ、というわけです。

ためしにリモート追跡ブランチをcheckoutしてみたら・・?

$git checkout origin/some-cool-feature

Note: checking out ‘origin/some-cool-feature’.

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>

「Detached HEAD状」態になってしまいました。これは、いわば「匿名ブランチにいる状態」という所で、つまるところ、origin/some-cool-featureをチェックアウトしてそのブランチで作業できていない(匿名ブランチに乗っている)ということですね。

もし、新しいブランチで作業したければ、ちゃんと-bでローカルブランチ作ってね、という但し書きまであります。

 

以上です。

閉じる