如何合并两个Git历史提交并强制推送?移除提交敏感信息
清理Git提交历史中的敏感信息并合并提交
可以实现。你需要用交互式变基重新构建提交历史,既能把B和C合并为提交F,又能保留后续的D、E提交。具体步骤如下:
确保当前处于
develop分支(题目已说明本地分支干净且与远程一致,可直接操作):git checkout develop启动交互式变基,目标是从提交A之后的提交开始修改(A是B的父提交,你可以用A的哈希值,或者用相对引用
HEAD~4,因为从E往前数4个提交就是A):git rebase -i <A的哈希值> # 或者用相对引用:git rebase -i HEAD~4在弹出的文本编辑器中,会显示按从旧到新排列的提交列表:
pick xxxxxxx B的提交信息 pick yyyyyyy C的提交信息(清除敏感信息的提交) pick zzzzzzz D的提交信息 pick aaaaaaa E的提交信息将C对应的那行的
pick改成squash(或缩写s),修改后如下:pick xxxxxxx B的提交信息 squash yyyyyyy C的提交信息(清除敏感信息的提交) pick zzzzzzz D的提交信息 pick aaaaaaa E的提交信息要是不想编辑合并后的提交信息,也可以改成
fixup(或缩写f),Git会直接保留B的提交信息,最终提交F的内容是C的状态(已清除敏感信息)。保存并关闭编辑器,Git会自动将B和C合并为一个新提交,然后把D、E提交重新应用到这个新提交之后。此时本地
develop的历史就变成了A - F - D - E。最后强制推送到远程仓库(题目允许强制推送):
git push -f origin develop
注意事项
- 强制推送后,其他协作者需要更新本地的
develop分支,建议他们执行:
避免本地旧历史与远程新历史冲突。git fetch origin git reset --hard origin/develop - 你之前用
git reset --soft <B的哈希>的方法不可行,因为这个操作会把HEAD移到B,后续的C、D、E会变成游离提交,导致历史丢失;而交互式变基是重新构建提交链,能保留后续的D、E提交。
内容的提问来源于stack exchange,提问作者Hao Wu
相关产品推荐
相关产品推荐

