どちらも「リモートからローカルリポジトリの内容を更新する」という操作なのですが、少し違いがあるので、そこを解説します。
ざっくりとまとめ
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を理解しておかないと、いざ謎のエラーが出てきたときに詰むから気を付けてください。
理解したとてエラー内容によっては詰むときは詰むけどね!!!!!