当做git reset -soft HEAD~60来压缩提交时,会删除已经完成的合并,如何避免? &g



我遵循了如何从这里进行压缩提交的帖子所以我照做了:

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

注意,这是一个低级命令,所有的保证都是无效的。知道你在做什么。

相关内容

  • 没有找到相关文章

最新更新