git重置删除历史记录?

时间:2015-08-24 06:07:58

标签: git security github

我不小心提交了一些可能是git中的感知信息(仅在本地),我想以简单的方式将其从git历史中删除。将

git reset --soft HEAD~1

然后取消分析感知信息并添加到gitignore就足以将其从git历史中完全删除了?

2 个答案:

答案 0 :(得分:2)

不需要--softgit reset HEAD~1将通过重置索引以及移动HEAD来取消暂存当前提交文件。

然后.gitignore就足以忽略该文件了。

  

您的意思是我应该先git reset --soft HEAD~1然后git reset HEAD <file>吗?

不,您需要删除所有提交以确保历史记录不包含您的敏感文件。

git reset HEAD~1
echo sensitiveFile >> .gitignore
git add .gitignore
git add -A .
git commit -m "Redo commit, without sensitiveFile"

答案 1 :(得分:2)

git reset --soft HEAD~1仅重置前一次提交的HEAD,而未触及索引和工作目录。

这意味着索引和工作目录仍然反映包含敏感信息的状态。只需从索引git reset HEAD <file>...中删除这些文件并再次提交。

从索引中删除敏感数据文件后,它们将保留在工作目录中。也许您还想从工作目录中删除它们或将它们添加到.gitignore

修改

  

你是说我应该先做git reset --soft HEAD~1然后git reset HEAD?

是。通常,您将文件git add ..暂存,然后提交它们。如果您执行git reset --soft HEAD~1,则您的存储库会反映该提交之前的状态。如果您执行git status,则可以看到此信息。所以你可以修改索引并再次提交。

  

此外,这是否会从git历史记录中删除100%的数据?

不,不完全。如果没有引用提交,git将在90天后删除它(默认值 - 请参阅git gc)。如果要立即删除它,必须确保不再引用它。因此,您必须从包含它的任何reflog中删除它,例如git reflog --delete HEAD@{3}。通常它将包含在HEAD和您的分支的reflog中。还要确保它不包含在任何分支中,例如如果提交if A执行git branch -a --contains A。输出必须为空。

然后你可以使用git gc --prune=now进行垃圾收集。使用git log -n1 COMMIT-ID检查是否已删除提交。它应该输出fatal: bad object

有关从git中删除文件和目录的详细信息,请查看我的博客https://www.link-intersystems.com/blog/2014/07/17/remove-directories-and-files-permanently-from-git/