2012-09-25 32 views
33

今天早些時候,我發現我的git存儲庫中缺少一些代碼。我知道一些缺失的文本和它所在的文件,所以我使用了git log -S'missingtext' /path/to/file。但是,唯一返回的是我添加了包含缺失文本的行的提交。這個文本並沒有出現在HEAD中,添加它的提交出現在我的分支中,所以我知道我的分支歷史記錄中的一個提交必須刪除它,但它沒有顯示出來。發現行被刪除

經過一些手動搜索後,發現該行被意外刪除,同時解決了合併衝突。所以我想知道:

  1. 這是爲什麼鶴嘴鋤找不到提交刪除行的原因?
  2. 如何在沒有手動挖掘歷史記錄的情況下找到「missingtext」被刪除的地方?

在#1任何有識之士將是巨大的(我認爲git log -S會給我我的答案),但我真正的問題是#2,因爲我希望能夠避免這種情況在未來。

+6

'git的日誌-p'和'/ missingtext'而在'less'是一個快速 'N' 骯髒的方式做到這一點。 – nneonneo

+1

可能的重複[如何「責備」刪除的行](http://stackoverflow.com/questions/4404444/how-do-i-blame-a-deleted-line) – hypehuman

回答

44

git log默認情況下不會爲合併提交顯示差異。該-c--cc標誌應該做的伎倆:

git log -c -S'missingtext' /path/to/file

更多的討論/解釋here

+0

如果您想查找何時行從刪除的文件中刪除,您可以使用'git log -c -S'missingtext' -/path/to/file'。 – Jonathan

+0

如果你不知道哪個文件包含缺失的文本,你可以省略'/ path/to/file',然後運行'git log -c -S'missingtext'' –

0

快速和骯髒的方式#2 - 使用循環。

for commit in $(git log --pretty='%H'); do 
    git diff -U0 --ignore-space-change "$commit^" "$commit" | grep '^-.*missingtext' > /dev/null && echo "$commit" 
done 

這將包括所有合併更改,因爲它明確指定了diff的基本提交。我想出了這個,因爲git log -c -S...給了我一些誤報。另外,當我在最初的git log命令中指定文件路徑時,它跳過了我正在查找的提交。

因爲這可能會運行一段時間,你可以指定在git log命令-n或放一個&& break在循環結束時,如果你只需要1個結果。