如何找到在任何分支中引入字符串的Git提交?

我但願可以找到任何分支中任何提交中引入的某個字符串,我該怎麼作? 我發現了一些東西(我爲Win32修改過),但git whatchanged彷佛沒有調查不一樣的分支(忽略py3k塊,它只是一個msys / win行補丁修復) python

git whatchanged -- <file> | \
grep "^commit " | \
python -c "exec(\"import sys,msvcrt,os\nmsvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)\nfor l in sys.stdin: print(l.split()[1])\")" | \
xargs -i% git show origin % -- <file>

若是您的解決方案很慢,這並不重要。 git


#1樓

Mark Longair的答案很是好,但我發現這個更簡單的版本適合我。 ide

git log -S whatever

#2樓

用相同的答案搞清楚: spa

$ git config --global alias.find '!git log --color -p -S '
  • 由於其餘方式,git不能正確地將參數傳遞給-S。 看到這個回覆
  • --color-p有助於準確顯示「whatchanged」

如今你能夠作到 code

$ git find <whatever>

要麼 字符串

$ git find <whatever> --all
$ git find <whatever> master develop

#3樓

--reverse也頗有幫助,由於您須要進行更改的第一個提交: get

git log --all -p --reverse --source -S 'needle'

這樣,舊的提交將首先出現。 string


#4樓

git log -S"string_to_search" # options like --source --reverse --all etc

注意不要在S和「string_to_search」之間使用空格。 在某些設置(git 1.7.1)中,您將收到以下錯誤: it

fatal: ambiguous argument 'string_to_search': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

#5樓

雖然這不能直接回答你的問題,但我認爲這對你來講多是一個很好的解決方案。 我看到了個人一部分代碼,這很糟糕。 不知道是誰寫的或什麼時候寫的。 我能夠看到文件中的全部更改,但很明顯代碼已從其餘文件移到此文件中。 我想找到誰首先實際添加它。 io

爲此,我使用了Git bisect ,很快就讓我找到了罪人。

我運行git bisect start而後git bisect bad ,由於簽出的修訂版有問題。 因爲我不知道問題什麼時候發生,我將第一次提交爲「好」, git bisect good <initial sha>

而後我一直在搜索回購代碼以查找錯誤的代碼。 當我找到它時,我運行了git bisect bad ,當它不存在時: git bisect good

在大約11個步驟中,我已經覆蓋了~1000個提交併找到了確切的提交,其中引入了問題。 太棒了

相關文章
相關標籤/搜索