トラブルシューティング

git pull で余計なマージコミットが作られる問題

git pull 時に不要なマージコミットが生成される原因と解決策

git pull で余計なマージコミットが作られる問題 diagram

なぜマージコミットが作られるのか

git pull はデフォルトで git fetch(フェッチ) + git merge(マージ) を実行します。

ローカルとリモートの両方に新しいコミットがある場合、Git はマージコミットを作成して両者を統合します。

これにより「Merge branch 'main' of ...」のような自動生成コミットが履歴に残り、繰り返すほど履歴が読みにくくなります。

解決策 1: --ff-only で安全に防ぐ(推奨)

git pull --ff-only は fast-forward(ファストフォワード / 早送り)できる場合だけ pull を実行し、できない場合はエラーで止まります。

  • fast-forward できる = ローカルに独自のコミットがない → そのまま取り込まれる
  • fast-forward できない = ローカルにも新コミットがある → エラーで止まる

エラーになったら「ローカルにコミットがあるな」と気づけるので、自分で rebase するか merge するか判断できます。

勝手にマージコミットが作られることがありません。

bash
# fast-forward できる場合だけ pull
git pull --ff-only

# デフォルト設定にする(推奨)
git config --global pull.ff only

解決策 2: --rebase で履歴を直線に保つ

git pull --rebase は fetch した後に merge ではなく rebase を実行します。

ローカルのコミットがリモートの最新コミットの後ろに付け替えられるため、マージコミットは作られず直線的な履歴になります。

ただし rebase 中にコンフリクトが発生すると、初心者には対処が難しい「リベース中」の状態になるため、慣れないうちは --ff-only のほうが安全です。

bash
# 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 と統合を分けて実行することです。

  1. git fetch origin でリモートの変更を取得

    ローカルには反映されず、origin/main などのリモート追跡ブランチが更新されます。

  2. 差分を確認

    git log HEAD..origin/main --oneline でリモートの新しいコミットを確認します。

  3. 状況に応じて統合

    fast-forward できるなら git merge --ff-only origin/main、リベースしたいなら git rebase origin/main を実行します。

bash
# まず取得だけ行う
git fetch origin

# リモートとの差分を確認
git log HEAD..origin/main --oneline

# fast-forward で統合
git merge --ff-only origin/main

# または rebase で統合
git rebase origin/main

関連コマンド