Git Fetch と Pull の違い
git fetch と git pull の違いを理解し、それぞれのコマンドの使い分けを解説。pull が fetch と merge を組み合わせた動作であることも説明します。
git fetch origin && git merge origin/main詳細な説明
何が違うのか?
両方のコマンドはリモートからデータをダウンロードしますが、動作が異なります:
git fetchは新しいコミット、ブランチ、タグをリモートからダウンロードしますが、作業ディレクトリや現在のブランチは変更しません。git pullはgit fetchに続いてgit merge(または設定によってはgit rebase)を行う省略形です。
Git Fetch
# origin から更新をダウンロード
git fetch origin
# 何が変わったか確認する
git log HEAD..origin/main --oneline
# 準備ができたら merge する
git merge origin/main
fetch は安全な選択肢です。取り込む前に受信した変更を確認できます。
Git Pull
# fetch と merge を一度に実行
git pull origin main
# merge の代わりに rebase で取り込む
git pull --rebase origin main
pull は便利ですが、予期しないタイミングでマージコンフリクトが発生することがあります。
使い分け
| シナリオ | コマンド |
|---|---|
| merge 前に変更を確認したい | git fetch |
| 個人ブランチの素早い更新 | git pull |
| 履歴を直線的に保ちたい | git pull --rebase |
| CI/CD スクリプト | git fetch + 明示的な merge |
デフォルトの pull 動作を設定する
# pull 時に常に rebase する(マージコミットなし)
git config --global pull.rebase true
# pull がマージコミットを作成する場合に警告する
git config --global pull.ff only
ベストプラクティス
チームワークフローでは、git fetch の後に明示的な merge または rebase を行うことを推奨します。この2ステップのアプローチにより、受信した変更をレビューし、計画的にコンフリクトを解決できます。自分だけが作業しているブランチでコンフリクトの可能性が低い場合は、利便性のために git pull を使いましょう。
ユースケース
開発者が朝一番に git fetch を実行してチームメイトが夜間に push した内容を確認し、変更をレビューしてから準備ができた時点で merge する場面で使用します。