【gitをソフト開発で使いこなそう!:第12回】git fetchで引数を省略すると何が起こる?

次回の記事

terapotan.hatenablog.jp

前回の記事

terapotan.hatenablog.jp

連載記事一覧

  terapotan.hatenablog.jp

今回は、リモートリポジトリから変更を取り込むコマンドである「git fetch」の使い方を解説していきます。
前回と同じく、リポジトリ名やブランチ名を全て省略したときの動作も扱います。

前提知識

今回の記事の説明をしっかりと理解するには、上流ブランチリモート追跡ブランチという用語について理解している必要があります。

下の記事では、用語の解説を行っています。
用語の意味が分からない方は、ご覧になることをお勧めします。

terapotan.hatenablog.jp

git fetch

どんなコマンド?

リモートリポジトリから、変更を取り込むコマンドです。
下のような例を考えてみましょう。

fetch解説例

リモートブランチmasterには、ローカルブランチmasterにはまだないコミットが追加されています。
上の図で言うとコミットB,Cの部分です。

この時git fetchコマンドを使うと、コミットB,Cの部分をダウンロードすることが出来ます。

ダウンロード

ここで注意しなければならないのは、git fetchコマンドは、本当にただダウンロードするだけという点です。
上の図を見ると分かる通り、リモート追跡ブランチであるorigin/masterはコミットCへ動いていますが、ローカルブランチであるmasterは動いていません。

前回のコラムで解説した通り、リモート追跡ブランチにチェックアウト(HEADを移動させる)ことは出来ませんから、このままではダウンロードしてきた分を編集することは出来ません。

編集出来るようにするには、git mergeコマンドを使って、origin/mastermasterをマージする必要があります。

コマンドの使い方

先ほど挙げた例で、git fetchコマンドをどのように使うか見ていきましょう。

さっきの例

今、リモートリポジトリoriginのリモートブランチmasterをローカルリポジトリに取り込みたい(ダウンロードしたい)とします。

次のようにコマンドを入力すると、変更を取り込むことが出来ます。

git fetch origin master

値の意味は次の通りです。

git fetch <取り込みたいリモートリポジトリ名> <取り込みたいリモートブランチ名>

リモートリポジトリtestのリモートブランチdevelopのみを、ローカルリポジトリに取り込みたいときは、

git fetch test develop

というコマンドを実行します。

全て省略すると?

例として挙げる例

上の図のような状況(カレントブランチはmaster。masterブランチの上流ブランチは、myrepo/master。)で、

git fetch

のようにリモートリポジトリ名とリモートブランチ名を省略してコマンドを実行したとき、何が起こるのでしょうか。

前回と同じように、上の例を使って、リモートリポジトリ名とリモートブランチ名がどのように指定されるのか見ていくことにします。

リモートリポジトリ名

今回の例では、masterブランチがカレントブランチになっています。
また、masterブランチの上流ブランチは、リモート追跡ブランチmyrepo/masterに設定されています。

このように、上流ブランチが設定されている場合は、リモート追跡ブランチが追跡しているリモートリポジトリ名が、指定されます。

今回の例では、myrepoがリモートリポジトリ名として指定されることになります。

上流ブランチが設定されていない場合は、originが指定されます。
(originが存在しない場合は、何も起こりません。)

リモートブランチ名

リモートブランチ名を省略した場合、リモートリポジトリ名のリモートリポジトリにある全てのリモートブランチの変更が取り込まれます。

今回、リモートリポジトリ名はmyrepoが指定されています。ですから、リモートリポジトリmyrepoにある、リモートブランチであるmasterdevelopが取り込まれることになります。

最終結果

リモートブランチ名だけ省略すると?

リモートブランチ名だけ省略した場合というのは、

git fetch myrepo

などのようにコマンドを入力することです。
この場合、リモートリポジトリmyrepoにあるリモートブランチ全てが、取り込まれます。

マージしないと編集することは出来ない

本記事の最初でも解説した通り、git fetchコマンドは本当にただダウンロードするだけです。
リモートリポジトリからダウンロードしてきた内容を基に編集するには、ローカルブランチとマージする必要があります。

実際にどうやるのか

下の図のように、既にリモートリポジトリmasterの内容をダウンロードしてきた場合を考えます。

ダウンロード

ダウンロードしてきた内容を指しているのは、リモート追跡ブランチorigin/masterです。
(リモート追跡ブランチは、git fetchコマンドを実行したと同時に移動します。)

ですから、origin/masterとローカルブランチmasterをマージすればいいことになります。
そうすれば、ローカルブランチmaster上で取り込んできた変更を元に編集することが出来ます。

ローカルブランチmasterにチェックアウト(git checkout master)して、下のコマンドを実行します。

git merge origin/master

origin/masterの履歴が、ローカルブランチmasterにまとめられました。

merge実行後

次回予告

git,GitHubでは、ある特別な名前をファイルにつけると特別な働きをするものがあります。
次回は、そんなファイルをいくつか紹介します。

う-ん、よく分からん!

この記事を読んで、疑問に思うことがあったときは、気軽にコメント欄や私のTwitterから質問してください。

参考文献

Pro Git

git,GitHubを使うにあたって必要なコマンドの使い方が詳しく解説されています。この連載を読んで分からないことや詳しく知りたいことがあったときはまずProgitを読んでみるといいでしょう。 git-scm.com

git用語解説マニュアル

git公式の用語解説マニュアルです。
上流ブランチ(upstream branch)や、コミット(commit)等の用語の意味について英語で書かれています。
git-scm.com

git fetch

git fetchコマンドに関するgit公式マニュアルです。

git-scm.com

次回の記事

terapotan.hatenablog.jp

前回の記事

terapotan.hatenablog.jp

連載記事一覧

terapotan.hatenablog.jp