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?
首先,这里的错误命令是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
尽管只有在您确实需要这样做时才可以这样做。
如果您已提交承诺,那么您很不走运。 您可以进行强制推送以远程还原它(尽管只有在远程端允许的情况下),但是您不能从远程端的数据库中删除提交本身,因此有权访问该存储库的任何人都可以找到它 知道要寻找什么。
如果您不在乎提交,请执行以下操作:
git reset --hard HEAD~
吹走提交。
如果要将更改保存在工作目录中,请执行以下操作:
git reset HEAD~
根据您对git revert
所做的操作,可能必须更改以上命令。 还原创建一个新的提交,该提交将还原您要还原的提交。 因此,将有两次提交。 您可能必须执行HEAD~2
才能将它们都删除。
请注意,通常,还原是更安全地还原更改的方法。 但是在这里,由于要删除敏感数据,因此重置是最好的方法。
这里有一个很好的解决方案。要删除最后一个(顶部)提交,您可以执行
git push [remote] +[bad_commit]^:[branch]
其中[bad_commit]是[branch]当前指向的提交,或者如果[branch]在本地检出,您也可以执行
git reset HEAD^ --hard
git push [remote] -f
如果您尚未推送提交,则可以:
git reset --hard HEAD〜2
(HEAD〜2删除原始提交和“还原”提交)。
这会将您当前的分支重置为要删除的提交之前的历史记录。 如果该提交不在任何其他分支中,则它将不会被推送到您的来源。
这是一个从远程删除最后一个提交的简单工作解决方案:
- 克隆存储库并找到最后一个“良好”提交(.... c407)
git push origin --delete dev_branch git push origin temp_branch:dev_branch
- 签出对新临时分支的最后一次提交
git push origin --delete dev_branch git push origin temp_branch:dev_branch
- 替换远程分支(通过删除并推动temp)
git push origin --delete dev_branch git push origin temp_branch:dev_branch