「アウトプットと言う名の備忘録@Texas」

日本じゃない何処かの脳筋パイソニスタによる何かしらの走り書き

【Git】Fetch と Pull 結局何が違うのか

Git ユーザーであれば、日々の呼吸をするように開発過程で行うのが pull と fetch。

響き的にどちらもリモートレポジトリから最新の情報をローカルに持ってくるイメージ。。

f:id:At_sashimi_py:20220118021836p:plain:w200
fetchは英語で取ってくるの意味。ワンちゃんのボール取ってこーい!の時もFetch!

詰まるところその違いはなんなのか?

結論

git fetch を使用すると、前回の git pull 以降にリモートリポジトリ/ブランチで行われたメタデータの変更を取得する。

git pullfetch の機能に加え、オリジナルに加えられたコード変更をローカルのコードに加えることができる。


以下のシナリオからその違いをちゃんと確認しよう。

シナリオ

git clone <url>

によって、ローカルにコピーしたチームの共同プロジェクトに取り組んでいるとき、

  • ローカルとリモートブランチの差分を確認したい。
  • チームメイトが加えたオリジナルへの変更を自分のローカルコードに反映させたい。

こんな時に fetchpullが便利です。
一つずつ見ていきましょう。

ローカルとリモートブランチの差分を確認したい。

この場合は、

git fetch
git diff <local branch> <remote>/<remote branch>

git fetch は、ローカルの git にオリジナルのメタデータを取得するように指示するコマンド。ただし、ファイルの転送はしない。
つまり、利用可能な変更があるかどうかをチェックするだけでローカルのコードに直接的な変化なし。
なのでまず、git fetchでリモートブランチのメタデータを取得することで、git diff のコマンドをリモートブランチに対して使えるようになる。


以前のポスト
atsashimipy.hatenablog.com
ここで言う「git fetchをお忘れなく」と言うのは新しく作られた他人のブランチのメタデータがない状態で

git checkout taros_branch

しても「そんなブランチ知りません!」とgitさんに怒られてしまうから。
なので先に git fetch をしてメタデータを取得しておく必要があると言うこと。


一方

チームメイトが加えたオリジナルへ変更を自分のローカルコードに反映させたい。

git pull origin master

git pull は、リモートリポジトリから最新のメタデータを取得し、さらにその変更をローカルに取り込む(コピーする)コマンド。
つまり、 git fetch した上にその新しい変更をローカルのコードに加える。

まとめ

今回は簡単にgit pull と fetchの違いを紹介しました。
初心者の方や記憶が曖昧だった方の参考になってもらえれば幸いです!

ありがとうございました!

f:id:At_sashimi_py:20191117112122p:plain:w300
gitはまだまだ奥が深い