そもそも
pullとfetchは,リモートの最新状態を,ローカルに反映させるものですが,少し違います.
pull
リモートの最新状態をローカルに取得してきた後,マージをします.
git checkout main # mainブランチに移動
git pull origin main
ローカルの main に未コミットの変更があると,競合が発生する可能性があります.
fetch
リモートの最新状態を,ローカルに取得してくるだけで,マージはしません.
取得したデータは,下記の保存場所に一旦保存されるだけで,ローカルの現在編集しているデータが変更されることはありません.
データの種類 | 保存場所 |
---|---|
リモートブランチ情報 | .git/refs/remotes/origin/ |
コミットオブジェクト | .git/objects/ |
リモートのHEAD情報 | .git/FETCH_HEAD |
共同開発においては,fetchで最新状態を取得した後,mergeで統合をするのが一般的です.
リモートのmainをローカルのmainに取り込むばあ
git checkout main
git fetch origin # リモートの最新情報を取得(適用しない)
git merge origin/main # リモートの変更をローカルの main に適用
※リモートの別ブランチ(ここではfeature-xyz)をfetchしてから,ローカルのmainに取り込む場合
git checkout main
git fetch origin # リモートの最新情報を取得(適用しない)
git merge origin/feature-xyz
共同開発でfetch+mergeを使用する理由
共同開発をしていると,たくさんのブランチを切って並行して開発を進める機会が多いです.そのため,ブランチをマージする機会が多くなり,いきなりpullしてしまうとコンフリクトが発生してしまい,面倒なことになってしまうのです.