使用交互式变基(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_2
和branch_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*
请注意,b
,b'
和b''
本质上是等同的提交。 c
,c'
和c''
,h
和h'
以及i
和i'
也是一样。
是否有实现这种目的的便捷方法:
A --- b --- c --- d --- f --- g branch_1*
\
`-- h --- i --- j branch_2
\
`-- k branch_3
... B
提交的修改内容通过all所属的世系传播?
((我更喜欢一个解决方案,该解决方案还将更改传播到所有后代存储区。)
正如您所说,如果将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
至少将反映您原始的分支结构。
...有中途便捷的方法来实现[明智的结果]
编号
git filter-branch
有一个命令,[[can可以做到,但是这并不方便,也不是便利的1/4。大约方便1000%。 :-)新的git rebase --rebase-merges
machinery
1,但目前尚不能将多个分支名称作为基准。[新的实验git filter-repo
有足够的能力执行您想要的事情,并且可能不及git filter-repo
那样不便,但是它仍然会用核武器扑灭虫子-在这种情况下,也许是中等大小的虫子,而不仅仅是飞蝇,但仍然严重过头。
git filter-branch
操作等效,并且具有很多角落的情况。)git rebase --onto
代码无法执行此操作;新的--preserve-merges
代码即可。将这些分支放置好之后,“同时”对多个分支进行重新基准化只是在重组完成后保存多个分支名称以进行强制调整的问题。然后,您就可以在rebase列表中找到正确的提交和跳转点。 rebase操作的主要工作是复制那些提交。最后,使用旧到新映射,rebase可以调整每个分支名称,然后将--rebase-merges
重新连接到您想要的分支名称。剩下的用户界面级别问题在于选择正确的分支名称集以进行多库。