如何删除/替换git子树提交及其合并提交?

时间:2020-08-29 08:55:53

标签: git

我有一棵这样的历史树:

我发现我在(2)提交中合并了错误的库版本,并想从历史记录中删除(2)和(3)来获取

然后在(7)上方创建另一个子树,但理想情况下,我想用具有强制重写的提交历史记录的另一个版本的库强制替换commit(2)(就像我做了rebase -i并用替换标记mark squash一个)

黄色提交是由子树命令创建的合并提交
红色提交是压缩的子树提交

2 个答案:

答案 0 :(得分:0)

您可以进行一个新提交2',其中包含libray的其他版本。然后将其与1合并。这将产生一个新的提交3'。然后,您可以将5和7重新设置到3'上,从而进行新的提交5'和7'。这会给您想要的结果。

当然,提交ID的3',5'和7'与ID 3、5和7的ID有所不同,因为您不能在不更改其sha1校验和的情况下替换提交的父级之一。

答案 1 :(得分:0)

这是将2中引入的合并替换为您想要的任何提交的一种方法:

  • 运行git rebase --rebase-merges -i 1(很明显:用sha替换1来提交1 ...)
  • 这种情况比简单的rebase -i可能会复杂得多:
## here is a sample I got, from a history with two merges :
label onto

# Branch br2
reset [new root]
pick df98219 br2
label br2

# Branch br4
reset [new root]
pick 3a30d4d br4
label br4

## the linear history for master is described here :
reset onto
merge -C f47b992 br2 # Commit 3
merge -C e198adf br4 # Commit 5
  • 在上一节中,用3替换提及您的提交break的行:
...

reset onto
## remove this line to drop the faulty merge commit :
# merge -C f47b992 br2 # Commit 3
## add a 'break' instruction to stop for editing :
break
merge -C e198adf br4 # Commit 5
  • 在重新定标暂停时,创建您想要的提交
  • 然后运行git rebase --continue

如果在调整基准期间遇到任何问题,则可以始终运行git rebase --abort,然后从头开始重新启动。

相关问题