Git 由于冲突,使用 --preserve-merges 的 rebase 无法重新应用合并提交
Git rebase with --preserve-merges fails to reapply merge commits due to conflicts
假设以下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
时,相同的冲突已经解决,因此我希望 rebase 能够顺利进行。
$ 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 master
和 edit
30c7
提交
我问的原因是因为我的真实回购的 git 历史非常复杂,一路上有很多合并(总共大约 300 次提交),我需要编辑的提交是接近初始提交,所以我想保留历史记录(避免压缩)但我不想再次解决所有冲突。
有更好的方法吗?
在 git 上尝试 windows 2.17.1(最近)。
Git 默认情况下不记录以前的合并解决方案,这就是为什么当 rebase 必须 recreate 合并提交时,您会遇到完全相同的冲突:
Error redoing merge d01ffb203aae9ef450ae7a863de5fce2ed5184bb
这就是 git-rerere
(重复使用记录的分辨率)的用武之地:
This command assists the developer in this process by recording conflicted automerge results and corresponding hand resolve results on the initial manual merge, and applying previously recorded hand resolutions to their corresponding automerge results.
为了 Git 开始记录合并解决方案,您首先需要在您的存储库(或全局)中启用 rerere
,方法是:
git config rerere.enabled true
或
git config --global rerere.enabled true
不幸的是,它不会帮助您在这个特定实例中节省时间 — 因为您已经 已经 在它关闭时解决了各种合并提交中的冲突 — 但它将会有所作为。
编辑: 实际上,似乎有一种方法可以通过 运行 记录来自现有合并提交的 先前 决议shell 脚本名为 rerere-train
。不过我自己还没有尝试过,所以 YMMV。
假设以下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
时,相同的冲突已经解决,因此我希望 rebase 能够顺利进行。
$ 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 master
和 edit
30c7
提交
我问的原因是因为我的真实回购的 git 历史非常复杂,一路上有很多合并(总共大约 300 次提交),我需要编辑的提交是接近初始提交,所以我想保留历史记录(避免压缩)但我不想再次解决所有冲突。
有更好的方法吗?
在 git 上尝试 windows 2.17.1(最近)。
Git 默认情况下不记录以前的合并解决方案,这就是为什么当 rebase 必须 recreate 合并提交时,您会遇到完全相同的冲突:
Error redoing merge d01ffb203aae9ef450ae7a863de5fce2ed5184bb
这就是 git-rerere
(重复使用记录的分辨率)的用武之地:
This command assists the developer in this process by recording conflicted automerge results and corresponding hand resolve results on the initial manual merge, and applying previously recorded hand resolutions to their corresponding automerge results.
为了 Git 开始记录合并解决方案,您首先需要在您的存储库(或全局)中启用 rerere
,方法是:
git config rerere.enabled true
或
git config --global rerere.enabled true
不幸的是,它不会帮助您在这个特定实例中节省时间 — 因为您已经 已经 在它关闭时解决了各种合并提交中的冲突 — 但它将会有所作为。
编辑: 实际上,似乎有一种方法可以通过 运行 记录来自现有合并提交的 先前 决议shell 脚本名为 rerere-train
。不过我自己还没有尝试过,所以 YMMV。