我遵循了如何从这里进行压缩提交的帖子所以我照做了:
git reset --soft HEAD~20
git commit
git push -f
我有很多提交,在它们之间,我有一些从开发分支到功能分支的合并,以更新我的分支,例如:
commit (merge): Merge remote-tracking branch 'origin/develop' into feature/my_coo_branch
在执行git reset --soft HEAD~20
命令后,我发现所有的合并都从我的分支中消失了。
为什么?我怎样才能避免呢?
当您运行git reset --soft HEAD~20
时,最后20个提交将被删除。如果在这20次提交中有合并提交,它们也会被删除。这是你告诉Git要做的,Git按照指示去做。
我不确定你所说的"保持合并提交"到底是什么意思。当你声明你想要压缩最近的20个提交(即删除许多提交并用一个新提交代替它们)。
合并提交就像任何其他提交,唯一的区别是它有两个(或更多)parent:
行指向它的祖先提交。常规提交只有一个parent:
行。就像任何其他提交引用树对象一样,合并提交也引用树对象。该树在任何给定时间捕获代码的完整快照。
答案是肯定的,需要一点技巧和使用低级管道命令。
Git中的一个提交总是指向一个树(tree:
行),并引用0个或多个父提交(parent:
行)。合并提交引用2个或多个父提交。现在,您想要使用当前HEAD
树和许多父树创建一个提交,每个父树指向合并分支的尖端(这称为章鱼合并)。
git commit-tree
:
git commit-tree HEAD^{tree}
-p HEAD~20
-p tip-of-merged-branch-1
-p tip-of-merged-branch-2
-p …
<<MSG
Your commit message comes here
With commit body, etc.
MSG
您需要手动查找合并分支提示的提交散列。一些聪明的脚本可以帮助您。获取提交列表,查询提交消息"Merge",获取第二个父元素(或者在章鱼合并的情况下,除了第一个父元素之外的所有元素)。注意,这会创建一个邪恶的merge。
注意,这是一个低级命令,所有的保证都是无效的。知道你在做什么。