我不小心提交了一些可能是git中的感知信息(仅在本地),我想以简单的方式将其从git历史中删除。将
git reset --soft HEAD~1
然后取消分析感知信息并添加到gitignore就足以将其从git历史中完全删除了?
答案 0 :(得分:2)
不需要--soft
:git 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/。