首页 > 解决方案 > 如何自动化一系列复杂的 git 历史重写?

问题描述

情况

假设我想在合并之前总是变基,但很晚才注意到我忘了这样做,现在提交 E 和 C 具有相同的父级:

I (branch-1)
|\
| H (branch-2)
| |\
| | G
| |/
| F
| |\
| | E
| D |
| |\ \
| | |/
| |/|
| | C
| |/
B |
 \|
  A

我想这样“解开”历史:

I (branch-1)
|\
| H (branch-2)
| |\
| | G
| |/
| F
| |\
| | E
| |/
| D
| |\
| | C
| |/
B |
 \|
  A

我看到的唯一方法非常麻烦,并且会涉及许多连续的历史更改命令,例如git rebase --onto ...大多数git reset --hard ...提供的提交哈希(...)在整个过程中只知道一半。

问题

有没有更自动化的方法来解开图表?我们可以为这样的历史重写制作一个脚本,其中我们只使用来自初始状态的信息吗?

标签: gitgit-rebase

解决方案


由于您只需要进行一组内容更改,因此这是一次提交变基:

git rebase --onto D E

但在新历史中其他所有内容都将具有相同的内容,所以在简单变基之后:

git replace E @
git filter-branch -- --all

使用您想要移动现有标签等的任何选项。 F, G,H并且I将用新的祖先但相同的内容重写,当然E会有新的祖先和合并的D内容。


推荐阅读