LoginSignup
1338
1145

More than 5 years have passed since last update.

【初心者向け】git fetch、git merge、git pullの違いについて

Last updated at Posted at 2019-03-27

gitで手こずった時に色々ググってると、「git fetch」と「git pull」がぐちゃぐちゃになってしまったのでまとめておきます。

結論から言えば、「fetchもpullもリモートリポジトリの最新情報をローカルリポジトリへ持ってくる」という操作になりますが、それまでの流れが違うので説明していきます。

git fetch

リモートから最新情報をローカルに持ってくるのですが、場所は「master」ブランチではなく、「origin/master」ブランチに取り込まれます。

初めは「何それ知らない」となるのですが、具体的に言うと

  • 「master」ブランチ…ローカルの中心となる統合ブランチで、他のローカルの作業ブランチと繋がったもの。
  • 「origin/master」ブランチ…ローカルにある、リモートのmasterブランチを追跡するリモート追跡ブランチ

となります。

両方ともローカルにあるブランチで分かりにくいのですが、図でイメージするとこんな感じです。

fullsizeoutput_316.jpeg

ローカルの「master」ブランチの1歩先(リモート寄り)に「origin/master」ブランチがあって、git fetchではこの「origin/master」ブランチで最新情報を受け取ります。

それをローカルの「master」ブランチが貰えるようにgit fetch → git mergeをして、「origin/master」→「master」へ最新情報を持ってくるわけですね。ここまで処理を行うことで、ローカルのファイルが最新の状態に更新されます。

まとめると、

  • git fetch…リモートの「master」ブランチ → ローカルの「origin/master」ブランチ
  • git merge…ローカルの「origin/master」ブランチ → ローカルの「master」ブランチ

となります。

git pull

git pullは、上のgit fetch、git mergeを同時に行うコマンドです。そのため、リモートの「master」ブランチから、ローカルの「origin/master」ブランチを介して、ローカルの「master」まで一気に最新情報を持ってきます。

mergeまで一気に行なってしまうため、ローカルのブランチとコンフリクトが起きやすいのは、この理由なんですね。

まとめると、

  • git pull…リモートの「master」ブランチ →(ローカルの「origin/master」ブランチ→) ローカルの「master」ブランチ

となります。

コマンド例

$ git fetch origin master
$ git merge origin/master
$ git pull origin master

戻す方法

いろんな手段があると思いますが、パニックになる前に、とりあえず解決できそうなコマンドです。

まず、

$ git fetch

でエラーがあって元に戻したい時は、
まだローカルの「master」ブランチまで更新されていない(mergeされていない)ので、

$ git reset --hard HEAD

で直前のcommitまで戻して、無かった事にします。
これは簡単です。

そして、

$ git pull

でエラーがあって元に戻したい、コンフリクトを無くしたいという時は、

まずpull = fetch + mergeなので、mergeを

$ git merge --abort

で取り消します。その後は同じように

$ git reset --hard HEAD

で、直前のcommitまで戻して、無かった事にします。

コンフリクトの理由を把握し、うまく解決してmergeするのが1番ですが、それはまたいずれ違う記事で書きます。

参考記事

git fetchの理解からgit mergeとpullの役割
origin masterとorigin/masterの違い

1338
1145
2

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
1338
1145