git fetch=「ローカルリポジトリを最新状態にする」と認識していたら
想定通りにローカルリポジトリが最新状態にならず困惑したため、
調べて分かったことを備忘録としてまとめます。
「origin/master」ブランチについて
git fetchを理解するためには、まず「origin/master」ブランチについて知っておく必要がある。
「origin/master」は、リモートリポジトリのmasterブランチを追跡するブランチで、
以下の図のようにリモートリポジトリのmasterブランチと、ローカルリポジトリのmasterブランチの間にある。
「リモートのmasterブランチを追跡する」なので、
「コードの内容」ではなく、「ブランチの情報」を追跡しているという点が大切。
git fetchとは
git fetchとは、リモートリポジトリのブランチの最新情報を
ローカルリポジトリのorigin/masterに持ってくるコマンド。
「リモートリポジトリに新しくブランチが追加された」というようなブランチの情報が分かる。
図のように、ローカルリポジトリのmasterブランチは更新されない。
すなわち、リモートリポジトリで自分以外の人がコードを編集していたとしても、
ローカルリポジトリのmasterブランチではコードの変更点を見ることはできない。
git mergeとは
git mergeは、ローカルリポジトリのorigin/masterからmasterに最新情報を持ってくる。
origin/masterの内容をローカルリポジトリのmasterにマージするため
リモートリポジトリで変更のあった箇所をローカルリポジトリのmasterブランチで確認することができる。
git pullとは
git pullはgit fetchとgit mergeを一度に行うコマンド。
リモートリポジトリのmasterブランチからorigin/masterブランチを介して、
一気に最新情報を持ってくることができる。
ローカルリポジトリのmasterとリモートリポジトリのmasterで競合する変更があった場合は
コンフリクトが起きるため注意が必要。
まとめ
git fetchではローカルリポジトリのmasterの内容は更新されないことが分かりました。
また、ローカルリポジトリを最新にしたい場合「とりあえずgit pullする!」ではなく
状況に応じてgit fetch、git merge、git pullを使い分けられるようにしたいと思います。
参考