我不小心提交了一些可能是git中的感性信息(只在本地),我想以简单的方式将它从git历史中删除。将确实git重置删除历史?
git reset --soft HEAD~1
然后取消有感知的信息,并添加到gitignore足以完全从git历史中删除它?
我不小心提交了一些可能是git中的感性信息(只在本地),我想以简单的方式将它从git历史中删除。将确实git重置删除历史?
git reset --soft HEAD~1
然后取消有感知的信息,并添加到gitignore足以完全从git历史中删除它?
不,软复位是不够的。 这样做会将文件保留在索引中(您要在其中放置要提交的文件)。这意味着,git仍在跟踪文件。
你会想要做一个混合重置,它也将这些文件分开。正如René指出的那样,删除文件或将其添加到您的.gitignore
也是一个好主意,因此您不会意外重新提交它。
这足够让敏感信息不会传输到git push
上的远程服务器。
但是,该信息仍在您的本地存储库中。如果您通过意外重置太远而“松动”提交,git reflog是一个非常有用的工具。
我们清洁所有了所有提交,所有不可通过一个分支或标记:
git reflog expire --expire=1.minute --all
git prune
git gc
reflog expire
和prune
是破坏性操作。我建议首先使用--dry-run
参数运行这些命令,以查看究竟删除了什么。
不需要--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"
git reset --soft HEAD~1
仅重置HEAD
以前的承诺,而指数和工作目录没有被触及。
这意味着索引和工作目录仍然反映了包含敏感信息的状态。只需从索引git reset HEAD <file>...
中删除这些文件并再次提交。
从索引中删除敏感数据文件后,它们将保留在工作目录中。也许你还想从工作目录中删除它们或将它们添加到.gitignore
。
编辑
你的意思是我应该先混帐重置--soft HEAD〜1,然后混帐复位HEAD?
是。通常情况下,您将文件git add ..
放置然后提交它们。如果您执行git reset --soft HEAD~1
,那么您的存储库会反映该提交之前的状态。如果您执行git status
,则可以看到此内容。所以你可以修改索引并重新提交。
此外,这是否从git历史中删除数据100%?
不,不完全。如果提交不再被引用,git会在90天后删除它(默认值 - 请参阅git gc
)。如果你想立即删除它,你必须确保它不再被引用。因此,您必须从任何包含它的reflog中删除它,例如git reflog --delete [email protected]{3}
。通常,它将包含在HEAD
和您的分支的reflog中。还要确保它不包含在任何分支中,例如如果提交如果是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/。
你的意思是我应该先做git reset --soft HEAD〜1然后git reset HEAD
为什么我的示例不够? git reset HEAD从历史记录中删除文件,不是吗?这还不够吗? –
Mattias
@Mattias'git reset HEAD -'只重置一个文件,但不会更改当前提交(其中仍包含敏感文件)。你可以在没有你的文件的情况下进行新的提交,但是历史记录(以前的提交)仍然会引用敏感文件。要真正将其从历史中删除,您需要重做以前的提交,而不仅仅是文件。 –
VonC
如果我执行'git reset --soft HEAD〜1',它会重置为前一个提交(提交之前的那个提交),然后执行'git reset HEAD -',这将删除感应文件从git索引,我不会得到完全相同的结果,通过执行'git reset HEAD〜1'除了我保留索引中的所有非检测文件吗? –
Mattias