Я хочу быть в состоянии найти определенную строку, которая была введена в любой коммит в любой ветке, как я могу это сделать? Я нашел что-то (что я модифицировал для Win32), но git whatchanged
, похоже, не смотрит на разные ветки (игнорируйте кусок py3k, это просто исправление перевода строки msys / win)
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>
Неважно, если ваше решение медленное.
Ответы:
Ты можешь сделать:
Чтобы найти все коммиты, которые добавили или удалили фиксированную строку
whatever
. В--all
означает параметр , чтобы начать с каждой ветви и--source
средств , чтобы показать , какие из этих ветвей привели к обнаружению того, что фиксации. Часто полезно добавить,-p
чтобы показать патчи, которые будут представлены также каждым из этих коммитов.Версии git начиная с 1.7.4 также имеют похожую
-G
опцию, которая принимает регулярное выражение . Это на самом деле имеет различные (и гораздо более очевидные) семантики, поясняется в этом блоге от Джунио Хамано .Как отмечает thameera в комментариях, вам нужно ставить кавычки вокруг поискового запроса, если он содержит пробелы или другие специальные символы, например:
Вот пример использования,
-G
чтобы найти вхожденияfunction foo() {
:источник
--decorate
коммиту добавляется только имя ветки в конце каждой ветки. На практике я не использовать--source
или--decorate
, и вместо того, чтобы использовать ,git branch -a --contains <commit-hash>
чтобы найти , какие ветви содержит коммит меня интересует.git log -S"dude, where's my car?" --source --all
. @ribamar также написал это в ответе ниже, но его легко можно пропустить рядом с этим топовым ответом.--reverse также полезен, так как вы хотите первый коммит, который внес изменения:
Таким образом, старые коммиты появятся первыми.
источник
Ответ Марка Лонгаира превосходен, но я нашел эту более простую версию для меня.
источник
HEAD
, но этот конкретный вопрос задан специально о просмотре всех веток в репозитории.Возиться с такими же ответами:
Теперь вы можете сделать
или
источник
Обратите внимание, чтобы не использовать пробелы между S и "string_to_search". В некоторых установках (git 1.7.1) вы получите ошибку вроде:
источник
Хотя это не дает прямого ответа на ваш вопрос, я думаю, что это может быть хорошим решением для вас в будущем. Я видел часть моего кода, что было плохо. Не знал, кто это написал и когда. Я мог видеть все изменения из файла, но было ясно, что код был перемещен из какого-то другого файла в этот. Я хотел найти, кто на самом деле добавил это в первую очередь.
Для этого я использовал Git bisect , который быстро позволил мне найти грешника.
Я побежал,
git bisect start
а затемgit bisect bad
, потому что проверенная ревизия имела проблему. Так как я не знаю , когда возникла проблема, я целенаправленные первым совершить на «хорошо»,git bisect good <initial sha>
.Тогда я просто продолжал искать в репозитории плохой код. Когда я его нашел, я побежал
git bisect bad
, а когда его там не былоgit bisect good
.В ~ 11 шагов я рассмотрел ~ 1000 коммитов и нашел точный коммит, где была представлена проблема. Довольно здорово.
источник
Не уверен, почему принятый ответ не работает в моей среде, наконец, я запускаю команду ниже, чтобы получить то, что мне нужно
источник