git-如何还原上一次提交并将其从历史记录中删除?

我做了一次提交并回复了

git revert HEAD^

只是git log

➜  git:(master) git log
commit 45a0b1371e4705c4f875141232d7a97351f0ed8b
Author: Daniel Palacio <danpal@gmail.com>
Date:   Tue Jan 17 16:32:15 2012 -0800

    Production explanation

但是,如果我执行git log,它仍然会显示出来。 我需要将其从历史记录中删除,因为它包含敏感信息

git log --all
commit 5d44355080500ee6518f157c084f519da47b9391
Author: Daniel Palacio
Date:   Tue Jan 17 16:40:48 2012 -0800

    This commit has to be reset

commit 45a0b1371e4705c4f875141232d7a97351f0ed8b
Author: Daniel Palacio 
Date:   Tue Jan 17 16:32:15 2012 -0800

    Production explanation

如何从历史记录中删除提交5d44355080500ee6518f157c084f519da47b9391?

daniel asked 2020-01-25T01:13:21Z
5个解决方案
54 votes

首先,这里的错误命令是git reset --hard HEAD^。 这将创建一个新的提交,以还原较旧的提交。 那不是你要的。 其次,您似乎想要还原HEAD而不是HEAD^

如果您没有在任何地方推送此信息,则可以使用git reset --hard HEAD^丢弃最新的提交(这也将丢弃所有未提交的更改,因此请确保您没有要保存的更改)。 假设您对副本中存在的敏感信息感到满意,而其他人都不知道,那么您就完成了。 您可以继续工作,随后的git push将不会推动您的错误提交。

如果这不是一个安全的假设(尽管我不想听到为什么),那么您需要使您的reflog过期并强制执行立即收集所有未完成对象的垃圾收集。 你可以这样做

git reflog expire --expire=now --expire-unreachable=now --all
git gc --prune=now

尽管只有在您确实需要这样做时才可以这样做。


如果您已提交承诺,那么您很不走运。 您可以进行强制推送以远程还原它(尽管只有在远程端允许的情况下),但是您不能从远程端的数据库中删除提交本身,因此有权访问该存储库的任何人都可以找到它 知道要寻找什么。

Lily Ballard answered 2020-01-25T01:14:04Z
37 votes

如果您不在乎提交,请执行以下操作:

git reset --hard HEAD~

吹走提交。

如果要将更改保存在工作目录中,请执行以下操作:

git reset HEAD~

根据您对git revert所做的操作,可能必须更改以上命令。 还原创建一个新的提交,该提交将还原您要还原的提交。 因此,将有两次提交。 您可能必须执行HEAD~2才能将它们都删除。

请注意,通常,还原是更安全地还原更改的方法。 但是在这里,由于要删除敏感数据,因此重置是最好的方法。

manojlds answered 2020-01-25T01:14:42Z
8 votes

这里有一个很好的解决方案。要删除最后一个(顶部)提交,您可以执行

git push [remote] +[bad_commit]^:[branch]

其中[bad_commit]是[branch]当前指向的提交,或者如果[branch]在本地检出,您也可以执行

git reset HEAD^ --hard
git push [remote] -f
dyrssen answered 2020-01-25T01:15:06Z
6 votes

如果您尚未推送提交,则可以:

git reset --hard HEAD〜2

(HEAD〜2删除原始提交和“还原”提交)。

这会将您当前的分支重置为要删除的提交之前的历史记录。 如果该提交不在任何其他分支中,则它将不会被推送到您的来源。

Bruno Oliveira answered 2020-01-25T01:15:40Z
1 votes

这是一个从远程删除最后一个提交的简单工作解决方案:

  1. 克隆存储库并找到最后一个“良好”提交(.... c407)
git push origin --delete dev_branch
git push origin temp_branch:dev_branch
  1. 签出对新临时分支的最后一次提交
git push origin --delete dev_branch
git push origin temp_branch:dev_branch
  1. 替换远程分支(通过删除并推动temp)
git push origin --delete dev_branch
git push origin temp_branch:dev_branch
chenchuk answered 2020-01-25T01:16:26Z
translate from https://stackoverflow.com:/questions/8903953/how-to-revert-last-commit-and-remove-it-from-history