2015-11-12 104 views
9

我有一箇舊的提交md5hashmyfile.extensionSOME CHANGE在提交正文(不是提交標題/元數據)。Git跟蹤代碼塊在一個文件中移動/刪除

如何在HEAD之前從md5hash修改(不只是存在)SOME CHANGE提交列表,而不必檢查每個diff? (其中有不幸的是在目前的情況下很多)。

我試過git rev-list --all | xargs git grep 'SOME CHANGE'但這似乎找到所有提交文件中的SOME CHANGE提交。

git blame似乎毫無用處,因爲線路已經改變,並且SOME CHANGE已經移動。

回答

4

我想你要找的答案是git --no-pager log --pretty="%H" -G"SOME CHANGE" -- myfile.extension

起初我想到了git log -S但它只包括添加/刪除。 git log -G可能會接近你想要的。在這裏,您可以看到-S-G之間的區別,並且我已經包含完整的提交歷史記錄,因此您可以查看未涵蓋的內容。閱讀提交消息,瞭解我在本體中所做的操作。

# git --no-pager log --oneline -S"SOME CHANGE" 
12e24ed Remove text 
9427ffc Add the text 
# git --no-pager log --oneline -G"SOME CHANGE" 
12e24ed Remove text 
6a33653 Change other text on same line 
ac09bbb Append other text to same line 
484b447 Move the text two lines down 
9427ffc Add the text 
# git --no-pager log --oneline 
12e24ed Remove text 
9c7f7d5 Change text on adjacent line 
6a33653 Change other text on same line 
ac09bbb Append other text to same line 
484b447 Move the text two lines down 
377936f Add other text on adjacent line 
9427ffc Add the text 
1929648 Initial commit 

要只用哈希得到它:

# git --no-pager log --pretty="%H" -G"SOME CHANGE" 
12e24ed749e499bc2d8920c5d8a3ca98a6422e3f 
6a336532210ca85dea86968c34cef516345b8ab4 
ac09bbb5c95bbea65e7c99c730653d27f90397f4 
484b4478e4cb16c839dac558f3e958683b428a64 
9427ffc7dd60a3cfb1d9880083e6262faea0eefb 
0

這仍然需要一點在搜索結果中涉水的,但是這可能讓你更接近:

git rev-list --all | xargs git show | egrep '(^ ?[+-].*(SOME CHANGE)|^commit)' | egrep -B1 '^ ?[+-]' | uniq 

這顯示了每個提交補丁,顯示它在看啥,然後吐出線的代碼匹配。比賽的相關比賽高於比賽。

如果這是一種可行的方式,您可以進一步清理結果。

0

我認爲你正在尋找:

git log -S<string> 

查找以更改文件中指定的字符串(即增加/刪除)的出現次數的差異。旨在供劇本使用。

當你尋找一個精確的代碼塊(比如一個結構體),並且想知道該塊自第一次出現以來的歷史記錄時,它非常有用:迭代地使用該特徵來提供有趣的塊將原像恢復爲-S,並繼續前進,直到獲得該塊的第一個版本。