2

当我第一次进入VC时,我使用的是SVN并且不明白我在做什么。我在不同的主干上维护了一个项目的不同部分,但会一次对所有主干进行提交,从而导致具有相同提交消息的多个提交。大约两年前,我醒来并将所有的树干弄成一个树干,然后又醒了一些并将 repo 转换为 git。现在我有了一个快速、灵活的仓库,里面有几个分支,我再高兴不过了……

...除了所有那些旧的、重复的提交消息都在困扰我。(它们构成了我 repo 中提交的大约 1/3-1/2。)这正是git rebase它的用途,对吧?我已经尝试对一批副本进行测试运行,并且它可以正常工作,只是它看起来像是将我的master分支与我的所有其他分支分开。我这样做了,git rebase -i <sha>并将所有重复的提交压缩到第一个。我想保持我的分支结构完整。

我想要压缩的所有重复消息都在我进行svn=>git转换之前出现,并且我的所有分支都在转换之后开始。也就是说,svn=>git转换前的整个历史是线性的,没有分支。

另一个警告——这是一个很大的警告——是这个 repo 已经被推送到一个远程 repo。我知道重写共享存储库的历史是个坏消息,但我只是在考虑它,因为还没有人从我的遥控器克隆或分叉。我想在将其用于克隆/分叉之前清理历史记录。

那么有没有办法在一定程度上重写历史,而其余部分保持不变呢?还有其他建议可以帮助我清理这个烂摊子吗?

4

1 回答 1

3

您可以使用 rebase 将两个旧提交压缩为一个,但这将导致一个全新的提交。因此,rebase 必须更改所有子项(直接在提交之后提交)以指向新的提交,这将再次导致全新的提交。- 等等...

因此,修改/重新调整旧提交将导致一个全新的提交图。其他分支仍然指向旧图。这就是为什么您将您的分支与所有其他分支分开的原因。

根据提交分支的复杂性,您的清理工作会变得非常棘手。很可能你应该让你的存储库保持原样。

如果你真的想改变历史。您应该创建一个指向上一次 SVN 提交的新分支,它应该是所有分支的父级。git tag oldsvn $SHA1; git checkout -b newsvn oldsvn

您现在可以清理该分支,然后在该分支上重新设置所有其他分支。(这是 rebase 的真正想法,给分支一个新的基础。)你可以用git rebase --onto newsvn oldsvn $branch.

由于您可能正在重写共享共同历史的多个分支,因此您可能会再次为您的分支获得不同的树。看看Git:如何一次变基多个分支(具有相同的基本提交)?

于 2013-03-02T19:17:36.543 回答