使用git filter-repo并合并后出现重复提交的解决方法
清理重复提交与敏感文件的实操方案
1. 先做仓库备份,避免翻车
不管后续操作怎么搞,先把当前仓库完整备份,防止操作失误丢数据:
git clone --mirror https://github.com/benvessely/brevets brevets-backup
2. 先搞清楚要留哪些提交
你需要先明确:从4aa07到a3dee之间,哪些提交是不含credentials.ini的(这些是要保留的),哪些是带敏感文件的重复提交(要删掉的)。
用下面的命令快速排查提交内容:
# 查看这段区间所有提交的文件变更 git log --name-status 4aa07..a3dee # 单独检查某提交是否包含敏感文件 git show <提交哈希>:credentials.ini
3. 两种清理方式选其一
方式一:交互式变基(适合分支结构简单的情况)
如果重复提交的数量不多,用变基直接删掉不需要的提交:
git rebase -i 4aa07^
弹出编辑器后:
- 找到所有带
credentials.ini的提交,把行首的pick改成drop(直接删) - 对于内容完全一致的重复提交,只保留不含敏感文件的那个,另一个同样用
drop删掉
变基完成后,强制推送到远程(注意:这会改写远程历史,必须提前跟团队成员打个招呼,让他们同步新历史):
git push --force-with-lease origin <你的分支名>
方式二:用git filter-repo彻底清理(适合复杂分支结构)
如果变基搞不定复杂的分支,就用filter-repo再扫一遍,同时干掉重复提交:
- 先移除所有涉及
credentials.ini的提交:
git filter-repo --invert-paths --path credentials.ini
- 接着删掉内容完全重复的提交:
git filter-repo --remove-duplicates
完成后同样强制推送:
git push --force-with-lease origin <你的分支名>
4. 验证清理结果
做完操作后,一定要确认历史干净了:
# 检查有没有敏感文件的残留痕迹 git log --all --grep="credentials.ini" git log --all --name-status | grep "credentials.ini" # 看提交图有没有异常分支 git log --graph --oneline
重要提醒
- 强制推送会改写远程仓库的历史,所有协作的人必须重新拉取新的仓库历史,基于新分支开发,不然会出现大量冲突。
- 如果远程仓库开了分支保护,得先临时关掉才能执行强制推送。
内容的提问来源于stack exchange,提问作者Ben Vessely
相关产品推荐
相关产品推荐

