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

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

```mermaid
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が同じであれば、

```bash
git replace 5 4
```

と実行すると、

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

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

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

```bash
git replace --graft 3 4
```

```mermaid
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](https://qiita.com/tetsurom/items/ee89b80e64b8840857a4)
    
* Git - Git オブジェクトの置き換え
    
    [https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-Git-%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88](https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%81%95%E3%81%BE%E3%81%96%E3%81%BE%E3%81%AA%E3%83%84%E3%83%BC%E3%83%AB-Git-%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88)
    
* Git - git-replace Documentation  
    [https://git-scm.com/docs/git-replace](https://git-scm.com/docs/git-replace)
    

### 備考

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