Como pesquisar em um repositório Git por mensagem de confirmação?

828

Eu verifiquei algum código-fonte no GIT com a mensagem de confirmação "Build 0051".

No entanto, não consigo mais encontrar esse código-fonte - como extraio essa fonte do repositório GIT, usando a linha de comando?

Atualizar

  1. Verificado nas versões 0043, 0044, 0045 e 0046 usando o SmartGIT.
  2. Efetuou check-out de 0043 e fez check-in de versões até 0051 em uma filial diferente.
  3. Check-out 0043 novamente.
  4. Agora, 0051 desapareceu.

Atualizar

O código fonte está definitivamente lá, agora é uma questão de conferir:

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>
Contango
fonte
1
Veja também stackoverflow.com/questions/18122628/...
ripper234
2
As respostas não pertencem às perguntas no Stack Overflow. Você é colaborador há tempo suficiente para saber isso. Se você gostaria de fornecer uma resposta para sua própria pergunta, certamente será bem-vindo . Como alternativa, você pode editar a resposta do shelhamer para melhorar / expandir.
Cody Gray
1
@ Cody Refiro-me a este post ocasionalmente. Você não pode excluir aleatoriamente o texto, isso não é críquete. Se você quiser excluí-lo, certamente poderá alterá-lo para sua própria resposta (e você pode até receber alguns votos positivos - você é colaborador há tempo suficiente para saber como isso funciona).
Contango 01/04

Respostas:

1284

Para pesquisar o log de confirmação (em todas as ramificações) pelo texto fornecido:

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

Para pesquisar o conteúdo real das confirmações através do histórico de um repositório, use:

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

para mostrar todas as instâncias do texto fornecido, o nome do arquivo que contém e o commit sha1.

Finalmente, como último recurso, caso seu commit esteja danificado e não esteja conectado ao histórico, você pode pesquisar o reflog com a -gflag (abreviação de --walk-reflogs:

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

EDIT: se você parece ter perdido seu histórico, verifique reflogcomo sua rede de segurança. Procure a Build 0051 em um dos commits listados por

git reflog

Você pode simplesmente configurá-lo HEADpara uma parte da história na qual o commit 'Build 0051' não é visível, ou você pode realmente tê-lo explodido. O artigo reflog pronto para git pode ser útil .

Para recuperar sua confirmação do reflog : faça um checkout git da confirmação que você encontrou (e, opcionalmente, faça uma nova ramificação ou tag para referência)

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
shelhamer
fonte
2
com git grep 'Construir 0051' $ (rev-list git --all) I get sh.exe ": / bin / git: número do arquivo Bad tem a maneira de fazer isto mudou talvez?
Jens Schauder
7
git log -i -grep
jhvaras
@JensSchauder Se você topar com um erro com git grep 'search' $(git rev-list --all), tentegit rev-list --all | xargs git grep 'search'
afilina
83

Coloquei isso no meu ~ / .gitconfig:

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

Então eu posso digitar "git find string" e recebo uma lista de todos os commits que contêm essa string na mensagem. Por exemplo, para encontrar todos os commits que fazem referência ao ticket # 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
Alex Howansky
fonte
1
Bom, mas talvez falta uma redefinição de cor? --pretty=\"format:%Cgreen%H %Cblue%s%Creset\"
22615 Ashley Coolman
4
Eu prefiro imprimir a mensagem git completo (grep pode ser aconteceu lá, não no título), então eu acabei com: find = log --all --pretty=\"format:%Cgreen%H %Cblue%s\n%b%Creset\" --name-status --grep. Observe os caracteres --alle %b. Thx @AshleyCoolman pela resetdica.
ARCOL
Obrigado. Achei o apelido muito útil. Não gostei da coloração e achei o formato on-line perfeito para isso. Também foi útil adicionar -i para torná-lo sem distinção entre maiúsculas e minúsculas. por exemplofind = log --oneline --name-status -i --grep
robbp 18/07/2018
39

Embora um pouco tarde, existe uma :/notação dedicada para especificar um commit (ou revisão) com base na mensagem de commit, apenas prefixe a string de pesquisa com :/, por exemplo:

git show :/message

Aqui <message>pode ser um padrão regex complexo composto por espaços em branco, então por favor, certifique-se de citar / escapar quando necessário, por exemplo:

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

Como alternativa, um ponto inicial pode ser especificado, para encontrar o commit mais próximo acessível a partir de um ponto específico, por exemplo:

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

Veja: manual de revisões do git .

ryenus
fonte
23
git log --grep=<pattern>
            Limit the commits output to ones with log message that matches the
            specified pattern (regular expression).
Josh Lee
fonte
19
git log --grep="Build 0051"

deve fazer o truque

Noufal Ibrahim
fonte
1
Tem que usar aspas duplas (") em vez de aspas simples ('). #
Frage
9

Tente isso!

git log | grep -b3 "Build 0051"
Nic
fonte
Obrigado - mas não está encontrando. Como pesquiso em todos os ramos possíveis?
Contango 19/08
6
Você deseja usar em git grepvez do grep normal e fornecer o --allsinalizador para pesquisar várias ramificações.
Shelmer
Hmm - as outras respostas também estão encontrando? Caso contrário, você pode ter um problema maior. Eu tentaria git log --all --grep='Build 0051'(@ resposta de shelhamer)
Nic
Eu tentei o "git log --all" e lista apenas as versões para 0046. A versão 0051 estava em um ramo diferente. Voltei para 0043 e 0051 desapareceu.
Contango 19/08
3
@ Gravitas, tente o meu exemplo que usa o reflog: aquele com git log -g. Você pode ter perdido o histórico em uma redefinição, mas ainda pode verificar o reflog se ele não tiver sido coletado como lixo.
Shelmer
4

primeiro uso git log --onelinepara encontrar o SHA do commit (Message), então eu usei git log --stat 8zad24dcom o SHA (o primeiro exemplo de casais sha char (8zad24d)) para encontrar as informações corretas

Ridha Rezzag
fonte
1

Este:

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

ou isto:

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

comandos funcionam melhor para mim.

simhumileco
fonte
1

Para pesquisar em todos os ramos

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

Depois de saber qual commit você deseja chegar

git checkout <the commit hash>
Samarth S
fonte
1

Se a alteração não for muito antiga, você pode fazer,

git reflog

e depois efetue o check-out do ID de confirmação

Joseph
fonte