我不小心提交了一些可能是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