刚开始接触VC的时候,我正在使用SVN,并不明白自己在做什么。我在不同的主干上维护一个项目的不同部分,但会同时提交所有主干,从而导致具有相同提交消息的多次提交。大约两年前,我醒来并将所有主干 merge 为一个主干,然后又醒来并将存储库转换为 git。现在我有了一个快速、灵活的存储库,其中有几个分支,我高兴极了……
...除了所有那些旧的、重复的提交消息都困扰着我。 (它们约占我的存储库中提交的 1/3-1/2。)这正是 git rebase
的内容。是为了,对吗?我已经尝试对一批重复项进行测试运行,它起作用了,只是它看起来像是将我的 master
分开了。来 self 所有其余分支的分支。我用 git rebase -i <sha>
做到了这一点并将所有重复提交压缩到第一个提交中。我想保持我的分支结构完整。
我想要压缩的所有重复消息都是在我执行 svn=>git
之前发送的。转换,我的所有分支都是在转换后开始的。也就是说svn=>git
之前的整个历史。转换是线性的,没有分支。
另一个警告 - 这是一个很大的警告 - 是这个存储库已被推送到远程存储库。我知道重写共享存储库的历史是个坏消息,但我只是考虑它,因为还没有人从我的远程克隆或 fork 。我想在将其用于克隆/ fork 之前清理历史记录。
那么有没有一种方法可以在一定程度上重写历史,而让其余部分保持不变呢?还有其他建议可以帮助我清理这个烂摊子吗?
最佳答案
您可以使用 rebase 将两个旧提交压缩为一个,但这将导致全新提交。因此, rebase 必须更改所有子项(在提交之后直接提交)以指向新的提交,这将再次导致全新的提交。 - 等等...
因此,修改/重新调整旧提交将产生一个全新的提交图。其他分支仍然指向旧图。这就是您将您的分支与所有其他分支分开的原因。
根据提交分支的复杂性,清理工作会变得相当棘手。 最有可能的是,您应该让存储库保持原样。
如果你真的想改变历史。您应该创建一个指向上次 SVN 提交的新分支,该分支应该是所有分支的父分支。 git 标签 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?
关于git - 重写历史记录以删除重复的提交消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15176482/