如何压缩Git中的多个合并提交?我的操作出现异常
解决合并提交压缩的问题
首先,你用git rebase -i HEAD~3看不到那两个合并提交是正常的——因为默认的交互式变基(rebase)会自动忽略合并提交,它的默认行为是把历史线性化,不会保留合并结构,所以合并提交不会出现在待编辑的列表里。不过别担心,咱们是可以压缩这类合并提交的,只要调整一下rebase的参数就行。
下面是具体的操作步骤:
- 确保当前在目标分支:先确认你正处于
uiTests分支,执行git branch查看,不是的话切换过去。 - 执行带合并处理的交互式变基:用这个命令代替原来的指令:
加上git rebase -i --rebase-merges HEAD~3--rebase-merges参数后,Git就会把合并提交也包含到交互式编辑的列表里了。 - 修改提交指令:弹出编辑器后,你会看到那两个合并提交(70db4de和5b7a827)以及ef5dfc2的条目。把两个合并提交行开头的
merge改成squash或者fixup:- 用
squash:会保留这两个合并提交的提交信息,最后可以编辑成一个统一的信息; - 用
fixup:会直接丢弃这两个合并提交的信息,只用ef5dfc2的提交信息。
调整完后保存退出编辑器。
- 用
- 处理可能的冲突:如果变基过程中出现冲突,先手动解决文件里的冲突标记,然后执行
git add .,再用git rebase --continue继续变基流程。 - 强制推送到远程分支:因为你修改了本地的提交历史,需要强制覆盖远程的分支(注意:只在你自己的fork分支上这么做,不要推上游仓库):
git push -f origin uiTests
另外,还有一个更简单的替代方法:
直接用git reset --soft ef5dfc2,这个命令会把ef5dfc2之后的所有提交修改都放到暂存区,然后你执行git commit --amend,就能把这些修改合并到ef5dfc2的提交里,最后同样强制推送即可。不过这个方法看不到每个合并提交的具体内容,适合你确定所有修改都没问题的情况。
需要注意的是,强制推送前一定要确保没有其他协作者在你的uiTests分支上工作,否则会覆盖他们的修改。
内容的提问来源于stack exchange,提问作者Padmal
相关产品推荐
相关产品推荐

