ver tag revertir regresar pendientes modificados log commits cambios archivos archivo anterior git mercurial

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.



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.