git pull で余計なマージコミットが作られる問題
git pull 時に不要なマージコミットが生成される原因と解決策
なぜマージコミットが作られるのか
解決策 1: --ff-only で安全に防ぐ(推奨)
git pull --ff-only は fast-forward(ファストフォワード / 早送り)できる場合だけ pull を実行し、できない場合はエラーで止まります。
- fast-forward できる = ローカルに独自のコミットがない → そのまま取り込まれる
- fast-forward できない = ローカルにも新コミットがある → エラーで止まる
エラーになったら「ローカルにコミットがあるな」と気づけるので、自分で rebase するか merge するか判断できます。
勝手にマージコミットが作られることがありません。
# fast-forward できる場合だけ pull
git pull --ff-only
# デフォルト設定にする(推奨)
git config --global pull.ff only解決策 2: --rebase で履歴を直線に保つ
git pull --rebase は fetch した後に merge ではなく rebase を実行します。
ローカルのコミットがリモートの最新コミットの後ろに付け替えられるため、マージコミットは作られず直線的な履歴になります。
ただし rebase 中にコンフリクトが発生すると、初心者には対処が難しい「リベース中」の状態になるため、慣れないうちは --ff-only のほうが安全です。
# rebase で pull する
git pull --rebase origin main
# デフォルト設定にする
git config --global pull.rebase trueどちらを選ぶべきか
| 方法 | メリット | デメリット |
|---|---|---|
--ff-only |
予期しないマージ・リベースが起きない。エラーで止まるので自分で判断できる | fast-forward できないときは手動で対処が必要 |
--rebase |
常に直線的な履歴になる。手動操作が少ない | コンフリクト時にリベース中の状態になり混乱しやすい |
迷ったら --ff-only がおすすめです。
「何が起きているか分からないままマージコミットが作られる」という一番の問題を防げます。
慣れてきたら --rebase に切り替えるのも良い選択です。
fetch + 手動操作が一番安全
最も確実な方法は git pull を使わず、fetch と統合を分けて実行することです。
git fetch originでリモートの変更を取得ローカルには反映されず、
origin/mainなどのリモート追跡ブランチが更新されます。差分を確認
git log HEAD..origin/main --onelineでリモートの新しいコミットを確認します。状況に応じて統合
fast-forward できるなら
git merge --ff-only origin/main、リベースしたいならgit rebase origin/mainを実行します。
# まず取得だけ行う
git fetch origin
# リモートとの差分を確認
git log HEAD..origin/main --oneline
# fast-forward で統合
git merge --ff-only origin/main
# または rebase で統合
git rebase origin/main
Git Ready