【问题标题】:Git rebase with --preserve-merges fails to reapply merge commits due to conflicts由于冲突,带有 --preserve-merges 的 Git rebase 无法重新应用合并提交
【发布时间】:2018-06-15 12:48:37
【问题描述】:

假设以下 git 历史记录

 M (master) <- merge that required resolving a conflict, e.g. coming from F and G
 | \
 |  |
 F  G
 |  | 
 C  D  <- commit to edit (D), unrelated to the merge conflict (e.g. adding a new file)
 |  |
 | /
 B
 |
 A  <- initial commit

我想要实现的是编辑提交 D(重写历史)。我正在使用命令git rebase --interactive --preserve-merges A master,将提交D标记为要编辑,在变基停止时对其进行编辑,修改提交和git rebase --continue

M 提交之前我收到的是解决冲突的请求。将分支合并到M 时,同样的冲突已经解决,因此我希望变基能够顺利进行。

$ git rebase --continue
Auto-merging yet-another-test.txt
CONFLICT (content): Merge conflict in yet-another-test.txt
Automatic merge failed; fix conflicts and then commit the result.
Error redoing merge d01ffb203aae9ef450ae7a863de5fce2ed5184bb

您可以找到示例here,您可以尝试例如git rebase -i -p 8b58 masteredit 30c7 提交

我问的原因是因为我的真实仓库的 git 历史非常复杂,一路上有很多合并(总共大约 300 次提交),我需要编辑的提交接近初始提交,所以我想保留历史记录(避免挤压),但我宁愿不再解决所有冲突。

有没有更好的方法来做到这一点?

在 git for windows 2.17.1(最近)上尝试过。

【问题讨论】:

  • 以这种方式重写会很复杂,如果不是不可能的话。为什么不直接修复分支上需要修复的任何内容,然后将其合并?净结果是一样的吗?
  • 原因是我想要重写历史记录 - 隐藏最初放入提交的数据,但仍保留整个更改历史记录
  • 过程非常复杂,有很多合并,我需要编辑的提交接近初始提交。当您进行重写时,您需要重新应用上游的所有更改,而不仅仅是您重写的修订。所以所有这 300 次提交都需要重做。这真的不实用。
  • 我知道,如果它不起作用,我将需要另一种方法来摆脱更改历史记录。不过,这个问题归结为:为什么 git 无法重新应用包含已解决冲突的合并提交?

标签: git git-rebase git-rewrite-history


【解决方案1】:

默认情况下,Git 不会记录以前的合并解决方案,这就是为什么当 rebase 必须重新创建合并提交时,您会遇到完全相同的冲突:

Error redoing merge d01ffb203aae9ef450ae7a863de5fce2ed5184bb

这就是git-rerere重用记录的分辨率)的用武之地:

此命令通过在初始手动合并时记录冲突的自动合并结果和相应的手动解决结果并将先前记录的手动解决方案应用于其相应的自动合并结果来协助开发人员。

要让 Git 开始记录合并解决方案,您首先需要在您的存储库(或全局)中启用 rerere,方法是:

git config rerere.enabled true

git config --global rerere.enabled true

不幸的是,它不会帮助您在这个特定的实例中节省时间——因为你已经已经解决了关闭时各种合并提交中的冲突——但它会有所作为前进。

编辑:实际上,似乎有一种方法可以通过运行名为rerere-train 的shell 脚本从现有的合并提交中记录以前的 解决方案。不过我自己没有尝试过,所以 YMMV。

【讨论】:

  • 怎样才能让它在整个 repo 中工作?所有贡献者都应该在他们的机器上启用rerere 吗?如何在远程服务器上合并,例如github?
  • rerere 记录的分辨率存储在本地(在.git/rr-cache 目录中),永远不会传输到远程。所以,每个贡献者都必须在他们的机器上启用它,而,记录的解决方案不会自动与团队的其他成员共享。 不过,有a few workarounds
  • 没有这样的解决方法 - 例如远程合并鉴于rerere,github 会不受欢迎,对吗?
  • 我不确定我是否遵循 - 你说的气馁是什么意思?
  • 如果我在github中合并拉取请求,rerere的数据会被记录吗?
猜你喜欢
  • 2015-05-12
  • 2014-02-17
  • 1970-01-01
  • 2014-10-29
  • 2018-03-13
  • 2021-09-13
  • 1970-01-01
  • 2020-11-25
  • 2011-12-16
相关资源
最近更新 更多