共同開発の第一歩!git fetchを正しく理解しよう!

みなさんこんにちは!

フリーランスプログラマーのsatoです!

今回は「fetchコマンド」について勉強しましょう!

gitを使う最大のメリットの一つとして、他人と並行して開発ができることがあげられるでしょう。それを実現するために「他人の開発内容を自分のローカル環境に落としてくる」必要があります。

それを実現するために使用するのがfetchコマンドです。gitを使う上で重要なのコマンドです。ぜひここでマスターしましょう!

  • [基本]fetchとは
  • [基本]リポジトリを理解しよう
  • [基本]fetchの使い方
  • [基本]タグを同期しよう
  • [基本]ブランチの削除を同期しよう
  • [応用]fetchとpullの違い
  • [応用]mergeしよう!

今回は「リポジトリ」といった概念的なものから学び…続けて具体的なfetchコマンドの使い方を見ていきましょう!

最後にfetchと似た用途で使用されるpullコマンドとの違いも見ていきましょうか。

目次

fetchとは

fetchとは、一言で言うと「みんなの更新内容を、自分の開発環境に取り入れる機能」です。fetchを使うことで、みんなの作ったコミットやブランチ・タグなどを、自分の環境に取り入れるができるわけですね!

と、言葉で言っても実際の挙動がわかりづらいと思います。まずは図を見つつ、gitのリポジトリ(ディレクトリの状態)から学んでいきましょう。

リポジトリとは?

※リポジトリがわかる人は、この項目は飛ばしてもらってかまいません。fetchコマンドやpushコマンドを学ぶ上で、リポジトリを理解することがとても大切です。ここでは、それを見ていきましょう。

「リモートリポジトリ」と「ローカルリポジトリ」

リポジトリとは「ファイルやディレクトリの状態」のことを言います。そして「みんなのファイルやディレクトリの状態」が保存されている場所のことをリモートリポジトリ。

「自分のファイルやディレクトリの状態」保存されている場所のことをローカルリポジトリと呼びます。

基本的にローカルリポジトリは、リモートリポジトリをコピーして作られています。※このコピーはcloneコマンドで行うことができます。共同開発するみんなは、リモートリポジトリを元にした、ローカルリポジトリを各自持って開発しているわけです!

「pushコマンド」と「fetchコマンド」

そしてその「リモートリポジトリ」と「ローカルリポジトリ」のデータのやりとりに使うのが、「pushコマンド」と「fetchコマンド」です。以下は、Bさんが進めた開発を、Aさんが取り込むまでの図です

※赤い丸が、Bさんの開発が含まれるコミットです。

Bさんが行った開発を、pushコマンドでリモートリポジトリに共有し、それをfetchコマンドでAさんが落として取得しています。このような流れによって、みんなの開発状況を共有できているわけですね!

fetchの使い方

ではfetchコマンドの具体的な話に入っていきましょう。

fetchコマンドの基本

先ほども言った通り、fetchコマンドとは、一言で言うと「みんなの更新内容を、自分の開発環境に取り入れる機能」です。

誰かがあげた機能を…

fetchコマンドで取得することができます。この際注意しなければならないのが、マージまでは行われないことです。その辺りはまた後ほど説明しますね。

基本的な使い方

まずは基本的なコマンドです。

git fetch

本来は、リポジトリやブランチを後ろにつけて、指定することができます。(後ほど詳細は説明しますね!)ただ基本的に、特殊な設定を行っていなければ「git fetch」のみで、すべての更新を取得できるはずです。

特定のリポジトリのみ取得したい

gitはリポジトリを複数設定できます。複数設定している場合は、任意のリポジトリを指定し、やりとりを行いたいケースが発生します。その場合は、引数としてリポジトリ名をつけましょう。

git fetch origin

上記は、リポジトリ名originを指定した場合です。このコマンドで、originリポジトリの全ブランチの更新を取得することができます。また、リポジトリが複数あるとき、すべてから落としてきたい場合は、–allオプションをつけましょう。

git fetch --all

–allオプションをつけることですべてのリポジトリから更新を取得することができます

特定ブランチのみ取得したい

特定ブランチのみの更新を取得したい場合、「リポジトリ名」と「ブランチ名」を指定しましょう。

git fetch origin master

上記の例は、originリポジトリのmasterブランチのみを取得しています。

注意点

後ほど「pullコマンドとの違い」の項目でも説明していきますが、「fetchコマンド」はあくまで更新を取得してくるコマンドです。マージ作業までは行ってくれません。

「fetchコマンド」を行っただけでは、プログラムを実行しても、他人の更新部分はプログラムへはまだ取り込まれていないので注意しましょう。そこまで行うには「fetchコマンド」を行ったのちに、「mergeコマンド」でマージ作業を行いましょう!

fetchの使い方(応用)

次にオプションを使った応用的な使い方を見てみましょう。

タグの同期しよう

リリース管理などにタグを利用することもあるでしょう。その場合タグの同期をとる必要があります。

git fetch -t
git fetch --tags

-t もしくは –tags オプションをつけることでリモートのタグを取得することができます。

ブランチの削除を同期しよう

誰かがリモートリポジトリのブランチを削除した場合でも、ローカルリポジトリには、origin/xxxxxといった形で残り続けることがあります。その場合は以下のコマンドで、削除の同期をかけることが可能です。

git fetch -p
git fetch --prune

fetchとpullの違い

ここまででfetchコマンドについて、理解が深まったとおもいます。その上で、pullコマンドとの違いについて見ていきましょう。「pullコマンド」と「fetchコマンド」。

この二つの違いや、使い分け方について悩んでいる人も多いと思います。その疑問を解消していきましょう。

pullコマンドとは

pullコマンドはfetchコマンドと同じく、「リモートリポジトリ」と「ローカルリポジトリ」の同期をかけるコマンドです。ただし「pullコマンド」はデータを取得してくる「fetchコマンド」とは違い、同時にブランチのマージまで実行してくれます。

つまり…「pullコマンド」とは、内部で「fetchコマンド」と「mergeコマンド」を順次行ってくれているコマンドなんです。図にしてみましょう。

取得だけを行ってくれるfetchコマンドがこちらです。

そして…

同時にマージまでかけて、ブランチの移動まで行ってくれるのが「pullコマンド」というわけですね!

どちらを使うべき?

「pullコマンドなら、マージまで行ってくれるから、pullでいいんじゃない?」と考える人も多いでしょう。

しかし個人的には、基本的に「fetchコマンド」を利用すべきだと考えています。なぜなら、これらは他人の作業と、自分の作業を擦り合せる重要な作業です。

まず「fetchコマンド」で更新を取得し、内容を確認したのちに、マージ作業に取りかかるべきです。内容を確認せずマージしてしまうのは、少し無責任な作業になってしまいますし、衝突が起きたときの解消にも少し手間取ります。そのため基本的にfetchを使っていくことをお勧めします。

※とはいえ、もちろんpullも有用なコマンドです。早送りマージが確定している場合などに素早く作業するなど有用性は高いため、うまく使い分けていきましょう!

mergeしよう!

最後に、繰り返しになりますが「mergeコマンド」は「fetchコマンド」で取り込んだ情報をマージするのに必須のコマンドです。ぜひ続けて読んでおいてください。

まとめ

今回はfetchコマンドについて見てきました。fetchコマンドは「みんなの更新内容を、自分の開発環境に取り入れる機能」です。他人の更新を取得する、重要なコマンドです。ぜひ今回学んだことを実践し、より深く理解していきましょう!

「fetchコマンド」と「pushコマンド」を使いこなすことが、共同開発をマスターするための第一歩です。

この記事を書いた人

学生時代を含めると、かれこれ10年以上プログラマーとして過ごしています。
様々な言語や環境、プロジェクトに関わってきましたので、より実践的な記事をみなさんにお届きるよう情報発信していきます!

目次