亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

恢復添加到索引但又被git reset刪除的文件

恢復添加到索引但又被git reset刪除的文件

Git
FFIVE 2019-12-04 13:14:23
我在索引中添加了一些文件,但隨后錯誤地使用刪除了它們git reset --hard。如何恢復它們?這是發生了什么:我使用添加了所有文件 git add .然后我承諾當我檢查狀態時,仍然有一些文件未包含在添加的提交中,這很奇怪我再次添加了未跟蹤的文件,這次可以正常工作了但是我希望一切都在一次提交中,所以我查看了如何取消剛剛提交的內容我曾經用過git reset --hard HEAD^-不好的主意,顯然所有文件都被刪除了所以我曾經git reflog找到我離開的地方然后我曾經git reflog ______回到我的最后一次提交。然后我曾經git reset HEAD取消對提交的暫存(本來應該完成的工作),但是提交后添加的文件(參見上文)仍然不存在。如何找回這些文件?
查看完整描述

2 回答

?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

首先,完整備份您的Git存儲庫!

當您git add創建文件時,git將從該文件的內容中創建一個Blob,并將其添加到其對象數據庫(.git/objects/??/*)中。

讓我們一一看一下您的命令:

我使用git add添加了所有文件。

$ git add .

這會將當前目錄及其子目錄中包含的所有文件添加到Git的對象數據庫中。.gitignore不會添加文件中與模式匹配的未跟蹤文件。樹文件也將被寫入。請看我答案的結尾。

然后我承諾

$ git commit -m'added all files'

這會將新的提交對象寫入對象數據庫。該提交將引用一棵樹。該樹引用Blob(文件)和其他樹(子目錄)。

當我檢查狀態時,仍然有一些文件未包含在添加的提交中,這很奇怪

$ git status

我可以想到發生這種情況的兩種情況:在您的文件后面添加了一些修改過的文件或添加了新文件。

我再次添加了未跟蹤的文件,這次可以正常工作了

$ git add .

我假設您add再次使用了與步驟1中相同的命令。

但是我希望一切都在一次提交中,所以我查看了如何取消剛剛提交的內容

我將在此答案的結尾告訴您一種更好的方法,它不需要用戶發出潛在的危險 reset

我用了git reset --hard HEAD ^ —壞主意,顯然所有文件都被刪除了

$ git reset --hard HEAD^

此命令會將您當前的工作樹和索引設置為恰好在提交時HEAD^(倒數第二次提交)。換句話說,它將丟棄任何本地未提交的更改,并將分支指針移回一次提交。它不會觸摸未跟蹤的文件。

所以后來我用git reflog找到我離開的地方

$ git reflog

這將顯示最近檢出的最后一次提交(與相同git reflog HEAD)。如果您指定分支名稱,它將顯示該分支最近指向的最后一次提交。

然后我使用git reflog __返回我的上一次提交。

不確定這一點。git reflog(大多數情況下)是只讀命令,不能用于“找回”提交。您只能使用它來查找提交HEAD指向的分支(或)。

然后我用git reset HEAD取消了提交的階段(本來應該做的),但是提交之后我添加的文件(見上文)仍然消失了。$ git reset HEAD

這不會取消暫存此提交,但會取消暫存索引中所有已暫存(但未提交)的更改。最初(第一步),您想說git reset HEAD^(或git reset --mixed HEAD^)–這將使您的工作樹保持不變,但是將索引設置為匹配由命名的提交所指向的樹HEAD^。


現在,要取回文件,您必須使用git fsck --full --unreachable --no-reflog。它將掃描Git對象數據庫中的所有對象并執行可達性分析。您要尋找blob對象。還應該有一個tree對象,描述第二秒鐘后的狀態git add .

git cat-file -p <object hash>將打印文件內容,因此您可以驗證是否具有正確的對象。對于Blob,您可以使用IO重定向將內容寫入正確的文件名。對于樹,您必須使用git命令(git read-tree)。如果只有幾個文件,最好將它們直接寫入文件。


這里有幾點注意事項:

如果要向最后一次提交中添加文件(或編輯其提交消息),則可以簡單地使用git commit --amend?;旧鲜且粋€包裝git reset --soft HEAD^ && git commit -c HEAD@{1}。

而且,使用它絕不是一個好主意git add .。通常,在創建新存儲庫時,您只想在第一次使用它。更好的替代方法是git add -u,git commit -a它將所有更改轉移到跟蹤文件中。要跟蹤新文件,最好明確地指定它們。


查看完整回答
反對 回復 2019-12-04
?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

我有一個類似的問題,但是我的回購中有很多懸掛的斑點和樹木,所以我最終用grep所有懸掛的斑點的輸出進行過濾,并打印出匹配的斑點。假設${UNIQUE_CODE}有一些代碼對于索引中的文件是唯一的,那么這應該為您提供要查找的斑點的哈希值:


for b in $(git fsck --lost-found | grep blob | awk '{print $3}'); do git cat-file -p $b | grep -q ${UNIQUE_CODE} && echo $b; done


查看完整回答
反對 回復 2019-12-04
  • 2 回答
  • 0 關注
  • 638 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號