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

我做了一个承诺和恢复

git revert HEAD^

滚开

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

96305 次浏览

首先,git revert在这里是错误的命令。这将创建一个新的提交,并恢复一个旧的提交。这不是你想要的。其次,看起来您想要恢复 HEAD而不是 HEAD^

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

如果这不是一个安全的假设(如果不是,我很想知道为什么) ,那么您需要让重新日志过期,并强制执行一个垃圾收集,该垃圾收集立即收集所有未完成的对象。你可以用

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

不过这只有在你真的必须要做的时候才能做。


如果您的 推送您的提交,那么您就非常不走运了。您可以通过强制推送来远程恢复它(尽管只有在远程端允许的情况下) ,但是您不能从远程端的数据库中删除提交本身,所以任何有权访问该存储库的人都可以找到它,如果他们知道要查找什么的话。

如果您还没有推动提交,那么您可以:

Git 复位——硬磁头 ~ 2

(HEAD ~ 2删除原始提交和“恢复”提交)。

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

如果你不在乎承诺,那就去做:

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

下面是一个简单的工作解决方案,它可以删除远程提交的最后一个提交:

  1. 克隆回购并找到最后一个‘ good’提交(... . c407)
$ git clone git@host:PROJ/myrepo.git
$ cd myrepo
$ git log --pretty=oneline


234987fed789de97232ababababcef3234958723 bad_commit
e4a2ec4a80ef63e1e2e694051d9eb3951b14c407 v4.3
2f116449144dbe46e7260d5dac2304803751b5c2 v4.2
  1. 签出对新临时分支的最后一次良好提交
$ git checkout e4a2ec4a80ef63e1e2e694051d9eb3951b14c407
$ git checkout -b temp_branch
  1. 替换远程分支(通过删除和推送临时数据)
git push origin --delete dev_branch
git push origin temp_branch:dev_branch