git pull
はgit fetch
してgit merge
をするのと同じという話はよく目にする。
しかし、それぞれのコマンドでオプションや引数が省略された場合にどういった挙動になるのかが曖昧だったため、それらのコマンドが具体的に何をしているのかを調べてみた。
$git pull
↓ 同じ
$git fetch
$git merge
##目次
##1. git fetch オプションや引数を付けない場合、リモートレポジトリで登録されているoriginにあるすべての追跡ブランチのデータを取得してくる。
つまり、リモートレポジトリとしてoriginが登録されていることが前提となる。
▼リモートレポジトリ
//登録されているリモートレポジトリの確認
$ git remote
origin
urlを確認したい場合はgit remote -v
で確認できる。
**▼リモート追跡ブランチ** リモート追跡ブランチは、`git branch -a`で確認できる。
$ git branch -a
* master
remotes/origin/master
remotes/origin/aaa
上記の状態の場合、git fetch
を実行すると、origin/masterと、origin/aaa
からコミット履歴を取得してくる。
コミット履歴が更新されるのは、そのコマンドを実行したブランチではなく、origin/master
とorigin/aaa
。
###更新されたコミット履歴の確認
リモート追跡ブランチのコミット履歴を確認するには、
・$ git log origin/<ブランチ名>
を実行すればいい。
--online
や--graph
オプションを付ければ見やすく表示できる。
##2. git merge オプションや引数を付けない場合、現在のブランチのリモート追跡ブランチをマージする。
もしmasterブランチでgit merge
を実行したのであれば、
$ git merge origin master
を実行したのと同じになる。
**※注意点** master以外の別のブランチにいる場合(例えばブランチaaa)だと、master/masterではなく、そのリモートレポジトリ(origin/aaa)のコミット履歴を統合することになる。
ここが、単なるgit pull
の落とし穴。
自分専用のブランチで作業している場合は、git pull
したところで何も更新されない。
もし、master以外のブランチで作業していて、リモートレポジトリのマスターのコミットをgit merge
したい場合は、
$git pull origin master
↓ 同じ
$git fetch
$git merge origin master
となる。
##3. 引数のあるgit pull では、リモートレポジトリとブランチを指定したgit pullはどういった処理になるのか?
$ git pull origin aaa
↓
$git fetch origin aaa
$git merge origin aaa
git fetchで、指定したリモートレポジトリ(origin)のブランチ(aaa)からデータを取得してくる。
git merge
で取得してきたコミットを、コマンドを実行したブランチにマージする。
##よくある使い方 複数人で実施しているプロジェクトでよくある使い方は、自分の作業環境を最新状態に保つために、
自分がブランチを切って作業をしている時に、masterの更新情報を取得して定期的にマージすること。
コマンドでみると、
$ git pull origin master
↓
$git fetch origin master
$git merge origin master
を実行していることになる。
以上。