Git filter-branch
使用 git filter-branch –commit-filter 重写历史记录可能会导致数据丢失。这个命令允许你在Git存储库的历史记录中进行修改,应用一个自定义的 commit 过滤器。当你使用这个命令时,请务必小心操作,因为它会改变存储库的历史记录。
在执行前,建议先进行备份,以确保你有一个完好的历史记录备份。另外,这个命令可能会导致一些副作用,如更改提交哈希值、移除或合并提交、删除部分文件等。
因此,在执行 git filter-branch 之前,请确保你已经理解了它的工作原理,并且在执行前考虑了潜在的风险。如果你不确定自己在做什么,建议先创建一个分支进行实验,以避免意外破坏存储库的历史记录。
删除 README.md 和 docs/docker_build.md 两个文件,并清理所有产生的提交
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch README.md docs/docker_build.md' --prune-empty --tag-name-filter cat -- --all
删除指定编号的提交信息
使用 git log --oneline
命令查询到要删除提交
git log --oneline | grep Update
ed2e2a7 [feat]:[][Update docs/场景梳理.xlsx]
2a919eb [feat]:[][Update docs/场景梳理.xlsx]
记录要删除的提交短 ID 到以下脚本的 DEL_COMMIT_IDS=['ed2e2a7','a919eb']
位置
git filter-branch --force --commit-filter 'DEL_COMMIT_IDS=['ed2e2a7','a919eb']; if [[ $DEL_COMMIT_IDS =~ ${GIT_COMMIT:0:7} ]]; then skip_commit "$@"; else git commit-tree "$@"; fi' HEAD
执行后可以看到 Ref 'refs/heads/master' was rewritten
表示已经重写了历史记录,然后再用 git log --oneline
查看可以看到已经删除