症状
git fetchとgit pullの違いがわからず、どちらを使えばいいか迷っている
結論:まずこれを確認
git fetch= リモートの情報を取得するだけ(ローカルのファイルは変わらない)git pull=git fetch+git merge(ローカルのファイルが変更される)- 迷ったら
git fetchを使う(安全)
操作フロー
flowchart TD
A[リモートの変更を確認したい] --> B{ローカルに未コミットの変更がある?}
B -->|Yes| C[git stash で退避]
B -->|No| D{すぐにマージしたい?}
C --> D
D -->|Yes| E[git pull]
D -->|No| F[git fetch]
F --> G[git log origin/main で差分確認]
G --> H{マージする?}
H -->|Yes| I[git merge origin/main]
H -->|No| J[作業継続]
E --> K[完了]
I --> K
よくある原因
fetchとpullの違いを知らずにpullを使い、意図しないマージが発生したfetchだけしてマージを忘れ、ローカルが古いままになっていたpullしたらコンフリクトが発生してパニックになった- リモートの変更を確認せずに
pullして、作業中のコードが上書きされた fetch後にorigin/mainとmainの違いを理解していなかった
操作手順
ステップ1: 現在の状態を確認する
git status
🔍 チェックポイント: 未コミットの変更がある場合は、先にgit stashで退避するか、コミットしておく
ステップ2: git fetch でリモートの情報を取得する
git fetch origin
このコマンドは、リモートリポジトリ(origin)の最新情報をローカルにダウンロードする。ただし、作業中のファイルは一切変更されない。
🔍 チェックポイント: エラーが出なければ取得成功。ローカルのファイルは変わっていないことを確認
ステップ3: リモートとの差分を確認する
# リモートのmainブランチのログを確認
git log origin/main
# ローカルとリモートの差分を確認
git log main..origin/main --oneline
🔍 チェックポイント: 差分がなければ「Already up to date」に相当する状態。差分があれば、どんな変更が来るか確認できる
ステップ4: マージするかどうかを判断する
差分を確認した上で、マージする場合:
git merge origin/main
または、最初からfetchとmergeを同時に行う場合(= git pull):
git pull origin main
🔍 チェックポイント: コンフリクトが発生した場合は、git statusで競合ファイルを確認し、手動で解決する
ステップ5: git pull を使う場合の手順
git pullはfetch + mergeを一度に行うコマンド:
# 現在のブランチにリモートの変更をマージ
git pull
# ブランチを指定する場合
git pull origin main
🔍 チェックポイント: pull後にgit log --oneline -5で最新のコミットを確認し、意図した変更が取り込まれたか確認する
fetch と pull の比較表
| 項目 | git fetch | git pull |
|---|---|---|
| リモート情報の取得 | ○ | ○ |
| ローカルファイルの変更 | × | ○ |
| マージの実行 | × | ○ |
| コンフリクトの可能性 | × | ○ |
| 安全性 | 高い | やや低い |
| 使うタイミング | 確認してからマージしたい | すぐにマージしたい |
NG行動
-
git pullを未コミットの変更がある状態で実行する- コンフリクトが発生しやすく、変更が失われる可能性がある
-
git fetchだけして満足する- ローカルのブランチは更新されないため、古いコードのまま作業を続けてしまう
-
差分を確認せずに
git pullする- 意図しない変更がマージされ、バグの原因になることがある
-
git pull --forceを使う- ローカルの変更が強制的に上書きされ、データが消失する
よくある質問(FAQ)
Q1: git fetchしても何も変わらないように見えるのはなぜ?
A: git fetchはリモート追跡ブランチ(origin/mainなど)を更新するだけで、ローカルブランチ(main)は変更しない。変更を反映するにはgit merge origin/mainが必要。
Q2: git pullとgit pull --rebaseの違いは?
A: git pullはマージコミットを作成する。git pull --rebaseはマージコミットを作らず、ローカルのコミットをリモートの後ろに移動する。履歴をきれいに保ちたい場合は--rebaseを使うことがある。
Q3: 「Already up to date」と表示されたのに、リモートには新しいコミットがあるようだが?
A: git fetchを先に実行していない可能性がある。git fetchでリモートの最新情報を取得してから、再度確認する。
関連するトラブル
準備中
解決しない場合
- Git公式ドキュメント - git-fetch
- Git公式ドキュメント - git-pull
- 確認すべきコマンド:
git remote -v # リモートの設定確認 git branch -vv # ブランチの追跡状態確認 git log --all --oneline --graph # 全ブランチの履歴確認 - 次に調べるキーワード:「git merge コンフリクト 解決」「git rebase 使い方」