¿Cómo buscar en un repositorio Git por mensaje de confirmación?


828

Verifiqué un código fuente en GIT con el mensaje de confirmación "Build 0051".

Sin embargo, parece que ya no puedo encontrar ese código fuente: ¿cómo extraigo esta fuente del repositorio GIT, usando la línea de comandos?

Actualizar

  1. Comprobado en las versiones 0043, 0044, 0045 y 0046 utilizando SmartGIT.
  2. Retiró 0043, y registró versiones hasta 0051 en una sucursal diferente.
  3. Retirado 0043 de nuevo.
  4. Ahora, 0051 ha desaparecido.

Actualizar

El código fuente definitivamente está ahí, ahora es cuestión de verificarlo:

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>




2
Las respuestas no pertenecen a las preguntas sobre Stack Overflow. Has contribuido lo suficiente como para saber esto. Si desea responder a su propia pregunta, puede hacerlo . Alternativamente, puede editar la respuesta de shelhamer para mejorarla / expandirla.
Cody Gray

1
@Cody Me refiero a esta publicación de vez en cuando. No puede simplemente eliminar texto al azar, eso no es cricket. Si desea eliminarlo, sin duda puede cambiarlo a su propia respuesta (e incluso puede obtener algunos votos positivos por ello: ha contribuido lo suficiente como para saber cómo funciona esto).
Contango

Respuestas:


1284

Para buscar el registro de confirmación (en todas las ramas) para el texto dado:

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

Para buscar el contenido real de los commits a través del historial de un repositorio, use:

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

para mostrar todas las instancias del texto dado, el nombre del archivo que contiene y el commit sha1.

Finalmente, como último recurso en caso de que su commit esté colgando y no esté conectado al historial, puede buscar el registro en sí mismo con la -gbandera (abreviatura de --walk-reflogs:

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

EDITAR: si parece haber perdido su historial, verifique reflogcomo su red de seguridad. Busque Build 0051 en uno de los commits listados por

git reflog

Es posible que simplemente haya configurado HEADuna parte de la historia en la que el compromiso 'Build 0051' no está visible, o puede que realmente lo haya borrado. El artículo de registro de git ready puede ser de ayuda.

Para recuperar su commit del reflog : realice una comprobación git del commit que encontró (y opcionalmente haga una nueva rama o etiqueta para referencia)

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
con git grep 'Build 0051' $ (git rev-list --all) obtengo sh.exe ": / bin / git: ¿Tal vez el número de archivo incorrecto cambió la forma de hacer esto?
Jens Schauder

77
git log -i -grep
jhvaras

@JensSchauder Si se encuentra con un error git grep 'search' $(git rev-list --all), intentegit rev-list --all | xargs git grep 'search'
afilina

83

Puse esto en mi ~ / .gitconfig:

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

Entonces puedo escribir "git find string" y obtengo una lista de todos los commits que contienen esa cadena en el mensaje. Por ejemplo, para encontrar todas las confirmaciones que hacen referencia al 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

1
¿Agradable, pero tal vez falta un restablecimiento de color? --pretty=\"format:%Cgreen%H %Cblue%s%Creset\"
Ashley Coolman

44
Yo prefiero imprimir el mensaje completo git (grep puede ser que ocurrió allí, no en el título), así que terminé con: find = log --all --pretty=\"format:%Cgreen%H %Cblue%s\n%b%Creset\" --name-status --grep. Tenga en cuenta los caracteres --ally %b. Thx @AshleyCoolman por la resetpropina.
arcol

Gracias. Encontré el alias muy útil. No me gustó el color y encontré el formato en línea perfecto para esto. También fue útil agregar -i para que no distinga entre mayúsculas y minúsculas. por ejemplofind = log --oneline --name-status -i --grep
robbp

39

Aunque es un poco tarde, existe :/la notación dedicada para especificar una confirmación (o revisión) basada en el mensaje de confirmación, solo prefija la cadena de búsqueda con :/, por ejemplo:

git show :/message

Aquí <message>puede haber un patrón de expresión regular complejo que consta de espacios en blanco, así que asegúrese de citar / escapar cuando sea necesario, por ejemplo:

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

Alternativamente, se puede especificar un punto de inicio, para encontrar la confirmación más cercana accesible desde un punto específico, por ejemplo:

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

Ver: manual de revisiones de 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"

debería hacer el truco


1
Tiene que usar comillas dobles (") en lugar de comillas simples (').
Frage

9

¡Prueba esto!

git log | grep -b3 "Build 0051"

Gracias, pero no lo encuentro. ¿Cómo busco en todas las sucursales posibles?
Contango

66
Desea usar en git greplugar de grep normal, y proporcionar la --allbandera para buscar múltiples ramas.
Shelhamer

Hmm, ¿las otras respuestas lo están encontrando? Si no, puede que tengas un problema mayor. Lo intentaría git log --all --grep='Build 0051'(la respuesta de @ shelhamer)
Nic

Intenté "git log --all", y solo enumera las versiones a 0046. La versión 0051 estaba en una rama diferente. Regresé a 0043 y 0051 desapareció.
Contango

3
@Gravitas, prueba mi ejemplo que usa el reflog: el que tiene git log -g. Es posible que haya perdido el historial en un reinicio, pero aún puede verificar el registro de registro si no se ha recolectado basura.
Shelhamer

4

primero uso git log --onelinepara encontrar el SHA del commit (Mensaje), luego lo usé git log --stat 8zad24dcon el SHA (el primer ejemplo de sha sha de parejas (8zad24d)) para encontrar la información correcta


1

Esta:

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

o esto:

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

Los comandos funcionan mejor para mí.


1

Para buscar en todas las ramas

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

Una vez que sepa a qué compromiso quiere llegar

git checkout <the commit hash>

1

Si el cambio no es demasiado antiguo, puede hacerlo,

git reflog

y luego verifique la identificación de confirmación

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.