如何删除具有相同时间戳的重复Git提交?
删除Git中同时间戳的重复提交(保留原历史)
第一步:定位重复提交
先通过日志明确哪些提交是重复的(同时间戳),执行以下命令查看提交的短哈希、时间戳和提交信息:git log --pretty=format:"%h %ad %s" --date=iso
输出里会显示所有提交,你可以快速找出时间戳完全相同的重复项,记录下需要保留的提交哈希以及要删除的重复项哈希。
方法一:用git filter-branch批量清理重复提交
这种方法适合大量重复提交的场景,会自动保留每个时间戳的第一个提交,跳过后续重复项:
先备份当前分支(重要,防止操作失误丢失历史):
git branch backup-duplicate-fix执行过滤命令,自动跳过同时间戳的重复提交:
git filter-branch --commit-filter ' # 获取当前提交的时间戳 current_ts=$(git show -s --format="%ad" $GIT_COMMIT) # 检查是否存在其他同时间戳的提交 duplicate_exists=$(git log --all --grep="$current_ts" --pretty=format:"%h" | grep -v $GIT_COMMIT) if [ -z "$duplicate_exists" ]; then # 无重复则保留提交 git commit-tree "$@" else # 有重复则跳过该提交 skip_commit "$@" fi ' HEAD
- 清理filter-branch生成的临时文件:
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -dgit reflog expire --expire=now --allgit gc --prune=now
方法二:交互式变基手动删除(适合少量重复提交)
如果你更倾向手动选择要删除的提交,可使用交互式变基:
找到重复提交范围的起始父提交(比如最早出现重复提交的前一个提交哈希,假设为
abc123):git rebase -i abc123在弹出的编辑器中,找到所有重复的提交(同时间戳的),将它们前面的
pick改为drop,只保留每个时间戳对应的一个提交。保存退出编辑器,Git会自动执行变基,删除标记为
drop的提交。
注意事项
- 如果当前分支已经推送到远程仓库,修改历史后需要执行强制推送:
git push -f,但务必提前告知协作的团队成员,避免冲突。 - 操作前一定要确认备份分支可用,若操作出错可通过
git checkout backup-duplicate-fix恢复。
内容的提问来源于stack exchange,提问作者ᴜsᴇʀ
相关产品推荐
相关产品推荐

