10
6

More than 3 years have passed since last update.

Git fetchとpullの違い

Posted at

どちらも「リモートからローカルリポジトリの内容を更新する」という操作なのですが、少し違いがあるので、そこを解説します。

ざっくりとまとめ

fetch・・・リモートと通信を行い、更新された内容をローカルリポジトリに取り込む。(ローカルのソースファイル自体はまだ更新されない)
pull・・・上記のfetchとmergeというコマンドを連続して実行し、リモートの更新内容をローカルのソースファイルに反映させる。

ざっくりしすぎたかも。。ここから少し詳しく書いていきます。

fetchって何?

まずはfetchの解説、の前に、簡単に「3種類のブランチ」の説明をしておきます。
Gitの仕組みの根幹の部分に関するものであり、複数人(複数環境)でリポジトリを共有するチーム開発においては、必ずかかわっていかなければならないものです。
fetchコマンドもこの概念と密にかかわっています。この概念を簡単にでも理解しておくと、fetchコマンドの理解が早くなると思います。

Gitの3種類のブランチ

リモートブランチ
ローカルブランチ
リモート追跡ブランチ(リモートトラッキングブランチ)

①のリモートブランチは、その名の通りリモート環境上に存在するブランチです。
リモートで全員がアクセスできる共有のブランチであり、最終的な成果物となりうるブランチです。協力してキレイに保ちましょう。

②のローカルブランチは、その名の通りローカル環境上に存在するブランチです。
ソースを新規作成したり修正したりして、その内容をコミットしているのは、ローカルブランチ上での作業になります。

①と②はそのままの意味なので、あまり理解に苦しむことはないと思います。ですが、③は少し特殊な役割になるので、丁寧に解説します。

③のリモート追跡ブランチは、「ローカルリポジトリ上で①のリモートブランチの内容のコピーをし続けるブランチ」です。
コピーをし続ける、変更内容を追いかける、から「追跡」ブランチと名付けられています。
Git系の記事とかでたまに見かけるorigin/masterという形式で記載されたブランチ名は、リモート追跡ブランチ名を指しています。
役割としては、①リモートブランチの情報をローカルのリポジトリに引き込む際の受け皿、①と②の橋渡し役みたいなものです。
また、この③追跡ブランチのソースの内容を直接編集してコミット、なんてことはできません。

では、この③追跡ブランチが更新されるシチュエーションはというと、「fetch」と「push」のどちらかのコマンドが実行されたときのみとなります。(ブランチの作成、削除は更新には含めていません)
リモート側から情報を更新するのがfetch、ローカル側から情報を更新するのがpushです。

はぁ、、、やっとfetch出てきた。。。

つまりfetchとは

①リモートブランチからローカルリポジトリの③リモート追跡ブランチに情報を送って更新をかけること
となります。

ここで大事なのは、更新されるのは③追跡ブランチであって、②ローカルブランチではない、ということです。
PC上のソースファイルたちは、②のローカルブランチに紐づいているものなので、fetchだけではソースファイル自体は更新されない、ということになります。
ソースファイルに更新を反映させるためには、②のローカルブランチに③のリモート追跡ブランチを「merge」する必要があります。

※fetchとpull、二つのコマンドの概念を説明する上で、「merge」というコマンドからは逃げられないのですが、この記事ではmergeに関する詳細な解説は省きます。
(mergeだけで3時間語れるくらい深い深い。。。)
この記事を読むうえでは、「2つのブランチの内容を統合するコマンド」くらいのイメージで十分です。

これで、リモートの更新を、PC上のソースファイルにまで反映することができました。
コマンドで表すとこの2行分。

git fetch origin master
git merge origin/master

masterブランチ上にいる想定で、リモート名:originからmasterブランチの最新の情報をローカルブランチに引き込むコマンドです。
origin/masterがリモート追跡ブランチ名ですね。

pullって何?

fetchを使用してローカルリポジトリの更新を行う場合、fetchだけでなくmergeを行う必要があります。
よく実行する作業なのに毎回2コマンド打つのめんどくね?という時のためのpullなのです。

つまりpullとは

「fetch + merge」を1コマンドで実行してくれる便利なヤツ
となります。

試しに、fetchを使ってローカルリポジトリを更新するコマンドと同様の動作を、pullを使用して実行しようとすると、、

git pull origin master

となります。ちゃんと1行にまとまりました!

まとめ

普段使用するのはpullでいいと思うけど、pull=fetch+mergeを理解しておかないと、いざ謎のエラーが出てきたときに詰むから気を付けてください。

理解したとてエラー内容によっては詰むときは詰むけどね!!!!!

10
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
6