gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 14:47:56 28 4
gpt4 key购买 nike

刚接触VC的时候用的是SVN,完全不懂自己在干什么。我在不同的主干上维护一个项目的不同部分,但会同时提交所有主干,导致多次提交具有相同的提交消息。大约两年前,我一觉醒来,把所有的树干都塞进了一个树干,然后又醒来了一些,把 repo 转换成了 git。现在,我有了一个快速、灵活的 repo 协议(protocol),其中包含一些分支机构,我非常高兴……

... 除了所有那些旧的、重复的提交消息让我很烦。 (它们约占我 repo 中提交的 1/3-1/2。)这正是 git rebase 的内容。是为了,对吧?我已经尝试对一批重复项进行测试运行并且它有效,除了它看起来像它分开了我的 master从我的所有其他分支分支。我用 git rebase -i <sha> 做到了并将所有重复的提交压缩到第一个。我想保持我的分支结构完整。

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

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

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

最佳答案

您可以使用 rebase 将两个旧提交压缩为一个提交,但这将导致全新 提交。因此,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?

关于git - 重写历史以删除重复的提交消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15176482/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com