我在我的代码中输入了一个脏话并将代码推到主分支。之后我又推送了几次,以便人们不会拉取到那些坏的东西,但是我仍然可以在提交历史记录中找到那个脏话。
我不想将该文件添加到.gitignore
中,因为我们需要它。
有没有办法从历史记录中删除该提交记录?
我在我的代码中输入了一个脏话并将代码推到主分支。之后我又推送了几次,以便人们不会拉取到那些坏的东西,但是我仍然可以在提交历史记录中找到那个脏话。
我不想将该文件添加到.gitignore
中,因为我们需要它。
有没有办法从历史记录中删除该提交记录?
当你推送提交到代码库后,你真的不想去改变历史记录。但是,如果你绝对确定没有人在你提交问题之后从代码库中拉取或获取过任何内容,你有两个选项。
如果你想完全删除这个“坏”的提交(以及之后的每一个提交),请执行git reset --hard ABC
命令(假设ABC
是“坏”提交的前一个兄弟提交的哈希值-你希望将其作为该分支的新头部提交)。然后执行git push --force
(或 git push -f
)命令。
如果你只想编辑该提交,同时保留之后的提交,请执行git rebase -i ABC~
命令。这将启动你的编辑器并显示包含有关提交列表的信息,从有问题的提交开始显示。将标志从“pick”更改为“e”,保存文件并关闭编辑器,然后对文件进行必要的更改,并执行git commit -a --amend
命令,接着执行git rebase --continue
命令。最后运行git push -f
命令。
我要重申,只有在没有任何人使用包含你有问题的提交的拉取或获取操作时,才能使用这些选项。如果有人已经执行了这样的操作,执行这些步骤只会使情况更加恶化。
git rebase --continue
或者 git push -f
给出了错误提示,请查看以下链接:
https://dev59.com/qV0a5IYBdhLWcg3wVHMm#30471627
此外,以下链接也可能会有帮助:
https://www.clock.co.uk/insight/deleting-a-git-commit - Sagar Patel--force-with-lease
标志代替--force
,这样你就可以确保不会覆盖其他人的工作。 - K Dgit log
查找您要删除的提交。复制哈希值(长序列,例如:e8348ebe553102018c...)。
git rebase -i [hash]~
: for example
git rebase -i e8348~
只需要删除不需要的提交并保存文件即可。
互动式git rebase还可以让您修复损坏的提交-无需删除它。
如果您已将更改推送到服务器或其他人已获取了您的更改-请勿更改历史记录-这会给您的团队带来严重问题。
git log
查找要删除的提交并复制其哈希值git rebase -i <commit_hash>~
打开文本编辑器pick
切换到 drop
drop
命令比仅仅删除行要更安全...这使它比被接受的回答更好。https://dev59.com/OVsV5IYBdhLWcg3wuxCM - Ray Foss我最近和一支团队合作,发现Git有解决这个问题的方案
具体请参考以下链接
其中使用了git-filter-repo
和BFG Repo-Cleaner
以下是一个很酷的视频,详细讲解如何操作