压缩25个提交后,如何移除已合并的外部贡献者提交记录?
移除外部贡献者提交记录的解决方案
首先咱们先理清楚你当前的状况:你已经通过git reset --soft HEAD~25 + git commit把最近25个提交压缩成了自己的单个提交,但之前外部贡献者的提交记录还留在仓库历史(或reflog、远程仓库)里。下面分两种场景给你具体的解决办法:
场景1:贡献者的提交都在你刚压缩的25个提交里
这种情况下,你已经把他们的改动合并到了自己的新提交中,只是旧的提交记录还没被彻底清理:
清理本地仓库的旧提交记录
被reset掉的旧提交暂时存在Git的reflog里,默认会在90天后自动清理,但如果你想立刻移除:git reflog expire --expire=now --all git gc --prune=now这两条命令会强制Git清理所有过期的对象,包括那些被你压缩掉的旧提交。
覆盖远程仓库的历史(如果已经推送过旧提交)
如果之前你已经把那些包含贡献者提交的历史推送到了远程,需要用强制推送来覆盖:git push --force-with-lease <远程仓库名> <分支名>用
--force-with-lease比直接--force更安全,能避免不小心覆盖其他协作者的新改动。
场景2:贡献者还有更早的提交不在这25个里
如果这个贡献者的提交还分布在更早的仓库历史中,你需要彻底改写整个仓库的历史来移除他们的记录:
选项A:直接移除贡献者的所有提交(保留改动)
如果你已经把他们的改动都合并到了自己的提交里,可以用git filter-repo(Git官方推荐的历史改写工具,替代旧的git filter-branch)来跳过所有该贡献者的提交:
# 替换成贡献者的邮箱 git filter-repo --commit-callback 'if commit.author_email == b"contributor@example.com": commit.skip()'
选项B:把贡献者的提交作者信息替换成你的
如果你想保留这些提交的改动,但把作者信息改成自己的(这样历史里就看不到贡献者的记录了):
# 替换成你的名字、邮箱,以及贡献者的名字、邮箱 git filter-repo --mailmap <(echo "你的名字 <你的邮箱@example.com> 贡献者名字 <contributor@example.com>")
注意事项:
- 改写历史后,必须强制推送到远程:
git push --force-with-lease origin <分支名> - 所有克隆这个仓库的协作者都需要重新克隆仓库,或者执行
git fetch origin后git reset --hard origin/<分支名>来同步新的历史,否则会出现冲突。
内容的提问来源于stack exchange,提问作者valen ezu
相关产品推荐
相关产品推荐

