如何恢复上次提交并将其从历史记录中删除?

daniel 52 git git-revert

我做了一个提交并且还原了

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 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?

Lily Ballard.. 56

首先,这git revert是错误的命令.这会创建一个新的提交,以恢复旧的提交.这不是你要求的.其次,看起来你想恢复HEAD而不是HEAD^.

如果你没有把它推到任何地方,你可以git reset --hard HEAD^用来丢弃最新的提交(这也会丢弃任何未提交的更改,所以请确保你没有任何你想保存的).假设您对副本中没有其他人的敏感信息感到满意,那么您已经完成了.你可以继续工作,后续git push不会推动你的错误提交.

如果这不是一个安全的假设(虽然如果不是我喜欢听到原因),那么你需要使你的reflog过期并强制收集现在收集所有未完成对象的垃圾收集.你可以这样做

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

虽然只有你真的绝对需要这样做才能做到这一点.


如果你已经推你的承诺,那么你就非常不走运的.您可以执行强制推送以远程还原它(尽管只有远程端允许),但您无法从远程端的数据库中删除提交本身,因此任何有权访问该存储库的人都可以找到它知道要找什么.

  • 当然,如果*你*有文件系统访问遥控器,你可以简单地清理它,就像你做本地一样. (2认同)
  • @Denji假设你没有把它推到任何地方,你可以使用`git rebase`来删除历史记录中的提交.有很多关于这方面的文档,包括在联机帮助页中.专门查看`--onto`标志.请注意,如果您的合并提交比您尝试删除的提交更新,那么事情会变得复杂得多. (2认同)

manojlds.. 37

如果您不关心提交,只需执行以下操作:

git reset --hard HEAD~

吹走提交.

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

git reset HEAD~

根据您的操作git revert,您可能需要更改上述命令.Revert创建一个新的提交,恢复您想要还原的提交.所以会有两个提交.您可能需要HEAD~2删除它们.

请注意,通常,还原是一种更安全的方法,可以还原更改.但在这里,由于您要删除敏感数据,因此重置是最佳方法.


小智.. 8

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

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

[bad_commit]是[branch]当前指向的提交,或者[branch]是否在本地签出,你也可以做

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


Bruno Olivei.. 6

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

git reset --hard HEAD~2

(HEAD~2删除原始提交和"恢复"提交).

这会在您要删除的提交之前将当前分支重置为历史记录中的某个点.如果该提交不在任何其他分支中,则不会将其推送到您的原点.

  • 事实并非如此,从那时起,提交将不会成为您当前分支的一部分,并最终将被git gc删除.如果您想立即删除提交,可以使用git gc立即修剪,或者再次克隆存储库; 克隆存储库时,只有某个分支可以访问的提交才是克隆. (2认同)