Git恢复上次提交并将其从历史logging中删除

我做了一个承诺,并回复

git revert HEAD^ 

只是git日志

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

但是,如果我做git日志 – 所有它仍然显示。 我需要从历史中删除它,因为它有敏感的信息

 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 revert在这里是错误的命令。 这将创build一个新的提交,恢复较旧的提交。 这不是你要求的。 其次,它看起来像要恢复HEAD而不是HEAD^

如果你还没有把它推到任何地方,你可以使用git reset --hard HEAD^来丢弃最新的提交(这还会抛出未提交的更改,因此请确保没有任何要保存的内容)。 假设你可以确定你的副本中没有其他敏感信息,那么你就完成了。 你可以继续工作,随后的git push不会推动你的错误提交。

如果这不是一个安全的假设(虽然如果不是,我很想听听为什么),那么你需要过期你的reflogs,并强制垃圾收集,现在收集所有未完成的对象。 你可以这样做

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

虽然这只能做,如果你真的需要这样做。


如果你推动了你的提交,那么你几乎没有运气。 您可以执行强制推送来远程恢复它(尽pipe只有在远程端允许的情况下),但是您不能从远程端的数据库中删除提交本身,所以任何有权访问该存储库的人都可以find它知道要寻找什么。

如果你不关心这个提交,只需要:

 git reset --hard HEAD~ 

吹走这个承诺。

如果您希望更改位于工作目录中,请执行以下操作:

 git reset HEAD~ 

根据你使用git revert所做的事情,你可能不得不改变上面的命令。 Revert创build一个新的提交,恢复您想要恢复的提交。 所以会有两个提交。 你可能需要做HEAD~2来删除它们。

请注意,通常情况下,恢复是更安全的方式,以恢复更改。 但是在这里,因为你想删除敏感数据,重置是最好的方法。

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

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

其中[bad_commit]是[分支]当前指向的提交,或者如果[分支]在本地签出,您也可以

 git reset HEAD^ --hard git push [remote] -f 

如果你还没有推送提交,你可以:

git reset –hard HEAD〜2

(HEAD〜2删除你原来的提交和你的“还原”提交)。

这将重置您的当前分支到您想要删除的提交之前的历史点。 如果该提交不在其他分支中,则不会被推送到您的原点。