Git提交被撤销后如何复制为新提交 GitLab合并请求未显示全量提交
问题解答
一、将旧提交复制为等效新提交的方法
你可以通过cherry-pick命令实现需求,操作步骤如下:
- 先切换到
feature-1分支,拉取远端最新代码保证本地分支和远端状态同步:git checkout feature-1 && git pull origin feature-1 - 找到你需要恢复的旧提交哈希值,逐一对目标提交执行复制操作:
git cherry-pick <旧提交哈希>- 若执行过程中出现冲突,解决冲突后执行
git add .,再运行git cherry-pick --continue即可完成当前提交的复制 - 若不需要保留多个提交的拆分结构,想合并为一个新提交,可添加
-n参数批量应用多个提交的改动:git cherry-pick -n <旧提交哈希1> <旧提交哈希2> ...,所有改动应用完成后手动执行git commit生成整合的新提交即可
- 若执行过程中出现冲突,解决冲突后执行
- 所有提交复制完成后,推送到远端即可生效:
git push origin feature-1
如果需要复制的是连续的多个提交,可直接使用范围语法:git cherry-pick <起始提交哈希>^..<结束提交哈希>,即可批量复制该区间内的所有提交。
二、MR提交列表缺失9月13日之前提交的常见场景
多人共用同一个开发分支时,出现该问题基本都是分支提交历史被篡改导致,常见场景如下:
- 其他开发人员执行了*变基(rebase)*操作后强制推送分支:如果有人将
feature-1分支基于目标分支做了变基,修改了9月13日之前的提交的父节点,或是直接删除了这部分提交记录,强制覆盖远端分支后,你的旧提交已经不在远端分支的提交链上,MR就不会识别展示这部分提交。 - 其他开发人员执行了*提交回滚(reset)*操作后强制推送分支:如果有人将分支回滚到了9月13日的某个节点,再执行
git push -f强制覆盖了远端分支,9月13日之前的提交就会从远端分支的提交历史中被移除,MR自然不会展示。 - 旧提交被标记为已合入目标分支:如果之前有人将包含这部分旧提交的版本合并到过MR的目标分支,之后又做了合并回滚操作,MR会默认判定这些旧提交已经合入过,不会再展示在提交列表中。
三、GitLab MR的差异校验逻辑
GitLab处理合并请求时,会计算源分支最新版本和目标分支最新版本两点之间的整体差异,并不是仅校验提交列表中包含的文件改动。哪怕提交列表没有展示部分提交,只要源分支和目标分支的文件内容存在差异,都会在「变更」标签页展示,合并时也会把所有差异同步到目标分支。
需要注意的是,若提交历史被篡改导致部分提交丢失,最终合并结果以两个分支最新版本的diff为准,和提交列表是否展示无关。
内容的提问来源于stack exchange,提问作者DS9
相关产品推荐
相关产品推荐

