Git 重新设置已从中分支的分支的基址

Git 重新设置已从中分支的分支的基址,git,version-control,git-rebase,Git,Version Control,Git Rebase,我试图切断存储库历史的一部分,因此 可以使用所述的git replace将其移植回存储库 在 文章中描述的案例与我的 存储库是,我的主分支具有现有分支。我会的 希望保留这些分支及其分支点的布局 在我删去历史之后,就相当于 我的历史大概是这样的 cut here | v o--o--o--o--o--o--o master \ \ \ \ \ o--o A \ o--o--o

我试图切断存储库历史的一部分,因此 可以使用所述的
git replace
将其移植回存储库 在

文章中描述的案例与我的 存储库是,我的主分支具有现有分支。我会的 希望保留这些分支及其分支点的布局 在我删去历史之后,就相当于

我的历史大概是这样的

    cut here
      |
      v
o--o--o--o--o--o--o master
            \  \  \
             \  \  o--o   A
              \  o--o--o  B
               o--o--o    C
在“此处剪切”提交之前,没有主控的分支

我想要实现的是:

o--o--o history

initial tree at cut
        |
        v
        o--o--o--o--o master
               \  \  \
                \  \  o--o   A
                 \  o--o--o  B
                  o--o--o    C
这意味着仅仅在主机上重新设置master的基址是不够的 初始树,但我还需要重播其上的所有现有分支 在主服务器的重新基址后等效的新提交。我不想只是 重播新主机上的所有分支,因为这可能会 有冲突


是否有任何智能且希望自动的方法可以做到这一点?

这些命令将产生您想要的结果:

git checkout --orphan temp-branch CUT–COMMIT
git commit // This will create your new initial commit
git rev-parse HEAD // To get the SHA of this commit
git replace CUT-COMMIT NEW-COMMIT
git filter-branch -- --all
如果您对如何以及为什么这样做有任何疑问,请留言。在做类似的事情之前,你可能想备份你的回购协议

来自

注意:此命令支持.git/info/grafts和.git/refs/replace/。如果 运行此命令可以定义任何移植或替换参照 将使它们永久化


我不太明白你为什么需要修改历史记录。您可以在master上应用这些提交,而无需删除任何内容。瞧,您的重放问题将得到解决。@MaxLeske您是说分支中的提交吗?如前所述:我确信这会导致冲突,而且手动解决这些问题的分支太多了,其中一些分支已经很旧了。我真的不明白为什么您会想做这样的事情(即使文章中给出的理由也不能说服我,您可以只做
clone--depth=1
)。然而,您不能在这种情况下也使用
replace
?只需用一个伪提交替换“cuthere”提交。您的历史记录将丢失(对于该存储库),但您不必进行任何重定基/重放。@MaxLeske具有深度的克隆将创建一个不可用的存储库,据我对手册页的了解。但也许我错了。如果我用你的替换技巧,我能用历史分支的尖端再次替换吗?是的,你是对的。如果您确实希望使用存储库执行高级操作,并将其克隆到深度太浅的位置,那么您将无法推送(尽管它在不同的情况下可以工作)。如手册页所述,替换只是引用。因此,是的,您可以随时替换提交,如果您选择删除替换,则最终将返回原始存储库。我可以跟踪到发生的情况,包括
git replace
。但是我不明白筛选器分支在这里做什么以及它为什么工作。
filter branch
重写您的提交历史记录,因此它实际上包含您使用
replace
更改的内容。如果这有道理的话。