「git fetch」と「git pull」はいずれもリモートリポジトリの変更内容を取得する際に使われるため、たびたび混同されがちですが、これらの違いを理解していないと問題が起きた時に対処が難しくなります。fetchとpullの違いについてしっかりと把握しておきましょう。
リモートリポジトリの内容をローカルリポジトリに取り込む流れ
Git でリモートリポジトリの内容をローカルリポジトリに取り込む流れは下記のようになります。
リモートリポジトリ
↓ git fetch
ローカルリポジトリ(origin/master)
↓ git merge
ローカルの作業ディレクトリ(master)
ローカルリポジトリの中には master と orgin/master の2つの情報が置かれています。
git fetch コマンドは実行時、リモートに新しい更新があるとその内容を orgin/master ブランチに取り込み最新にしてくれます。
しかし作業ディレクトリと結びついている master ブランチは更新が行われないため、リモートの更新を作業ディレクトリに同期させるためには merge する必要があります。
この git fetch と git merge コマンドをまとめて行ってくれるコマンドが git pull です。
git pull コマンドでGit が内部的に実行するコマンド
例えば
git pull origin master
というコマンドを実行した際、Gitでは内部的に下記のコマンドが実行されています。
git fetch origin master git merge FETCH_HEAD
git fetch で取得した変更内容はいったん .git/FETCH_HEAD というファイル内に書き込まれます。その後、現在の作業ブランチに対してマージが実行される、というステップです。
そのため git pull コマンドでエラーが発生した場合、 git fetch コマンドと git merge コマンドのどちらかで問題が発生しています。
この仕様を理解しておけば git pull コマンドで思うような動作をしなかった場合に問題を発見しやすくなります。