Gitにおけるmergeとrebaseの違い

pull で rebase しても merge しても、「作業内容」は消えない — どちらの場合も、あなたのコミットはリポジトリ内に残ります(ブランチの履歴内、または reflog が有効な間は古い SHA として残ります)。

  • pull.rebase false(merge)git pullマージコミット を作成し、あなたのコミットと他人のコミットは 再構成されません。ブランチの履歴は単に マージ されます。視覚的に「頭が混乱しにくい」:明確に分岐するラインが見えます。
  • pull.rebase true(rebase):あなたのローカルコミットが 上書き されます(新しいハッシュ)。コミット内容 はほぼ同じですが、成功した rebase 後、古いコミットは git reflog に残ります — これは正常です。必要に応じて(何かがうまくいかなかった場合)、git reset --hard で reflog から復元できます。

「作業内容を失いたくない」のが主目的なら

  1. リスクのある操作前 — コミット(または git stash)と、別ブランチgit branch backup-tgisn-46)で 指標のコピー を作成。非常に軽量なバックアップ。
  2. git reset --hard、無理やり push(force push)、git clean -fd などの誤った操作混同しない
  3. rebase/merge 後は数日間、git gc を積極的に実行しない — reflog は復元のための安全なバックアップを保持しています。

「作業内容を失わずに、履歴を大きく複雑にしない」場合に便利な設定:git config pull.rebase false — 異なるブランチが存在する場合、常に マージ が発生し、ローカルコミットは再構成されません。もしすでに rebase を望んでいる(過去の pull --rebase と同じ)なら、pull.rebase true を維持し、他人のブランチに無理やり push(force push)しない ことが重要です。

結論pull の選択肢によって「作業内容」が消えることはありません。リスクは 他のコマンドforce push にあります。安心のために、コミット + バックアップブランチ を操作前に作成しましょう。

以下は、あなたの状況と同じものです:1つの共通コミット C、その後 origin には 5つのコミット r1…r5ローカル には 1つのコミット L(あなたの作業)があります。

1. pull する前(分岐している状態)

gitGraph
  commit id: "C (共通)"
  branch local
  checkout local
  commit id: "L (私のコミット)"
  checkout main
  commit id: "r1"
  commit id: "r2"
  commit id: "r3"
  commit id: "r4"
  commit id: "r5"

意味:local の先頭は Lmain の先頭は r5、共通の祖先は C。どちらの方法でも 「作業内容は失われていない」 — ただ、履歴がどのように結合されるか が変わります。


2. git pull で rebase なし(pull.rebase falseマージ

gitGraph
  commit id: "C"
  branch local
  checkout local
  commit id: "L"
  checkout main
  commit id: "r1"
  commit id: "r2"
  commit id: "r3"
  commit id: "r4"
  commit id: "r5"
  checkout local
  merge main
  commit id: "M (マージコミット)"

マージコミット M が作成され、2つの親Lr5)を持ちます。コミット Lr1…r5オブジェクトとして残ります。履歴は 分岐型 で、再構成は発生しません。


3. git pull で rebase あり(pull.rebase truerebase

gitGraph
  commit id: "C"
  commit id: "r1"
  commit id: "r2"
  commit id: "r3"
  commit id: "r4"
  commit id: "r5"
  commit id: "L′ (同じパッチ、新しいハッシュ)"

履歴は 線形 になります:あなたの作業は 上書き されます。L の履歴には 新しいコミット L′r5 に対する同じ差分、新しいハッシュ)が追加されます。古い Lgit reflog でしばらく見え続けます(reflog expire で削除されるまで)。


要約:マージは 分岐 + マージノード、rebase は 1本の線、あなたのコミットが「再演」 されます。どちらの場合も、ファイルの変更内容 は消えません。違いは 履歴の形状rebase でローカルコミットのハッシュ が変わる点です。