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
它將所有更改轉移到跟蹤文件中。要跟蹤新文件,最好明確地指定它們。

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
- 2 回答
- 0 關注
- 638 瀏覽
添加回答
舉報