pull で rebase しても merge しても、「作業内容」は消えない — どちらの場合も、あなたのコミットはリポジトリ内に残ります(ブランチの履歴内、または reflog が有効な間は古い SHA として残ります)。
pull.rebase false(merge):git pullは マージコミット を作成し、あなたのコミットと他人のコミットは 再構成されません。ブランチの履歴は単に マージ されます。視覚的に「頭が混乱しにくい」:明確に分岐するラインが見えます。pull.rebase true(rebase):あなたのローカルコミットが 上書き されます(新しいハッシュ)。コミット内容 はほぼ同じですが、成功した rebase 後、古いコミットはgit reflogに残ります — これは正常です。必要に応じて(何かがうまくいかなかった場合)、git reset --hardで reflog から復元できます。
「作業内容を失いたくない」のが主目的なら:
- リスクのある操作前 — コミット(または
git stash)と、別ブランチ(git branch backup-tgisn-46)で 指標のコピー を作成。非常に軽量なバックアップ。 git reset --hard、無理やり push(force push)、git clean -fdなどの誤った操作と混同しない。- 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 の先頭は L、main の先頭は 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つの親(L と r5)を持ちます。コミット L と r1…r5 は オブジェクトとして残ります。履歴は 分岐型 で、再構成は発生しません。
3. git pull で rebase あり(pull.rebase true → rebase)
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 に対する同じ差分、新しいハッシュ)が追加されます。古い L は git reflog でしばらく見え続けます(reflog expire で削除されるまで)。
要約:マージは 分岐 + マージノード、rebase は 1本の線、あなたのコミットが「再演」 されます。どちらの場合も、ファイルの変更内容 は消えません。違いは 履歴の形状 と rebase でローカルコミットのハッシュ が変わる点です。