如何合并master分支旧提交?GitLab合并请求后能否回溯压缩提交?
如何回溯压缩GitLab仓库中已合并的未压缩提交?
没问题,这种GitLab的小bug确实挺烦人的,不过我们可以通过Git的交互式变基来回溯压缩那些没被合并成单个提交的历史记录。下面是具体的操作步骤,记得操作前先和团队沟通一下,因为修改公共分支(比如master)的历史会影响其他人的工作:
第一步:拉取最新的master分支
先确保你的本地仓库是最新状态:git checkout master git pull origin master第二步:启动交互式变基
找到你要压缩的那批提交的前一个提交的哈希值(也就是这批提交中最早的那个提交的父提交)。你可以用git log --oneline查看简洁的提交历史,找到对应的哈希(比如abc123)。然后运行:git rebase -i abc123第三步:选择要压缩的提交
运行命令后会弹出文本编辑器,里面列出了abc123之后的所有提交。把你想压缩的提交前面的pick改成squash(或缩写s),只保留第一个提交的pick(这个提交的信息会作为合并后的提交基础)。举个例子:pick abc123 这是要保留的基础提交标题 squash def456 要压缩的第一个提交 squash ghi789 要压缩的第二个提交保存并退出编辑器即可。
第四步:修改合并后的提交信息
接下来会弹出第二个编辑器,让你编辑合并后的最终提交信息。你可以把原来的多个提交信息整合成一个(比如用当初MR的标题),编辑完成后保存退出。第五步:强制推送到远程仓库
因为我们修改了Git的历史记录,普通推送会被拒绝,所以需要用强制推送。这里推荐用--force-with-lease,它比直接--force更安全,能避免意外覆盖其他人的提交:git push origin master --force-with-lease
重要注意事项
- 如果团队里有其他成员已经拉取了旧的master分支,他们需要重新基于新的master分支做变基:
过程中如果遇到冲突,需要手动解决后继续变基。git checkout 他们的开发分支 git rebase origin/master - 操作前确保本地没有未提交的修改,可以用
git stash临时保存,操作完成后再恢复。 - 如果这些未压缩的提交已经被其他分支合并,修改历史可能会带来更多冲突,建议先评估影响再操作。
内容的提问来源于stack exchange,提问作者bloub




