[英]How to find file revision or commit from git repository by a file hash?
[英]How can I find an unreachable commit hash in a GIT repository by keywords?
我對GIT的情況感到有些困惑。
我正在開發一個GIT版本的項目,我只是注意到我們認為幾周前已經在主分支上的一些提交實際上已經丟失了。 我記得這些提交是由其他人在功能分支“功能/某事”上推動的,這些功能不再存在。
我試圖找到那些丟失的提交來修復我們的錯誤並將它們推到永久分支上。 在此團隊中,每個開發人員都會在提交消息中提供他正在處理的故障單的ID。 所以我肯定知道票證ID(例如1234)在我正在尋找的提交消息中,所以我嘗試了:
git log --all --grep=1234
git log -g --grep=1234
git log --all | grep 1234
git reflog | grep 1234
所有這些命令都沒有返回。
此時,我正要放棄,然后我記得我們的git repo與Slack集成,所以我在松弛的歷史中搜索了1234並發現了提交哈希值。 我馬上試過了:
git show hash1
git show hash2
令人驚訝的工作! 它顯示了所有提交信息。 所以提交就在那里,不知何故仍在我的本地存儲庫中。 所以我想仔細檢查一下我是如何錯過它們的:
git reflog | grep hash1
git branch --contains hash1
git fsck --lost-found | grep hash1
沒有。
git fsck --unreachable | grep hash1
unreachable commit hash1
在這里,它是在無法訪問的提交列表中。
但這是一個很大的項目, git fsck --unreachable
返回了大量的提交,我怎么能通過關鍵字找到這個丟失的提交? 如果我們沒有第三方工具記錄git活動,也許我會嘗試將git fsck的輸出以某種方式回滾到git show並且對結果進行grepping,但這似乎要做很多工作才能找到我的提交知道就在這兒。
PS:對不起,我不能分享回購,這是一個私人項目,但以下應該重現這種情況:
用戶A:
git clone <repo>
git checkout -b feature/something
# add something to commit
git commit -m “special-keyword"
git push origin feature/something
用戶B:
git clone <repo>
git push origin :feature/something
現在用戶B工作數周,然后嘗試查找用戶A推送的提交“特殊關鍵字”。
刪除分支時,還會刪除其reflog。 HEAD
有一個單獨的reflog,它將保留對已刪除分支上的提交的引用,但前提是您已將它們簽出 。
--lost-found
和--unreachable
之間的區別是微妙的: 1請參閱git詞匯表和/或下圖。 通常,使用--lost-found
和/或--unreachable
會找到這樣的提交(並且使用--lost-found
,也會將ID .git/lost-found/commit
目錄,我認為保護他們免受垃圾收集的副作用)。
在這種特殊情況下,您正在尋找的提交不是已刪除分支的最尖端提交。 也就是說,假設在刪除feature/something
之前我們有這個,並且在功能分支上進行了兩次最近的提交:
A <- B <- C <-- master
\
D <- E <-- feature/something
現在我們刪除feature/something
,丟失提交E
和D
的ID。 這兩個ID都會出現在git fsck --unreachable
的輸出中,但是只有E
的ID會被git fsck --lost-found
顯示(並被保存),因為如果/當時,提交D
從E
可以“到達”您恢復該提交。
我怎么能通過關鍵字找到這個丟失的提交?
這有點棘手。 可能你最好的選擇是在所有無法訪問的提交中使用git show
,例如:
git show $(git fsck --unreachable | git cat-file --batch-check |
awk '/commit/ { print $3 }')
現在,您可以在日志消息(或差異)中搜索關鍵字。 內部$(...)
序列是提取所有候選ID的方法:我們只需要提交,而不是標簽,樹和blob。 獲得ID后,所有常規git命令( git log -1
, git show
等)都可以與這些命令一起使用。
1事實上,我自己剛剛學會了這個答案。
看來你有提交哈希可用,所以你可以這樣做
git checkout <HASH>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.