У меня есть Git-репозиторий с несколькими ветками и висячими коммитами. Я хотел бы найти все такие коммиты в хранилище для конкретной строки.
Я знаю, как получить журнал всех коммитов в истории, но они не включают ветки или висячие капли, а только историю HEAD. Я хочу получить их все, чтобы найти конкретный коммит, который оказался неуместным.
Я также хотел бы знать, как сделать это в Mercurial, так как я рассматриваю переход.
Ответы:
Вы можете увидеть висячие коммиты с
git log -g
.Таким образом, вы можете сделать это, чтобы найти конкретную строку в сообщении коммита, которая висит:
В качестве альтернативы, если вы хотите найти изменения для определенной строки, вы можете использовать опцию поиска кирки "-S":
Git 1.7.4 добавит опцию -G , позволяющую вам передать -G <regexp>, чтобы найти, когда была перемещена строка, содержащая <regexp>, что -S не может сделать. -S сообщит вам только об изменении общего числа строк, содержащих строку (т.е. добавление / удаление строки).
Наконец, вы можете использовать gitk для визуализации висячих коммитов:
А затем используйте его функции поиска, чтобы найти неуместный файл. Вся эта работа при условии, что отсутствующий коммит не «просрочен» и не был собран сборщиком мусора, что может произойти, если оно свисает в течение 30 дней и у вас истекают reflogs или запускается команда, срок действия которой истекает.
источник
!git fsck --unreachable | sed -ne 's/^unreachable commit //p' | xargs git log --no-walk
В Mercurial вы используете
hg log --keyword
для поиска ключевых слов в сообщениях фиксации иhg log --user
для поиска конкретного пользователя. Смотритеhg help log
другие способы ограничения журнала.источник
hg log -k
поиск фиксирует также имена пользователей и имена файлов в наборах изменений (я вижу это в command.py:log), что является одной из немногих вещей, которые я не понимаю в hg. Должны быть отдельные опции для поиска в сообщениях фиксации и именах файлов. Похоже,hg log --template '{desc}\n'|grep
это верный путь.hg grep --all <term>
В дополнение к ответу richq об использовании
git log -g --grep=<regexp>
илиgit grep -e <regexp> $(git log -g --pretty=format:%h)
: взгляните на следующие посты в блоге Junio C Hamano, текущего сопровождающего gitРезюме
И мерзавец Grep и мерзавец журнал --grep является линией ориентированного , в том , что они ищут линии , которые соответствуют заданным шаблону.
Вы можете использовать
git log --grep=<foo> --grep=<bar>
(илиgit log --author=<foo> --grep=<bar>
это внутренне переводится на два--grep
), чтобы найти коммиты, которые соответствуют любому из шаблонов (неявное ИЛИ семантическое).Из - за того , чтобы быть линия-ориентированной, полезный и семантика использовать
git log --all-match --grep=<foo> --grep=<bar>
для поиска фиксации , которая имеет как соответствие строки первой и второй линии согласования где - то.С
git grep
вы можете объединить несколько шаблонов (все , которые должны использовать-e <regexp>
форму) с--or
(это значение по умолчанию),--and
,--not
,(
и)
. Для grep--all-match
означает, что файл должен иметь строки, соответствующие каждой из альтернатив.источник
Основываясь на ответе rq, я обнаружил, что эта строка делает то, что я хочу:
Который сообщит идентификатор фиксации, имя файла и отобразит соответствующую строку, например:
... Кто-нибудь согласен, что это было бы хорошим вариантом для включения в стандартную команду git grep?
источник
Любая команда, которая принимает ссылки в качестве аргументов, примет
--all
опцию, задокументированную на странице man дляgit rev-list
следующего:Так, например,
git log -Sstring --all
будут отображаться все коммиты, которые упоминаютсяstring
и которые доступны из ветки или из тега (я предполагаю, что ваши оборванные коммиты, по крайней мере, названы тегом).источник
git grep
, когда--all
переводится на / используется как--all-match
. Для меня это похоже на ошибку ... использование Git 1.7.2.3 (использование$(git rev-list --all)
работ).С Mercurial вы делаете
Существуют и другие параметры, которые сужают диапазон проверяемых ревизий.
источник
hg grep --all
Не знаю насчет git, но в Mercurial я бы просто перенаправил вывод hg log в какой-нибудь скрипт sed / perl / what для поиска того, что вы ищете. Вы можете настроить вывод hg log, используя шаблон или стиль, чтобы облегчить поиск, если хотите.
Это будет включать все именованные ветви в репо. У Mercurial нет чего-то похожего на свисающие шарики afaik.
источник
если вы пользователь vim, вы можете установить tig (apt-get install tig) и использовать /, ту же команду для поиска в vim
https://blogs.atlassian.com/2013/05/git-tig/
источник
Чтобы добавить еще одно решение, еще не упомянутое, я должен был сказать, что использование графического окна поиска gitg было самым простым решением для меня. Он выберет первое вхождение, и вы можете найти следующее с помощью Ctrl-G.
источник
Одна команда в git, которая, я думаю, намного проще найти строку:
работает в Git 2.0.4
источник