情况
比方说,我想在合并之前总是重新设置基址,但是很晚才注意到我忘记了这样做,现在提交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 ...,其中大多数提供的提交散列( ...)只能在过程的中途获知。
问题
有没有一种更自动化的方法来解开图表?我们能为这样的历史重写编写一个脚本,在这个脚本中,我们只使用初始状态的信息吗?
发布于 2021-03-03 21:42:33
由于您只需要进行一组内容更改,这就是一次提交rebase:
git rebase --onto D E但在新的历史中,其他所有内容都将具有相同的内容,因此在轻松地重新建立基础之后,请执行以下操作:
git replace E @
git filter-branch -- --all使用任何你想要的选项来移动现有的标签等等。F、G、H和I将使用新的祖先和相同的内容重写,当然E也将拥有新的祖先和从D合并而来的内容。
发布于 2021-03-03 21:27:02
尝试git rebase的-r|--rebase-merges选项:
git rebase -r -i Asequencer将有更多的选项,并允许您描述回放或创建合并的脚本。
您可以仔细地重写该定序器脚本,
或者:
E和D合并到F后立即添加break指令,E和D12,git rebase --continue.进行rebase
如果E是一个提交序列,而不是单个提交,那么在运行该序列之前,您可能希望首先创建E' (应该是git rebase --onto D A E),因为您不能在步骤2中“在中断rebase时进行rebase”。
步骤2将变成:用git merge -C F E'替换F。
https://stackoverflow.com/questions/66456323
复制相似问题