Git - 从历史记录中删除提交

Ser*_*scu 23 git git-commit

我做了一件非常愚蠢的事.我在代码中输入了一个curseword,然后将代码推送到master分支上.之后我又推了几次,所以人们不会把坏东西拉出来,但我仍然可以在提交历史中找到这个诅咒词.

有没有办法从历史记录中删除提交?编辑:我不想将文件添加到gitignore,因为我们需要该文件.

谢谢

Nut*_*ker 36

这对我有用:

  1. git log 找到要删除的提交并复制其哈希
  2. git rebase -i <commit_hash>~ 这将打开您的文本编辑器
  3. 在文本编辑器中,从 切换pickdrop您的特定提交

  • 使用显式删除比仅删除该行更安全......这比接受的答案更好。/sf/ask/2509230811/ (11认同)
  • 这似乎只适用于没有推送的本地提交。 (3认同)
  • 您能详细说明一下尾部波浪号的重要性吗? (3认同)
  • @Timo就命令执行而言,即使本地提交已被推送,此解决方案也是正确的,为此必须强制推送(push -f)。但是,团队的工作流程很可能会阻止此操作,因为它可能会给团队带来麻烦。 (2认同)
  • 我必须在要删除的提交之前先进行一次提交哈希,才能在 vim 编辑器中查看该提交。 (2认同)

Dav*_*sch 24

一旦你推动回购,你真的不想改变历史.但是,如果您完全确定自从您的违规提交以来没有人从回购中提取/取出,您有2个选项.

如果要完全删除提交(以及之后的每个提交),请执行git reset --hard ABC~(假设提交的哈希值ABC).然后做一个git push -f.

如果您只想编辑该提交,并保留其后的提交,请执行git rebase -i ABC~.这将启动您的编辑器,显示您的提交列表,从违规提示开始.将标志从"选择"更改为"e",保存文件并关闭编辑器.然后对文件进行必要的更改git commit -a --amend,然后执行,然后执行git rebase --continue.跟着它一起来git push -f.

我想重申一下,如果没有人进行包含违规提交的提取或提取,这些选项只适用于您.如果他们有,那么做这些步骤只会让事情变得更糟.

  • 如果 ```git rebase --continue``` 或 ```git push -f``` 给你一个错误;检查:/sf/ask/2133009021/也有帮助:https://www.clock.co。英国/insight/删除-a-git-commit (3认同)
  • 刚刚错误地将我的私人电子邮件暴露在新创建的存储库中。唷,这拯救了我的神经,谢谢。 (2认同)
  • 您还可以使用“--force-with-lease”标志而不是“--force”,这样您就可以确保您不会覆盖其他人的工作 (2认同)

Mac*_*bły 5

如果仅在本地PC上(或没有人签出您的更改):

1)使用:

git日志

查找要删除的提交。复制哈希(较长的时间:e8348ebe553102018c ...)。

2)使用:

git rebase -i your_commit_hash_code_comes_here

只需删除不需要的提交并保存文件即可。

交互式git rebase还可让您修复损坏的提交-无需删除它。

如果您将更改推送到服务器或某人已经进行了更改-永远不要更改历史记录-这会给您的团队带来严重的问题。

  • 您能详细说明一下这会造成什么严重问题吗?它一定会发生吗? (5认同)
  • 我想对答案做一处更正。您应该复制要删除的哈希的一步父哈希,而不是复制要删除的哈希,只有这样您才能删除要删除的哈希。 (4认同)
  • 抱歉,“从不”是不正确的。我们的大型组织必须使用过滤器分支来修剪臃肿的存储库。 (2认同)

Ali*_*een 5

我最近与一个团队合作,发现 git 有解决方案

全部在此链接上

https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository

正在使用git-filter-repo BFG Repo-Cleaner

这是一个很酷的视频

https://www.youtube.com/watch?v=z8tIOYg_oho