当我第一次进入VC时,我正在使用SVN并且不了解我在做什么。我在一个单独的中继上维护了一个项目的不同部分,但是会立即对所有中继进行提交,从而导致多个提交具有相同的提交消息。大约两年前,我醒来,把所有的树干都弄成了一个树干然后再醒了一下,把回购转换成git。现在我有一个快速,灵活的回购与一些分支,我不能更快乐...
...除了所有那些旧的,重复的提交消息都在困扰我。 (它们在我的仓库中构成了大约1 / 3-1 / 2的提交。)这正是git rebase
的用途,对吧?我已尝试对一批重复项进行测试运行,但它看起来像是将master
分支与我所有其余分支分开。我用git rebase -i <sha>
做了那个并将所有重复的提交压缩到第一个。我想保持我的分支结构完整。
在我进行svn=>git
转换之前,我想要压缩的所有重复消息都出现了,并且在转换之后我的所有分支都开始了。也就是说svn=>git
转换前的整个历史记录是线性的,没有分支。
另一个警告 - 它是一个很大的问题 - 是这个回购被推到一个远程回购。我知道重写共享回购的历史记录是坏消息,但我只考虑它,因为还没有人从我的遥控器中克隆或分叉。我想在克隆/分叉之前清理历史记录。
那么有没有办法将历史重写到某一点并保持其余部分不受影响?还有其他建议可以帮我清理这个烂摊子吗?
答案 0 :(得分:3)
您可以使用rebase将两个旧提交压缩为一个,但这将导致全新提交。因此,rebase必须更改所有子项(提交后直接提交)以指向新提交,这将再次导致全新提交。 - 依此类推......
修改/重新定位旧提交将导致一个全新的提交图。其他分支仍然指向旧图。这就是你将你的分支与所有其他分支分开的原因。
根据提交分支的复杂程度,清理工作变得相当棘手。 最有可能的是你应该保留存储库。
如果你真的想改变历史。您应该创建一个指向上一个SVN提交的新分支,该分支应该是所有分支的父级。 git tag oldsvn $SHA1; git checkout -b newsvn oldsvn
您现在可以清理该分支,然后在该分支上重新绑定所有其他分支。 (这是rebase的真正想法,给分支机构一个新的基础。)
您可以使用git rebase --onto newsvn oldsvn $branch
。
由于您可能正在重写共享历史记录的多个分支,因此您可能会再次为分支获取不同的树。看看Git: How to rebase many branches (with the same base commit) at once?