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

如何删除/替换git子树提交及其合并提交?,git,Git,我有一个这样的历史树: 我发现我在(2)提交中合并了错误版本的库,并希望从历史记录中删除(2)和(3)以获得该版本 然后在(7)上方创建另一个子树,但理想情况下,我希望使用具有强制重写的提交历史的库的另一个版本强制替换提交(2)(例如,如果我执行了rebase-I并用替换一标记提交挤压) 黄色提交是由子树命令创建的合并提交 红色提交是压缩子树提交您可以创建一个新的提交2',其中包含库的其他版本。然后将其与1合并。这将生成一个新的提交3'。然后,您可以将5和7重设到3'上,从而使新提交5'和7

我有一个这样的历史树:

我发现我在(2)提交中合并了错误版本的库,并希望从历史记录中删除(2)和(3)以获得该版本

然后在(7)上方创建另一个子树,但理想情况下,我希望使用具有强制重写的提交历史的库的另一个版本强制替换提交(2)(例如,如果我执行了
rebase-I
并用替换一标记提交挤压)

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

红色提交是压缩子树提交

您可以创建一个新的提交2',其中包含库的其他版本。然后将其与1合并。这将生成一个新的提交3'。然后,您可以将5和7重设到3'上,从而使新提交5'和7'。这将为您提供所需的结果


当然,3',5'和7'的提交ID与3',5'和7'的ID不同,因为在不更改sha1校验和的情况下,无法替换提交的父项之一。

这里有一种方法可以将
2
中引入的合并替换为所需的任何提交:

  • 运行
    git-rebase——rebase合并-i1
    (显然:用提交
    1
    的sha替换
    1
  • 这个场景将比您看到的简单的
    rebase-i
    更加复杂:
  • 在最后一节中,将提及提交
    3
    的行替换为
    break
  • 当重定基址暂停时,创建您想要的提交
  • 然后运行git-rebase--continue

如果在重基过程中遇到任何问题,您可以始终运行git-rebase--abort,然后从头开始重新启动。

您在寻找选项吗?@LeGEC我不知道,我想要图片上显示的行为,或者简单地用另一个“替换”子树的提交
## 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
...

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