如何编辑一个包含数百次合并的Git提交,并将冲突合并到过去?

如何编辑一个包含数百次合并的Git提交,并将冲突合并到过去?,git,version-control,git-rerere,Git,Version Control,Git Rerere,我需要在存储库历史记录的最开始修改提交。自从那次提交以来,可能有数百个分支、合并和合并冲突 我试着使用交互式的rebase和--preserve merges选项,但仍然会出现数百个类似于“conflict(content):在Foobar.cpp中合并冲突”的冲突错误。如果不是不可能的话,手动重新解决这些问题是非常不切实际的 我听说过“重新播放”功能,但只是刚刚才听说,所以我还没有启用它。这就是我要尝试的。没有保证,但值得一试 启用(git config rere.enabled true)

我需要在存储库历史记录的最开始修改提交。自从那次提交以来,可能有数百个分支、合并和合并冲突

我试着使用交互式的rebase和--preserve merges选项,但仍然会出现数百个类似于“conflict(content):在Foobar.cpp中合并冲突”的冲突错误。如果不是不可能的话,手动重新解决这些问题是非常不切实际的


我听说过“重新播放”功能,但只是刚刚才听说,所以我还没有启用它。

这就是我要尝试的。没有保证,但值得一试

  • 启用(
    git config rere.enabled true
  • 启用(
    git config rere.autoupdate true
  • 回到旧的提交并修复它,然后合并。希望Reerre能边走边学习,并开始自动解决冲突

  • 雷雷在这里帮不了你

    您正在寻找
    git过滤器分支
    。根据您所做的更改,您可能可以使用比树过滤器更快的索引过滤器。通过这样做,您将更改所有后续SHA-1

    确保包含
    --all
    参数,以便更新所有引用。这将破坏任何将此回购协议用作子模块的回购协议,因为SHA-1将引用不存在的回购协议。您需要再编写一些脚本来解决这个问题

    此外,如果您的同事有任何未推送的提交,他们将不得不
    git-rebase--on
    将他们出色的工作放到历史上的新位置上

    在未来的几年里,我们希望看到更多的人支持这种恶作剧,尤其是当涉及子模块时。

    似乎与
    git filter branch
    有着相同的目标,更简单的用户体验和更好的性能(请参阅):

    请参阅下面的摘录,以从git历史记录中删除密码泄漏

    如果要修改文件内容,可以基于文件中的表达式列表(每行一个)进行修改。例如,名为expressions.txt的文件包含

    p455w0rd
    foo==>bar
    glob:*666*==>
    regex:\bdriver\b==>pilot
    literal:MM/DD/YYYY==>YYYY-MM-DD
    regex:([0-9]{2})/([0-9]{2})/([0-9]{4})==>\3-\1-\2
    
    然后跑

    git filter repo--替换文本表达式.txt

    将通过并用移除的替换p455w0rd[…]


    魔法子弹在第三通道有售。买一整箱;它们很便宜!我会先签出提交,编辑并提交,然后将当前提交与之合并。这里不需要魔法子弹。我只是觉得这是很多人都会遇到的问题,也许有人能给我指出正确的方向。伊格纳西奥,我不明白你的意思。你能扩大一下吗?谢谢不知道为什么投票决定关闭。这是一个非常好的问题,显示了对Reere角色的潜在误解。我仍然认为这可以帮助通过谷歌点击的人。使用git,您不能总是让代码示例与问题和答案匹配。在其他技术上,如编程语言、SDK、库等,你是100%正确的。尝试过,但没有成功。在重设基础期间,同样的冲突仍会发生。无论如何谢谢你!非常感谢。通过一些巧妙的脚本,这看起来应该适用于我需要进行的特定更改,因为这些更改都不涉及实际的源代码。(只是修改提交消息、挤压提交和删除二进制文件。)我不确定您是否要挤压提交。但您可以指示筛选器分支删除空提交。如果要删除的文件具有仅影响该文件的提交,则可能会发生这些情况。在此之后,这些将是空提交。因此,您可能希望启用该选项以删除它们。您可能已经知道这一点,但在使用过滤器分支之前,请确保备份您的回购协议。