【gitをソフト開発で使いこなそう!:第12回】git fetchで引数を省略すると何が起こる?
今回は、リモートリポジトリから変更を取り込むコマンドである「git fetch」の使い方を解説していきます。
前回と同じく、リポジトリ名やブランチ名を全て省略したときの動作も扱います。
前提知識
今回の記事の説明をしっかりと理解するには、上流ブランチとリモート追跡ブランチという用語について理解している必要があります。
下の記事では、用語の解説を行っています。
用語の意味が分からない方は、ご覧になることをお勧めします。
git fetch
どんなコマンド?
リモートリポジトリから、変更を取り込むコマンドです。
下のような例を考えてみましょう。
リモートブランチmasterには、ローカルブランチmasterにはまだないコミットが追加されています。
上の図で言うとコミットB,Cの部分です。
この時git fetch
コマンドを使うと、コミットB,Cの部分をダウンロードすることが出来ます。
ここで注意しなければならないのは、git fetch
コマンドは、本当にただダウンロードするだけという点です。
上の図を見ると分かる通り、リモート追跡ブランチであるorigin/master
はコミットCへ動いていますが、ローカルブランチであるmaster
は動いていません。
前回のコラムで解説した通り、リモート追跡ブランチにチェックアウト(HEADを移動させる)ことは出来ませんから、このままではダウンロードしてきた分を編集することは出来ません。
編集出来るようにするには、git merge
コマンドを使って、origin/master
とmaster
をマージする必要があります。
コマンドの使い方
先ほど挙げた例で、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
にある、リモートブランチであるmaster
とdevelop
が取り込まれることになります。
リモートブランチ名だけ省略すると?
リモートブランチ名だけ省略した場合というのは、
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
にまとめられました。
次回予告
git,GitHubでは、ある特別な名前をファイルにつけると特別な働きをするものがあります。
次回は、そんなファイルをいくつか紹介します。
う-ん、よく分からん!
この記事を読んで、疑問に思うことがあったときは、気軽にコメント欄や私のTwitterから質問してください。
参考文献
Pro Git
git,GitHubを使うにあたって必要なコマンドの使い方が詳しく解説されています。この連載を読んで分からないことや詳しく知りたいことがあったときはまずProgitを読んでみるといいでしょう。 git-scm.com
git用語解説マニュアル
git公式の用語解説マニュアルです。
上流ブランチ(upstream branch)や、コミット(commit)等の用語の意味について英語で書かれています。
git-scm.com
git fetch
git fetch
コマンドに関するgit公式マニュアルです。