Как найти Git-репозиторий по сообщению коммита?


828

Я проверил некоторый исходный код в GIT с сообщением фиксации «Build 0051».

Однако я больше не могу найти этот исходный код - как мне извлечь этот источник из репозитория GIT, используя командную строку?

Обновить

  1. Проверено в версиях 0043, 0044, 0045 и 0046 с использованием SmartGIT.
  2. Проверено 0043 и проверено в версиях до 0051 в другой ветке.
  3. Снова проверил 0043.
  4. Теперь 0051 исчез.

Обновить

Исходный код определенно есть, теперь его нужно проверить:

C:\Source>git log -g --grep="0052"
commit 77b1f718d19e5cf46e2fab8405a9a0859c9c2889
Reflog: HEAD@{10} (unknown <Mike@.(none)>)
Reflog message: commit: 20110819 - 1724 - GL: Intermediate version. File version:  v0.5.0 build 0052.
Author: unknown <Mike@.(none)>
Date:   Fri Aug 19 17:24:51 2011 +0100

    20110819 - 1724 - GL: Intermediate version. File version: v0.5.0 build 0052.

C:\Source>



Возможный дубликат Как сделать grep git

2
Ответы не относятся к вопросам о переполнении стека. Вы были участником достаточно долго, чтобы вы знали это. Если вы хотите дать ответ на свой вопрос, вы можете это сделать . Кроме того, вы можете отредактировать ответ Шелхамера, чтобы улучшить / расширить его.
Коди Грей

1
@ Коди, я иногда ссылаюсь на этот пост. Вы не можете просто случайно удалить текст, это не крикет. Если вы хотите удалить его, вы, безусловно, можете перевести его в свой собственный ответ (и вы можете даже получить некоторые возражения за него - вы достаточно долго вносили свой вклад, чтобы знать, как это работает).
контанго

Ответы:


1284

Для поиска в журнале фиксации (по всем веткам) по заданному тексту:

git log --all --grep='Build 0051'

Для поиска актуального содержания коммитов в истории репо используйте:

git grep 'Build 0051' $(git rev-list --all)

показать все экземпляры данного текста, имя файла и коммит sha1.

Наконец, в качестве крайней меры, если ваш коммит болтается и вообще не связан с историей, вы можете выполнить поиск самого журнала с помощью -gфлага (сокращенно --walk-reflogs:

git log -g --grep='Build 0051'

РЕДАКТИРОВАТЬ: если вы, кажется, потеряли свою историю, проверьте, reflogкак ваша сеть безопасности. Ищите Build 0051 в одном из коммитов, перечисленных

git reflog

Возможно, вы просто установили HEADдля себя часть истории, в которой фиксация «Build 0051» не видна, или вы, возможно, фактически удалили ее. Мерзавец готового reflog статья может помочь.

Чтобы восстановить ваш коммит из reflog : выполните git checkout найденного вами коммита (и при желании сделайте его новую ветку или тег для справки)

git checkout 77b1f718d19e5cf46e2fab8405a9a0859c9c2889
# alternative, using reflog (see git-ready link provided)
# git checkout HEAD@{10}
git checkout -b build_0051 # make a new branch with the build_0051 as the tip

2
с помощью git grep 'Build 0051' $ (git rev-list --all) Я получаю sh.exe ": / bin / git: Возможно, изменен неправильный номер файла?
Йенс Шаудер,

7
git log -i -grep
jhvaras

@JensSchauder Если вы столкнулись с ошибкой git grep 'search' $(git rev-list --all), попробуйтеgit rev-list --all | xargs git grep 'search'
afilina

83

Я поместил это в мой ~ / .gitconfig:

[alias]
    find = log --pretty=\"format:%Cgreen%H %Cblue%s\" --name-status --grep

Затем я могу набрать «git find string» и получить список всех коммитов, содержащих эту строку в сообщении. Например, чтобы найти все коммиты, ссылающиеся на тикет № 33:

029a641667d6d92e16deccae7ebdeef792d8336b Added isAttachmentEditable() and isAttachmentViewable() methods. (references #33)
M       library/Dbs/Db/Row/Login.php

a1bccdcd29ed29573d2fb799e2a564b5419af2e2 Add permissions checks for attachments of custom strategies. (references #33).
M       application/controllers/AttachmentController.php

38c8db557e5ec0963a7292aef0220ad1088f518d Fix permissions. (references #33)
M       application/views/scripts/attachment/_row.phtml

041db110859e7259caeffd3fed7a3d7b18a3d564 Fix permissions. (references #33)
M       application/views/scripts/attachment/index.phtml

388df3b4faae50f8a8d8beb85750dd0aa67736ed Added getStrategy() method. (references #33)
M       library/Dbs/Db/Row/Attachment.php

1
Хорошо, но, возможно, отсутствует сброс цвета? --pretty=\"format:%Cgreen%H %Cblue%s%Creset\"
Эшли Кулман

4
Я предпочитаю , чтобы напечатать полное сообщение GIT (Grep может быть там произошло, не в названии), так что я закончил с: find = log --all --pretty=\"format:%Cgreen%H %Cblue%s\n%b%Creset\" --name-status --grep. Обратите внимание --allи на %bсимволы. Спасибо @AshleyCoolman за resetсовет.
arcol

Спасибо. Я нашел этот псевдоним очень полезным. Мне не понравилась раскраска, и я нашел формат oneline, идеально подходящий для этого. Также было полезно добавить -i, чтобы сделать его нечувствительным к регистру. напр.find = log --oneline --name-status -i --grep
robbp

39

Хотя и немного запоздало, есть :/специальная нотация для указания фиксации (или ревизии) на основе сообщения фиксации, просто добавьте строку поиска с префиксом :/, например:

git show :/message

Здесь <message>может быть сложный шаблон регулярных выражений, состоящий из пробелов, поэтому, пожалуйста, обязательно указывайте / экранируйте при необходимости, например:

git log -1 -p ":/a few words"

В качестве альтернативы можно указать начальную точку, чтобы найти ближайший коммит, достижимый из определенной точки, например:

git show 'HEAD^{/fix nasty bug}'

Смотрите: руководство по git-ревизиям .


23
git log --grep=<pattern>
            Limit the commits output to ones with log message that matches the
            specified pattern (regular expression).

19
git log --grep="Build 0051"

должен сделать трюк


1
Нужно использовать двойные кавычки (") вместо одинарных кавычек (').
frage

9

Попробуй это!

git log | grep -b3 "Build 0051"

Спасибо - но его не найти. Как мне искать во всех возможных ветках?
Контанго

6
Вы хотите использовать git grepвместо обычного grep и предоставить --allфлаг для поиска по нескольким веткам.
шелхамер

Хм - другие ответы тоже его находят? Если нет, у вас может быть большая проблема. Я бы попробовал git log --all --grep='Build 0051'(ответ @ шелхамера)
Ник

Я попытался "git log --all", и он только перечисляет версии до 0046. Версия 0051 была в другой ветке. Я откатился на 0043, а 0051 пропал.
Контанго

3
@Gravitas, попробуйте мой пример, который использует reflog: один с git log -g. Возможно, вы потеряли историю при перезагрузке, но вы все равно можете проверить журнал, если он не был собран мусором.
Шелхамер

4

сначала используйте, git log --onelineчтобы найти SHA коммита (Message), затем я использовал git log --stat 8zad24dSHA (пример первых пар sha char (8zad24d)), чтобы найти нужную информацию


1

Эта:

git log --oneline --grep='Searched phrase'

или это:

git log --oneline --name-status --grep='Searched phrase'

Команды работают лучше для меня.


1

Для поиска по всем веткам

git log --all --grep='Build 0051'

Как только вы знаете, какой коммит вы хотите получить

git checkout <the commit hash>

1

Если изменение не слишком старое, вы можете сделать,

git reflog

а затем проверить идентификатор фиксации

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.