Git:在合并提交时保留分支拓扑

Git:在合并提交时保留分支拓扑,git,git-merge,Git,Git Merge,我想问一下以下场景中的Git合并: branchA -*-*-*-*-* \ branchB *-*-*-* 在这种情况下,是否可以进行git合并以获得以下结果 branchA -*-*-*-*-*---------* \ / branchB *-*-*-* 我想要得到的是在branchA上有一个合并提交,它包含branchB的所有更改。 我知道git

我想问一下以下场景中的Git合并:

branchA  -*-*-*-*-*
                   \
            branchB *-*-*-*
在这种情况下,是否可以进行git合并以获得以下结果

branchA  -*-*-*-*-*---------*
                   \       /
            branchB *-*-*-*
我想要得到的是在branchA上有一个合并提交,它包含branchB的所有更改。 我知道git merge命令中有--squash选项,但我不确定这是否100%等同于标准merge

因此,允许我阻止我的分支拓扑,而不仅仅是快进


非常感谢您的帮助

试试
git merge branchb--no ff
(来自
brancha
)。从

--无ff

即使合并解析为快进,也要创建合并提交


即使git意识到当前头(分支a,因为您将在这里合并表单)只是分支B上提交的祖先,而没有在分支a上并行发生的任何更改,它也会阻止快进。从

--无ff

即使合并解析为快进,也要创建合并提交


即使git意识到当前头(分支a,因为这是合并表单的地方)只是分支B上提交的祖先,而没有分支a上并行发生的任何更改,它也会阻止快进。不,您无法生成包含来自分支的所有更改的真正的合并提交
gitmerge--squash
将生成一个包含更改的提交,但它不是一个合并提交

Git提交记录存储库在给定时间的完整状态,而不是以前提交的更改。因此,这些差异是在以后检查历史记录时产生的,而不是在创建提交时产生的


但是,如果使用
git commit--no ff branchB
创建合并,则即使可以在不创建新提交的情况下进行快进合并,也可以确保创建提交。然后,如果您使用
git log-m--第一个父项
,它将忽略在branchB上进行的提交,使其看起来所有这些更改都是由该合并提交引入的,并且
-m
选项将导致为合并提交显示完整的差异(如果以其他方式显示差异)。

否,您无法生成包含分支中所有更改的真正合并提交
gitmerge--squash
将生成一个包含更改的提交,但它不是一个合并提交

Git提交记录存储库在给定时间的完整状态,而不是以前提交的更改。因此,这些差异是在以后检查历史记录时产生的,而不是在创建提交时产生的


但是,如果使用
git commit--no ff branchB
创建合并,则即使可以在不创建新提交的情况下进行快进合并,也可以确保创建提交。然后,如果使用
git log-m--first parent
它将忽略在branchB上进行的提交,使其看起来所有这些更改都是由该合并提交引入的,
-m
选项将导致为合并提交显示完整的差异(如果以其他方式显示差异).

你为什么想要这个?我的动机是:假设branchA是一种主线分支,branchB是一种开发分支。branchB上的一些提交可能没有编译/通过测试套件,但最终branchB准备好进入主线。我希望在主线上有一个commit,因为它代表已完成的工作,同时我可以在branchB上看到历史记录(如果需要的话)。为什么您希望这样?我的动机是:假设branchA是一种主线分支,branchB是一种开发分支。branchB上的一些提交可能没有编译/通过测试套件,但最终branchB准备好进入主线。我希望在主线上有一个提交,因为它代表已完成的工作,同时我可以看到branchB上的历史记录(如果需要的话)。这正是我想要的-非常感谢您的帮助!这正是我想要的-非常感谢你的帮助!谢谢你的回复!我尝试了git合并分支HB——没有ff,这正是我想要的。再次感谢。谢谢你的回复!我尝试了git合并分支HB——没有ff,这正是我想要的。再次感谢。