はじめに

今回はpullについてサメさんに教えてもらいたいんだ!




おおお、今日はテンション高いね!
一体どうしたんだい?




前回のベアリポジトリの話から気になってしょうがなかったんだよね。




なるほどね!
何か気になることことがあれば勉強したい意欲も高まるしね。
pullに関しては結構複雑な動きをするから、ややこしいけど任せてよ!
前提




今回内容を理解してもらうために。
リモートリポジトリA
ローカルリポジトリB
という名前でやっていくね!
Pullの流れ
- fetchでリモート追跡ブランチと同期する
- git merge FETCH_HEADでマージする
- コンフリクトはgit mergeの段階で起きる




①git fetch リモートリポジトリからファイルを取得する




まず実行するのはgit fetchっていうコマンドなんだ。
これは完全に独立したコマンドなんだよ。




git fetchは何をしてくれるの?




簡単にいうと、git fetchは
リモート追跡ブランチであるorigin/xxxxxxブランチと
リモートリポジトリのremote/origin/masterブランチを同期させるんだよ!




ふむふむ。




同期してリモート追跡ブランチが取得した情報をローカルリポジトリのコミットの一番上に重ねるんだ。
イメージとしてはもう一本のブランチを作って繋がっているイメージだね。




繋がっている??




そう。
ローカルリポジトリのmasterブランチの上にremote/origin/masterの新しいコミットが続いているんだ。
$ git fetch
②git merge FETCH_HEAD




今のローカルリポジトリの状態は
masterブランチの最新のコミットにHEAD
remote/origin/masterブランチの最新のコミットにFETCH_HEAD
が置かれている状態になるんだ。




FETCH_HEADってなに?




FETCH_HEADっていうのはgit fetchして同期した時の最新のリモート追跡ブランチのことを指すんだよ。




間違えて違うブランチでfetchしてしまうこともあるからね。
一番最新の最新のリモート追跡ブランチだよっていう証明なんだ。
そのFETCH_HEADにリモートリポジトリから取得したコードが入っているんだ。




なるほどね。そのFETCH_HEADをマージで取り込んで取得するんだね。




その通り!
使うコマンドは
git merge FETCH_HEAD
で取り込むことができるよ。
$ git merge FETCH_HEAD
終わりに




今回はpullの流れが実は2段階あることを知ったと思うんだけど、どう?




pullって簡単にリモートリポジトリの内容を引っ張ってきているかと思っていたから、今回びっくりしたよ〜。
やっぱりリモート追跡ブランチがわからないところで動いてくれていたんだね。




縁の下の力持ちって感じだよね!