[メモ] 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"
のように実行することで、ローカル環境では以下のように疑似的にマージしたかのように表示させることが出来る。
参照
-
マージから失われた2番目の親を復元する #Git - Qiita
https://qiita.com/tetsurom/items/ee89b80e64b8840857a4 -
Git - Git オブジェクトの置き換え
-
Git - git-replace Documentation
https://git-scm.com/docs/git-replace
備考
- 初出時は「git update」と記載していましたが間違いです。申し訳ございません。(2025/3/9)