#はじめに
最近Gitの勉強をしているのですが、git pullやgit fetch等解釈が難しいと感じたので、図解してみようと思います。
同じくpull, fetch, pushで混乱している人の参考になれば良いなと思います。
分かりにくかったり、誤った記載があれば、コメント欄にて優しく教えていただけると嬉しいです!
#用語の説明
-
リポジトリ:リポジトリとは変更を記録するための場所です。
-
ローカルリポジトリ:自分のPC上のリポジトリ
-
リモートリポジトリ:ネットワーク上のリポジトリ(Github等)
-
ブランチ:直近のコミットを指し示すポインタ
- ローカルブランチ:ローカルにあるブランチ(例:master)
- リモート追跡ブランチ:リモートブランチの動きを追跡するブランチ(例:origin/master)
- リモートブランチ:ネットワーク上にあるブランチ(例:master)
#git pull, git fetch, git pushについて
git pull, git fetch、git pushの動きを大まかに見ていこうと思います。
- git pull
「ローカルリポジトリ」が、「リモートリポジトリ」から情報を更新するコマンドです。
「リモート追跡ブランチ」と「ローカルブランチ」の情報を更新することができます。 - git fetch
「ローカルリポジトリ」が、「リモートリポジトリ」から情報を更新するコマンドです。
「リモート追跡ブランチ」のみ情報を更新することができます。 - git push
「リモートリポジトリ」が、「ローカルリポジトリ」から情報を更新するコマンドです。
それではもう少し詳しく見ていきましょう!
###git pull
git pullは「ローカルリポジトリ」が、「リモートリポジトリ」から情報を更新するコマンドです。
「リモート追跡ブランチ」と「ローカルブランチ」の情報を更新することができます。
コードは以下の通りです。
$ git pull リモート名 ブランチ名
# 以下は「リモートリポジトリ」のmasterブランチの情報をpullするときのコマンドです。
$ git pull origin master
git pullを使う際は、今いる「ローカルブランチ」とpullしたい「リモートブランチ」が一致していることを確認しましょう。
※例えば上記のコードにおいて、「ローカルブランチ」がmaster以外のブランチ(例えば、branch1とします)の状態で、pullしてしまった場合、branch1がリモートのmasterブランチの情報で更新されてしまいます。
###git fetch
git fetchは「ローカルリポジトリ」が、「リモートリポジトリ」から情報を更新するコマンドです。
「リモート追跡ブランチ」のみ情報を更新することができます。
git fetchの後にgit mergeをするとgit pullと同じことが起きます。
$ git fetch リモート名
# 以下は「リモートリポジトリ」の情報をfetchするときのコマンドです。
$ git fetch origin
###git push
git pushは「ローカルリポジトリ」から「リモートリポジトリ」に情報を送るコマンドです。
指定したブランチ(例:master)のみ「リモートリポジトリ」の情報を更新することができます。
※次に出てくる【git pushのイメージ】の通り、指定していないブランチ(図の場合branch)は更新されません。
$ git push リモート名 ブランチ名
# 以下は「ローカルリポジトリ」のmasterブランチを「リモートリポジトリ」のmasterブランチにpushするときのコマンドです。
$ git push origin master