2009-10-06 6 views
43

Это делает меня орехами.Git: Найти удаленный код

Как найти код, который был удален?

я в конечном итоге найти, где она была создана с этим:

$ git log --pretty=oneline -S'some code' 

И это достаточно хорошо, но я также интересно узнать, где он был удален, и до сих пор, не кости.

Во-первых, я пробовал git diff HEAD..HEAD^|grep 'some code', расширяя диапазон каждый раз, пока не нашел линии, в которых он был удален. Приятно, так что предположим, я нашел его на дальности HEAD^^..HEAD^^^, затем я делаю git show HEAD^^^ и git show HEAD^^ с grep, но код негде найти!

Затем я прочитал немного на git bisect, и конечно же, это дает мне одну ревизию, где преступник должен быть ... Опять git show rev|grep 'some code' приходит пустой ...

Что за? Что я делаю не так?

Спасибо!

+2

Вы говорите, что, когда вы в основном следующие вы не получите хиты ?:

 SHAHIT=\'git log --pretty=oneline -S'some code' | head -1 | awk '{ print $1 }'\' git show $SHAHIT | grep 'some code' 
Если это так, кажется, не .... если бы бессмысленно это в 'log', он должен быть виден в' шоу' ... правильно? Или, может быть, я не понимаю вопроса. – metasim

+0

Прошло некоторое время с тех пор, как я был в этой ситуации, и он снова не представился, поэтому я не могу проверить вашу команду. В любом случае, это может пригодиться кому-то. – Ivan

+1

Старое сообщение/комментарий здесь, но именно то, что мне было нужно, тем не менее. @SimeonFitch ваш синтаксис отлично работал для меня, чтобы найти и перечислить фактическую строку (ы) кода, о которой идет речь. Одним из примеров, которые я нашел полезным, было использование опции «--context = n» grep для отображения достаточного количества строк до/после, чтобы узнать, что такое имя файла (есть и другие параметры grep, которые также помогут в этом). Так что в моем случае вторая команда: git show $ SHAHIT | grep --context = 30 'some code' –

ответ

32

Хммм, работает для меня:

 
$ git init 
Initialized empty Git repository in /Users/pknotz/foo/.git/ 

$ echo "Hello" > a 

$ git add a 

$ git commit -am "initial commit" 
[master (root-commit) 7e52a51] initial commit 
1 files changed, 1 insertions(+), 0 deletions(-) 
create mode 100644 a 

$ echo " World" >> a 

$ git commit -am "Be more specific" 
[master 080e9fe] Be more specific 
1 files changed, 1 insertions(+), 0 deletions(-) 

$ echo "Hello" > a 

$ git commit -am "Be less specific" 
[master 00f3fd0] Be less specific 
1 files changed, 0 insertions(+), 1 deletions(-) 

$ cat a 
Hello 

$ git log -SWorld 
commit 00f3fd0134d0d54aafbb9d959666efc5fd492b4f 
Author: Pat Notz <[email protected]> 
Date: Tue Oct 6 17:20:48 2009 -0600 

    Be less specific 

commit 080e9fe84ff89aab9d9d51fb5d8d59e8f663ee7f 
Author: Pat Notz <[email protected]> 
Date: Tue Oct 6 17:20:33 2009 -0600 

    Be more specific 

Или, это не то, что вы имеете в виду?

+0

Вот что я имею в виду ... Так что, если это не работает для меня, может быть, индекс поврежден или история переписана? – Ivan

+4

В этом примере Пэт использует 'git log -SWorld', который * не * показывает различия.Я предполагаю (не пробовал), что если последняя команда была 'git show 00f3fd0134d0d54aafbb9d959666efc5fd492b4f | grep World ", тогда вы получите поведение, которое вы ищете. – metasim

0

Если ваш репозиторий находится на github.com, он имеет встроенную функцию для поиска. Он отвечает в мс и он ищет в удаленном коде слишком

+6

Я не мог найти способ на github.com для поиска по удаленному коду, только текущий код ... вы можете помочь мне, разработав или продемонстрировав, как это сделать? – pulkitsinghal

17

git log -S<string> делает работу, но если вам нужно, чтобы сделать более сложные запросы можно использовать git log -G<regex>.

От man:

-G<regex>

Посмотрите на различия, чей патч текст содержит добавленные/удаленные строки , которые соответствуют <regex>.