簡體   English   中英

我從 'detached HEAD' 狀態返回並且 git 從本地目錄中刪除了我的 .env 文件

[英]I return from 'detached HEAD' state and git deleted my .env file from the local directory

我正在檢查我的提交歷史以修復錯誤。 我使用git checkout 4a3cf4ebfc8c3d4a7f8b055b3f38cc90acf2a0cd在提交之間切換。 我處於 - 'detached HEAD' state

在那種狀態下,我使用一些命令,如: git add . git commit -m "massage"然后我通過git checkout e255fb94e967c4c1463c25e44090bfc5a40b8463切換不同的提交。

我使用以下命令從“分離的 HEAD”狀態返回: git checkout master

現在,我的.env文件從本地目錄中消失了。

我正在創建一個反應應用程序。 我正在使用.gitignore文件來忽略.env文件中的 API 密鑰。

考慮到一些特殊情況(這里一定是這種情況),這是正常的。

我們從以下事實開始:

  • Git 存儲提交 Git 不存儲文件,也不存儲分支,而是整個提交。 (每個提交確實存儲文件,但您一次處理整個提交。分支名稱可以幫助您和 Git找到提交,因為提交編號看起來很隨機。)

  • 每個提交都有一個唯一的編號,它看起來是隨機的,但不是:它是提交的哈希 ID。 哈希 ID 實際上是提交內容的加密校驗和。 任何提交的任何部分都不能更改。

  • 每個提交實際上存儲兩件事:快照——所有文件的完整集合——和一些元數據。 整個提交完全是只讀的,而所有提交的文件存儲在只讀的,針對Git只,壓縮和去重復的形式。

  • 這反過來意味着您實際上無法處理提交中的文件。 您看到和使用的文件某個提交中復制到 Git 稱為您的工作樹工作樹的區域中

  • 因此git checkout命令,當給定像master這樣的名稱或像e255fb94e967c4c1463c25e44090bfc5a40b8463這樣的原始提交哈希時,必須將存儲(永遠)在該提交中(但不能被 ReactJS 等程序使用)的文件復制到您的工作樹中(它們可以ReactJS 之類的程序使用)。

這意味着您在工作樹中看到和使用的文件實際上並不Git 中。 它們只是來自 Git 中某個提交的文件的副本。

現在,假設您的master分支的最后一次提交是a123456... 我編造了哈希 ID,但我們可以確定無論實際的哈希 ID 是什么,它都不是e255fb94e967c4c1463c25e44090bfc5a40b8463 所以你的 Git 在里面有兩個不同的提交

  • e255fb94e967c4c1463c25e44090bfc5a40b8463 :這個提交中有一個.env文件

  • a123456... :此提交中沒有.env文件

當您檢出提交e255fb94e967c4c1463c25e44090bfc5a40b8463 ,Git 必須將保存的.env文件提取到您的工作樹中。

當您切換回a123456... ,Git 必須刪除已保存的.env文件以使其.env

我正在使用 .gitignore 文件來忽略 .env 文件中的 API 密鑰。

不幸的是, .gitignore文件實際上並沒有告訴 Git 忽略文件。 它不能:提交e255fb94e967c4c1463c25e44090bfc5a40b8463.env文件,並且任何現有提交的任何部分都不能更改。

因此,當您提取提交e255fb94e967c4c1463c25e44090bfc5a40b8463 ,Git 會從該提交中復制.env文件(到 Git 的索引暫存區域以及您的工作樹中)。 如果您的.env文件中包含有價值的數據,則此復制過程可能會破壞有價值的數據。

通常,當git checkout可能會破壞文件的內容時,Git 會警告您這一點,並拒絕執行git checkout直到您將這些文件內容保存在其他地方。 不幸的是,在.gitignore中列出文件的副作用之一是它有時(不總是,但有時)授予 Git 銷毀文件內容的權限。

不過,或許在.env你有這樣的文件內容你的工作樹,但不是在犯a123456... ,匹配在提交內容e255fb94e967c4c1463c25e44090bfc5a40b8463 如果是這種情況git checkout e255fb94e967c4c1463c25e44090bfc5a40b8463將內容保留在原處,實際上並沒有破壞任何東西。 不幸的是,當切換回來時,Git 仍會刪除該文件,但此時您可以指示 Git 從該特定提交中檢索該特定文件的內容:

git show e255fb94e967c4c1463c25e44090bfc5a40b8463:.env > .env

例如。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM