Git:壁球提交早于冲突合并

Git: Squash commits older than conflicting merge

我想压缩一些比“冲突”合并更早的提交。例如:

main branch:  A--B--C--D--G--H
dev branch:    \-E--F----/

H 是我当前的头,G 是冲突合并(因此我手动解决了冲突的合并),我想压缩 C 和 D - 但如果我尝试这样做,我会变基由于 G 是冲突合并而导致的冲突。

我可以压缩 C 和 D 吗?如果可以,怎么做?我会对无需再次手动合并内容的解决方案感兴趣。

附加信息:git rebase -i B 将所有提交保留在“选择”上时甚至不起作用 - 这应该什么都不做,对吧?

首先:默认情况下,git rebase 完全忽略合并提交。您必须指定 -r | --rebase-merges 才能让 git rebase“知道”您的合并操作。

-i 相结合:您会发现 sequencer 脚本更精细一些,并允许您描述要重放合并的操作。


其次:在您描述的场景中,合并提交的内容将与原始提交的内容相同,因此“解决冲突”等同于:“重新使用与 [=16 完全相同的内容=]".

如果合并时遇到冲突:尝试 运行ning

git restore --staged --source G -- .
# or using shorthands :
git restore -S -s G -- .

如果您需要从索引中的文件中清除“冲突”标志,您可能需要事先 运行 git reset .

如果您的本地 git 没有 git restore(此命令是最近添加的,在 git 2.27 -- 2020 年 6 月):尝试

git read-tree G

应该将 G 的内容放在索引中。

不要为此使用变基,变基可以为你压缩,但它是为比像这样的仅祖先重写更重的提升而构建的,它会做大量(缓慢的)准备工作来实现你喜欢的任何改变顺便。

git replace --graft G B F   # (put usable references to those commits here of course)
git filter-branch

并且您已经实现了变基所能实现的一切,大大更快。