61

我做了一个提交并恢复了

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 --all 它仍然会出现。我需要将其从历史记录中删除,因为它包含敏感信息

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 ?

4

5 回答 5

68

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

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

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

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

尽管只有在您确实绝对需要时才应该这样做。


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

于 2012-01-18T01:33:03.193 回答
46

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

git reset --hard HEAD~

吹走提交。

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

git reset HEAD~

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

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

于 2012-01-18T01:35:26.297 回答
13

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

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

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

git reset HEAD^ --hard
git push [remote] -f
于 2016-01-22T16:07:57.040 回答
8

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

git reset --hard HEAD~2

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

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

于 2012-01-18T01:34:45.700 回答
3

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

  1. 克隆 repo 并找到最后一个“好”提交 (....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
于 2018-07-26T06:06:56.597 回答