[メモ] git replaceを使用した疑似的なマージ

管理者が突然、Gitの過去のコミット履歴を削除し、新しいコミット履歴を開始することに決めたとしよう。
つまり、以下の図のように、コード内容の繋がりはあるが、Gitのツリー上では繋がりのない旧ブランチoldと新ブランチmainが作成されることになる。この場合、共通の親は無いので新ブランチmainからはファイルの履歴を辿るのが難しくなる。

gitGraph
  branch "old"
  commit id: "1"
  commit id: "2"
  checkout "main"
  commit id: "3"
  checkout "old"
  commit id: "4" type: HIGHLIGHT
  checkout "main"
  commit id: "5" type: HIGHLIGHT
  commit id: "6"

このとき、git replace コマンドを使うことで、ローカル上では疑似的にマージされた状態に出来る。
例えば、コミット4と5が同じであれば、

git replace 5 4

と実行すると、

gitGraph
  checkout "main"
  commit id: "1"
  commit id: "2"
  commit id: "5" type: HIGHLIGHT
  commit id: "6"

のようにローカル環境では疑似的に表示される。

また、同じコミットが存在しない場合でも

git replace --graft 3 4
gitGraph
  checkout "main"
  commit id: "1"
  commit id: "2"
  commit id: "4" type: HIGHLIGHT
  commit id: "3"
  commit id: "5" type: HIGHLIGHT
  commit id: "6"

のように実行することで、ローカル環境では以下のように疑似的にマージしたかのように表示させることが出来る。


参照

備考

  • 初出時は「git update」と記載していましたが間違いです。申し訳ございません。(2025/3/9)