GitLab 开启squash的merge request底层执行原理是什么?
GitLab 开启squash合并的底层命令逻辑
你看到的非单线性提交树,核心是GitLab在squash功能提交后执行了非快进合并,完整逐步骤执行逻辑如下:
- 首先定位到你提交的
feature分支最新提交节点 - 执行软重置操作,将
feature分支相对于main的所有改动合并为单次提交:git reset --soft main git commit -m "MR页面填写的squash提交信息" - 切换回
main分支,强制生成合并节点完成合并:git checkout main git merge --no-ff <上一步生成的squash提交哈希值>
--no-ff参数的作用是:即使当前main分支在你拉取feature分支后没有新提交,也强制生成一个独立的合并提交节点,这个节点会同时指向原main分支的HEAD和squash后的功能提交,最终呈现你在GitLab合并后看到的提交树结构。
本地复现方法
你之前操作得到单线性提交树,是因为默认Git在目标分支(main)没有新提交时,会默认走快进合并,不会生成额外的合并节点。按以下步骤操作即可复现GitLab的效果:
# 切换到你的功能分支 git checkout <feature_branch_name> # 软重置到main节点,所有改动存入暂存区 git reset --soft main # 生成squash后的单次提交 git commit -m "你的功能提交说明" # 切换回main分支 git checkout main # 强制禁用快进合并,完成合并 git merge --no-ff <feature_branch_name>
内容的提问来源于stack exchange,提问作者Lukasz Blasiak
相关产品推荐
相关产品推荐

