git - 重写历史记录以删除重复的提交消息

标签 git version-control

刚开始接触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/

相关文章:

git - 远程服务器上的 git 存储库中的代码安全吗?如何保证它的安全?

git - 在github上看不到分支历史

version-control - 在分支很重要的情况下 CVS 的替代方案

git - 为什么一些 git 提交 stash 在 cygwin shell 中?

git - 为什么 `git clone` 不克隆所有分支?

git - 如何为版本控制的 git commit 命令配置选项

git - 在 master 分支上意外执行 "Git push origin master"

使用 GIT_SSH 错误使用自定义 SSH 进行 Git 克隆

Git下载优化: pull once for entire office

version-control - 分布式版本控制。 - Git & Mercurial...多个站点