如何让git分支历史在挤压重基后与master匹配?

如何让git分支历史在挤压重基后与master匹配?,git,rebase,squash,Git,Rebase,Squash,假设我有以下树结构: A-B-C-D |\E-F (branch one) \G-H (branch two) Master history: A-B-C-D Branch one history: A-B-C-E-F Branch two history: A-B-C-G-H 我想挤压提交B,因此相应的历史应该如下所示: A-C-D A-C-E-F A-C-G-H 我发现,在我挤压master之后,当我签出分支1或分支2时,当我运行git日志时,它们仍然显示旧的历史记录

假设我有以下树结构:

A-B-C-D
    |\E-F (branch one)
     \G-H (branch two)

Master history: A-B-C-D
Branch one history: A-B-C-E-F
Branch two history: A-B-C-G-H
我想挤压提交B,因此相应的历史应该如下所示:

A-C-D
A-C-E-F
A-C-G-H
我发现,在我挤压master之后,当我签出分支1或分支2时,当我运行git日志时,它们仍然显示旧的历史记录。git在分支时复制树吗?我是否需要分别为每个分支机构重新设置基础


谢谢

是的,您需要分别为每个分支重新设置基础。删除commit B之后,您将获得

Master history: A-C'-D'
Branch one history: A-B-C-E-F
Branch two history: A-B-C-G-H
其中C'和D'与C和D相似,只是B从历史中删除了。分支1和分支2不受主重基的影响。对结果的另一种看法是:

A-C'-D'
|\B-C-E-F (branch one)
 \B-C-G-H (branch two)

其中A,而不是C,现在是所有分支最接近的共同祖先。

那么,我认为如果你将分支重新设置到
master
,你会得到你想要的东西。@willoller:不完全是,你会从简单的重新设置中得到(对于分支一)
A-C'-D'-B'-E'-F'
,不,我认为在这种情况下,
B
会消失,因为
C'
将包含
B
(因为他压扁了它,而不是移除了它)创造历史
A-C'-E'-F'
哦,我明白你的意思。在最初的问题中,不清楚“想要挤压提交B”实际上是指“将B与C结合”(或者可能与A结合?),还是“完全删除提交B”。我假设的是后者,但你的解释可能同样有效。当你说“挤压”时,你是指
rebase--squash
?我尝试使用交互式rebase挤压,或者使用以下方法:(第二个答案)。两者都产生了相同的结果,即需要分别为每个分支重新设定基础。是的。不管你怎么做,你都必须分别做每一个分支。这是因为每个分支都保留自己的历史记录,并且不受其他分支中的更改的影响。