gitで手こずった時に色々ググってると、「git fetch」と「git pull」がぐちゃぐちゃになってしまったのでまとめておきます。
結論から言えば、「fetchもpullもリモートリポジトリの最新情報をローカルリポジトリへ持ってくる」という操作になりますが、それまでの流れが違うので説明していきます。
##git fetch
リモートから最新情報をローカルに持ってくるのですが、場所は「master」ブランチではなく、「origin/master」ブランチに取り込まれます。
初めは「何それ知らない」となるのですが、具体的に言うと
- 「master」ブランチ…ローカルの中心となる統合ブランチで、他のローカルの作業ブランチと繋がったもの。
- 「origin/master」ブランチ…ローカルにある、リモートのmasterブランチを追跡するリモート追跡ブランチ。
となります。
両方ともローカルにあるブランチで分かりにくいのですが、図でイメージするとこんな感じです。
ローカルの「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の違い