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

时间:2013-01-15 07:09:38

标签: git version-control git-rerere

我需要在我的存储库历史的最开头修改提交。由于该提交可能存在数百个分支,合并和合并冲突。

我尝试使用带有--preserve-merges选项的交互式rebase,但我仍然遇到数百个类似于“CONFLICT(内容):在Foobar.cpp中合并冲突”的冲突错误。如果不是不可能的话,手动重新解决它们是非常不切实际的。

我听说过'rerere'功能,但只是刚才,所以我没有启用它。

3 个答案:

答案 0 :(得分:3)

Rerere不会帮助你。

您正在寻找git filter-branch。根据您的更改,您可以使用索引过滤器,它将比树过滤器更快。您将通过执行此操作来更改所有后续SHA-1。

确保包含--all参数,以便更新所有引用。这将破坏使用此repo作为子模块的任何repo,因为SHA-1将引用不存在的repo。你需要做更多的脚本来解决这个问题。

此外,如果您与之合作的任何人都有任何未提交的提交,他们必须git rebase --onto将他们的杰出工作带到历史中的新地点。

在接下来的几年中,我们希望能够获得更多支持来执行此类诡计 - 特别是涉及子模块时。

答案 1 :(得分:0)

newren/git-filter-repo 似乎与 git filter-branch 有着相同的目标,具有更简单的用户体验和更好的性能(参见 Why filter-repo instead of other alternatives?):

请参阅下面的 user manual 摘录以从 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 --replace-text 表达式.txt

将通过并用 REMOVED [...]

替换 p455w0rd

答案 2 :(得分:-1)

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

  1. 启用rereregit config rerere.enabled true
  2. 启用rerere.autoupdategit config rerere.autoupdate true
  3. 回到旧提交并修复它,然后合并掉。希望rerere能够随时学习并开始自动解决冲突。