Я удалил файл или некоторый код в файле когда-то в прошлом. Могу ли я получить доступ к содержимому (не к сообщениям о коммитах)?
Очень плохим решением является поиск в журнале:
git log -p | grep <pattern>
Однако это не сразу возвращает хеш коммита. Я играл git grep
безрезультатно.
git log -S
и вине) * [Забава с "git log --grep"] [2] (поиск сообщений коммитов ) * [Веселье с "git grep"] [3] [2]: gitster.livejournal.com/30195.html [3]: gitster.livejournal.com/27674.htmlОтветы:
Для поиска содержимого фиксации (т. Е. Фактических строк исходного текста, а не сообщений фиксации и т. П.) Необходимо выполнить:
git rev-list --all | xargs git grep <expression>
будет работать, если вы столкнетесь с ошибкой «Список аргументов слишком длинный».Если вы хотите ограничить поиск каким-либо поддеревом (например, «lib / util»), вам нужно будет передать это
rev-list
подкоманде,grep
а также:Это пролистает весь текст вашего коммита
regexp
.Причина передачи пути в обеих командах состоит в том, что
rev-list
вернет список ревизий, в которомlib/util
произошли все изменения , но также вам нужно перейти к нему,grep
чтобы он только выполнял поискlib/util
.Просто представьте следующий сценарий:
grep
может найти то же самое<regexp>
в других файлах, которые содержатся в той же ревизии, возвращеннойrev-list
(даже если в этой ревизии не было изменений в этом файле).Вот несколько других полезных способов поиска вашего источника:
Найдите в рабочем дереве текст, соответствующий регулярному выражению регулярное выражение:
Найдите в рабочем дереве строки текста, соответствующие регулярному выражению regexp1 или regexp2:
Поиск в рабочем дереве строк текста, соответствующих регулярным выражениям regexp1 и regexp2, только пути к файлам отчетов:
Найдите в рабочем дереве файлы, в которых строки текста соответствуют регулярному выражению regexp1, а строки текста соответствуют регулярному выражению regexp2:
Поиск рабочего дерева по измененным строкам соответствия текста:
Поиск всех ревизий для текста, соответствующего регулярному выражению regexp:
Поиск всех ревизий между rev1 и rev2 для текста, соответствующего регулярному выражению regexp:
источник
sh.exe": /bin/git: Bad file number
. Ответ VonC также работает с msysgit.git gc
или проверьте: stackoverflow.com/questions/1507463/…Вы должны использовать опцию кирки (
-S
)git log
.Для поиска
Foo
:Посмотрите историю Git - найдите потерянную строку по ключевому слову для получения дополнительной информации.
Как прокомментировал Якуб Наребски :
это ищет различия, которые вводят или удаляют экземпляр
<string>
. Обычно это означает "ревизии, в которых вы добавили или удалили строку с 'Foo'".--pickaxe-regex
опция позволяет использовать расширенный POSIX регулярное выражение вместо поиска строки. Пример (сgit log
):git log -S"frotz\(nitfol" --pickaxe-regex
Как прокомментировал Роб , этот поиск чувствителен к регистру - он открыл дополнительный вопрос о том, как искать без учета регистра.
источник
git log
немного в вашем вопросе заставил меня путать;)-p
флагом, чтобы также вывести diff.--branches --all
опции для поиска всего репо.Мой любимый способ сделать это с опцией
git log
's'-G
(добавлено в версии 1.7.4).Существует небольшая разница между тем, как параметры
-G
и-S
определяют, соответствует ли коммит:-S
опция, по сути, подсчитывает количество совпадений вашего поиска в файле до и после фиксации. Фиксация отображается в журнале, если значения до и после отличаются. Это не будет, например, показывать коммиты, куда была перемещена строка, соответствующая вашему запросу.-G
опции фиксация отображается в журнале, если ваш поиск соответствует любой строке, которая была добавлена, удалена или изменена.Возьмите этот коммит в качестве примера:
Поскольку число раз, когда «hello» появляется в файле, одинаково до и после этой фиксации, оно не будет совпадать с использованием
-Shello
. Однако, поскольку произошли изменения в сопоставлении строкhello
, фиксация будет показана с использованием-Ghello
.источник
-p
опцию, чтобы показать diff для каждого коммита. Затем, когда журнал открывается в моем пейджере, я ищу все, что ищу. Если ваш пейджерless
и выgit log -Ghello -p
, вы можете напечатать/hello
, нажатьEnter
и использоватьn
и,N
чтобы найти следующее / предыдущее вхождение «привет».-G
Regex: если в командной строке используется UTF-8, а в файле, который вы просматриваете, используется кодировка ISO-Latin (8 бит), произойдет.*
сбой. Например, у меня есть изменениеVierter Entwurf
->Fünfter Entwurf
, и, хотя'V.*ter Entwurf'
выдает совпадение,'F.*ter Entwurf'
нет.Если вы хотите просмотреть изменения кода (посмотреть, что на самом деле было изменено с данным словом во всей истории), перейдите в
patch
режим - я нашел очень полезную комбинацию выполнения:источник
git log
может быть более эффективным способом поиска текста во всех ветвях, особенно если совпадений много, и вы хотите сначала увидеть более свежие (релевантные) изменения.Эти комманды журнала регистрируют коммиты, которые добавляют или удаляют заданную строку поиска / регулярное выражение, (как правило) более новые в первую очередь.
-p
Опция вызывает соответствующий дифференциал будет показан , где была добавлена или удалена картина, так что вы можете увидеть его в контексте.Найдя соответствующий коммит, который добавляет искомый текст (например, 8beeff00d), найдите ветки, которые содержат коммит:
источник
'
кавычки не группируют строку поиска как один аргумент. Вместо этого'public
это аргумент для-S
, а остальные обрабатываются как отдельные аргументы. Я не уверен, в какой среде вы работаете, но этот контекст был бы необходим для устранения неполадок. Я бы предложил открыть отдельный вопрос StackOverflow, если это необходимо, чтобы помочь вам устранить неполадки со всем контекстом того, как ваша команда git отправляется в оболочку. Мне кажется, что он отправляется через какую-то другую команду? Комментарии здесь не подходящее место, чтобы понять это.Я взял ответ Джита и адаптировал его для Windows (благодаря этому ответу ):
Обратите внимание, что для меня, по какой-то причине, фактический коммит, который удалил это регулярное выражение, не появился в выходных данных команды, а скорее один коммит до него.
источник
--no-pager
в конце команду git>>results.txt
для тех, кто не разбирается в трубопроводе Windows ...Поиск в любой ревизии, в любом файле :
Искать только в некоторых заданных файлах, например, в файлах XML:
Строки результата должны выглядеть следующим образом: 6988bec26b1503d45eb0b2e8a4364afb87dde7af: bla.xml: текст найденной строки ...
Затем вы можете получить больше информации, такой как автор, дата и разница, используя
git show
:источник
Для простоты я бы предложил использовать графический интерфейс: gitk - браузер репозитория Git . Это довольно гибкий
И вы можете перемещаться по результатам с помощью стрелок вверх / вниз.
источник
Для тех, кто пытается сделать это в Sourcetree , в интерфейсе пользователя нет прямой команды (начиная с версии 1.6.21.0). Однако вы можете использовать команды, указанные в принятом ответе, открыв окно терминала (кнопка доступна на главной панели инструментов) и скопировав / вставив их в него.
Примечание: представление поиска Sourcetree может частично выполнять поиск текста для вас. Нажмите Ctrl+, 3чтобы перейти к представлению «Поиск» (или нажмите вкладку «Поиск» внизу). В крайнем правом углу установите для параметра «Тип поиска» значение « Изменения файла», а затем введите строку, которую хотите найти. Этот метод имеет следующие ограничения по сравнению с приведенной выше командой:
источник
Всякий раз, когда я оказываюсь у вас, я использую следующую командную строку:
Объяснение:
git log
- Нужно ли мне больше писать здесь; он показывает журналы в хронологическом порядке.-S "<words/phrases i am trying to find>"
- Он показывает все те коммиты Git, где любой файл (добавлен / изменен / удален) содержит слова / фразы, которые я пытаюсь найти без символов «<>».--all
- Для обеспечения и поиска по всем филиалам.--oneline
- Он сжимает журнал Git в одну строку.--graph
- Создает график хронологически упорядоченных коммитов.источник
Ответ Джита работает в PowerShell.
Ниже показаны все файлы в любом коммите, которые содержат
password
.источник
Итак, вы пытаетесь просмотреть старые версии кода, чтобы увидеть, где что-то существует в последний раз?
Если бы я делал это, я бы использовал git bisect . Используя bisect, вы можете указать известную хорошую версию, известную плохую версию и простой скрипт, который проверяет, является ли версия хорошей или плохой (в этом случае grep, чтобы увидеть, присутствует ли код, который вы ищете ). Запуск этого найдет, когда код был удален.
источник
Сценарий. Вы тщательно очистили свой код с помощью IDE. Проблема: IDE очистил больше, чем должен, и теперь ваш код не компилируется (недостающие ресурсы и т. Д.)
Решение:
Он найдет файл, в котором «text_to_find» был изменен.
Теперь вы можете отменить это изменение и скомпилировать свой код.
источник
это настройка решения Jeet , поэтому он показывает результаты во время поиска, а не только в конце (что может занять много времени в большом хранилище).
источник
В моем случае мне нужно было найти короткий коммит, и перечисленные решения, к сожалению, не работали.
Мне удалось сделать это с помощью (заменить токен REGEX ):
источник