我想问一下Git在以下场景中的合并:
branchA -*-*-*-*-*
\
branchB *-*-*-*
在这种情况下可以进行git合并获得以下结果吗?
branchA -*-*-*-*-*---------*
\ /
branchB *-*-*-*
我想要获得的是在branchA上进行单个合并提交,其中包含来自branchB的所有更改。 我知道git merge命令中有--squash选项,但是我不确定它是否100%等同于标准合并。
因此,允许我阻止我的分支拓扑,而不只是快进。
非常感谢您提前寻求帮助!
答案 0 :(得分:3)
尝试git merge branchb --no-ff
(来自brancha
)。来自git-merge(1)
- 无-FF
即使合并解析为快进,也会创建合并提交。
即使git意识到当前的HEAD(分支A,因为这是你将合并形式的地方)只是分支B上提交的祖先,它没有任何并行发生的变化,它会阻止快进在分支A上。
答案 1 :(得分:1)
不,您无法生成包含分支中所有更改的真实合并提交。 <{1}}将生成带有更改的单个提交,但它不会是合并提交。
Git提交在给定时间记录存储库的完整状态,而不是先前提交的更改。因此,当您稍后检查历史记录时,不会在创建提交时生成差异。
但是,如果使用git merge --squash
创建合并,即使可以在不创建新提交的情况下进行快进合并,也可以确保创建提交。然后,如果你使用git commit --no-ff branchB
,它将忽略在branchB上进行的提交,使得看起来所有这些更改都是由该合并提交引入的,git log -m --first-parent
选项将导致显示完整的差异用于合并提交(如果以其他方式显示差异)。