tag - regresar a un commit anterior git
¿Cómo buscar a través de todas las confirmaciones de Git y Mercurial en el repositorio de una determinada cadena? (10)
Tengo un repositorio Git con pocas sucursales y compromisos colgantes. Me gustaría buscar todas esas confirmaciones en el repositorio para una cadena específica.
Sé cómo obtener un registro de todas las confirmaciones en la historia, pero estas no incluyen ramas o manchas colgantes, solo la historia de HEAD. Quiero conseguirlos a todos, para encontrar un compromiso específico que se haya extraviado.
También me gustaría saber cómo hacer esto en Mercurial, ya que estoy considerando el cambio.
Además de la respuesta de richq sobre el uso de git log -g --grep=<regexp>
o git grep -e <regexp> $(git log -g --pretty=format:%h)
: eche un vistazo a las siguientes publicaciones del blog Por Junio C Hamano, actual mantenedor de git.
Resumen
Tanto git grep como git log --grep están orientados a líneas , ya que buscan líneas que coincidan con un patrón específico.
Puede usar git log --grep=<foo> --grep=<bar>
(o git log --author=<foo> --grep=<bar>
que se traduce internamente en dos --grep
) para encontrar confirmaciones que emparejar cualquiera de los patrones (implícito o semántico).
Debido a que está orientado a la línea, lo útil y semántico es usar git log --all-match --grep=<foo> --grep=<bar>
para encontrar un commit que tenga una línea que coincida con la primera y otra que coincida con la segunda.
Con git grep
puede combinar varios patrones (todos los cuales deben usar la forma -e <regexp>
) con --or
(que es el valor predeterminado), --and
, --not
, (
and )
. Para grep - --all-match
significa que el archivo debe tener líneas que coincidan con cada una de las alternativas.
Con Mercurial haces un
$ hg grep "search for this" [file...]
Hay otras opciones que reducen el rango de revisiones que se buscan.
Cualquier comando que tome referencias como argumentos aceptará la opción --all
documentadas en la página del manual para git rev-list
siguiente manera:
--all
Pretend as if all the refs in $GIT_DIR/refs/ are listed on the
command line as <commit>.
Así, por ejemplo, git log -Sstring --all
todos mostrarán todas las confirmaciones que mencionan la string
y que son accesibles desde una rama o desde una etiqueta (supongo que sus confirmaciones colgantes tienen al menos un nombre con una etiqueta).
En Mercurial, usa hg log --keyword
para buscar palabras clave en los mensajes de confirmación y hg log --user
para buscar un usuario en particular. Consulte el hg help log
para conocer otras formas de limitar el registro.
No sé sobre git, pero en Mercurial solo canalizo la salida de hg log a algún script sed / perl / any para buscar lo que sea que esté buscando. Puede personalizar la salida del registro hg utilizando una plantilla o un estilo para facilitar la búsqueda, si lo desea.
Esto incluirá todas las ramas nombradas en el repositorio. Mercurial no tiene algo así como colmitas afaik.
Para agregar una solución más que aún no se ha mencionado, tuve que decir que usar la caja de búsqueda gráfica de gitg fue la solución más simple para mí. Seleccionará la primera aparición y podrá encontrar la siguiente con Ctrl-G.
Si usted es un usuario vim, puede instalar tig (apt-get install tig), y usar /, el mismo comando para buscar en vim
Sobre la base de la respuesta de rq, encontré que esta línea hace lo que quiero:
git grep "search for something" $(git log -g --pretty=format:%h -S"search for something")
Que informará el ID de confirmación, el nombre de archivo y mostrará la línea correspondiente, como esta:
91ba969:testFile:this is a test
... ¿Alguien está de acuerdo en que esta sería una buena opción para ser incluida en el comando git grep estándar?
Un comando en git que creo que es mucho más fácil encontrar una cadena:
git log --pretty=oneline --grep "string to search"
trabaja en Git 2.0.4
Puedes ver los envíos colgantes con git log -g
.
-g, --walk-reflogs
Instead of walking the commit ancestry chain, walk reflog entries from
the most recent one to older ones.
Así que puedes hacer esto para encontrar una cadena en particular en un mensaje de confirmación que está colgando:
git log -g --grep=search_for_this
Alternativamente, si desea buscar los cambios para una cadena en particular, puede usar la opción de búsqueda de picos, "-S":
git log -g -Ssearch_for_this
# this also works but may be slower, it only shows text-added results
git grep search_for_this $(git log -g --pretty=format:%h)
Git 1.7.4 agregará la opción -G , permitiéndole pasar -G <regexp> para encontrar cuándo se movió una línea que contenía <regexp>, lo que -S no puede hacer. -S solo le dirá cuándo cambió el número total de líneas que contienen la cadena (es decir, agregar / eliminar la cadena).
Finalmente, puedes usar gitk para visualizar los compromisos colgantes con:
gitk --all $(git log -g --pretty=format:%h)
Y luego use sus funciones de búsqueda para buscar el archivo fuera de lugar. Todo este trabajo, suponiendo que el compromiso faltante no haya "caducado" y se haya recogido la basura, lo que puede suceder si se cuelga durante 30 días y usted vence los registros o ejecuta un comando que los vence.