如何同时重写多个分支的历史记录?

问题描述 投票:0回答:2

使用交互式变基(git -i rebase ...),可以在当前分支的谱系中的任何位置编辑提交,因此可以“重写历史记录”。

但是,给定的提交可以属于多个分支的谱系。

例如,假设我有一个具有此分支结构的存储库:

A --- B --- C --- D --- F --- G  branch_1*
             \
              `-- H --- I --- J  branch_2
                         \
                          `-- K  branch_3

如果活动分支为branch_1,而我使用rebase -i编辑提交B,则生成的回购将如下所示(至少直到发生GC为止:]

  ,-- b --- c --- d --- f --- g  branch_1*
 /
A --- B --- C --- D --- F --- G
             \
              `-- H --- I --- J  branch_2
                         \
                          `-- K  branch_3

请注意,原始B继续位于branch_2branch_1的谱系中。对这些分支中的每一个重复该过程,将是很乏味的,将导致多个冗余提交,并且原始的分支结构将丢失:

  ,-- b --- c --- d --- f --- g  branch_1
 /
A --- B --- C --- D --- F --- G
|            \
|             `-- H --- I --- J
|                        \
|                         `-- K
|\
| `-- b' -- c' -- h --- i --- j  branch_2*
 \
  `-- b'' - c'' - h' -- i' -- k  branch_3*

请注意,bb'b''本质上是等同的提交。 cc'c''hh'以及ii'也是一样。

是否有实现这种目的的便捷方法:

A --- b --- c --- d --- f --- g  branch_1*
             \
              `-- h --- i --- j  branch_2
                         \
                          `-- k  branch_3

... B提交的修改内容通过all所属的世系传播?

((我更喜欢一个解决方案,该解决方案还将更改传播到所有后代存储区。)

git rebase
2个回答
0
投票

正如您所说,如果将branch_1设为基准,更改B,您将得到:

  ,-- b --- c --- d --- f --- g  branch_1*
 /
A --- B --- C --- D --- F --- G
             \
              `-- H --- I --- J  branch_2
                         \
                          `-- K  branch_3

然后您可以使用以下方法将branch_2设置为c

git rebase --onto c C

收益:

  ,-- b --- c --- d --- f --- g  branch_1*
 /           \
|             `-- h --- i --- j  branch_2
|
A --- B --- C --- D --- F --- G
             \
              `-- H --- I --- J
                         \
                          `-- K  branch_3

然后将branch_3重新设置为i

git rebase --onto i I

收益:


  ,-- b --- c --- d --- f --- g  branch_1*
 /           \
|             `-- h --- i --- j  branch_2
|                        \
|                         `-- j  branch_3
|
A --- B --- C --- D --- F --- G
             \
              `-- H --- I --- J
                         \
                          `-- K

至少将反映您原始的分支结构。


0
投票

...有中途便捷的方法来实现[明智的结果]

编号

git filter-branch有一个命令,[[can可以做到,但是这并不方便,也不是便利的1/4。大约方便1000%。 :-)新的git rebase --rebase-merges machinery

显然很适合以更方便的方式进行这种事情,

1,但目前尚不能将多个分支名称作为基准。[新的实验git filter-repo有足够的能力执行您想要的事情,并且可能不及git filter-repo那样不便,但是它仍然会用核武器扑灭虫子-在这种情况下,也许是中等大小的虫子,而不仅仅是飞蝇,但仍然严重过头。

((我曾经写过我自己的实验性东西来进行这种变基,但是我从未完成过。它在需要时完成了我需要的工作。它使用重复的git filter-branch操作等效,并且具有很多角落的情况。)


1关键是要能够[[label
个特定的提交,因此,在将它们重新绑定后,您可以将哈希-ID对配对,否则可以在图形中跳转随着基础的发展,从一条链到另一条链的结构。旧的git rebase --onto代码无法执行此操作;新的--preserve-merges代码即可。将这些分支放置好之后,“同时”对多个分支进行重新基准化只是在重组完成后保存多个分支名称以进行强制调整的问题。然后,您就可以在rebase列表中找到正确的提交和跳转点。 rebase操作的主要工作是复制那些提交。最后,使用旧到新映射,rebase可以调整每个分支名称,然后将--rebase-merges重新连接到您想要的分支名称。

剩下的用户界面级别问题在于选择正确的分支名称集以进行多库。

© www.soinside.com 2019 - 2024. All rights reserved.