2009-02-16 12 views
8

En algún punto de nuestras ramas anteriores de desarrollo en git se fusionaron. Sin embargo, se tomó la decisión de fusión incorrecta y, por lo tanto, algunos códigos no llegaron a la rama principal que esperábamos que estuvieran allí. (Hubo varias fusiones de diferentes ramas antes de una fusión final a una rama principal. Por lo tanto, la bifurcación y la fusión de la historia fue bastante compleja.)¿Cómo buscar un historial de repositorio git para encontrar un error de fusión?

¿Hay una manera fácil de buscar en un repositorio de git para determinar en qué fusionar el "error" "¿se tomó una decisión?

(. Yo ya sé la respuesta para este caso particular, pero el proceso de encontrar fue un poco tedioso)

EDIT: La culpa razón git resultó inadecuado es que la línea fue tocado en un algún momento comprometerse después el error de fusión

Respuesta

7

Si conoce una línea en un archivo que fue modificado por la fusión de git branch, puede hacer 'git blame file.txt' y determinar el número hash de confirmación y confirmar el autor de la línea en el archivo. Luego puede ir a través del registro de git y obtener la confirmación exacta asociada con la combinación de bifurcación incorrecta.

EDIT: En respuesta a los comentarios del autor, si está buscando la desaparición de una determinada línea, entonces 'git diff' combinado con grep y búsqueda binaria podría ser lo que desee. digamos que tienes números de compromiso 0,1,2,3,4,5,6. Usted sabe que la línea existió en la revisión 0, pero desapareció en la revisión 6. Use 'git diff' más grep para buscar la desaparición.

git diff 0 6 | grep '- line I care about' 

En la primera iteración, verá desaparecer la línea que le preocupa. A continuación, se corta el número de revisión por la mitad y vuelve a intentarlo

git diff 0 3 | grep '- line I care about' 

Si el grep aún muestra la línea de desaparecer (con el signo '-'), entonces usted sabe que la línea desapareció en revisión 0 a 3. Si el grep no muestra que la línea desaparece, luego la línea desapareció en las revisiones 4-6.

Siga cortando las revisiones a la mitad hasta que encuentre el culpable.

+0

El problema fue que la línea se tocó en algún momento después del "error de fusión". Sabía cuándo se introdujo el parche, pero no podía decir cuándo se cayó por primera vez. – Atlas1j

+1

En lugar de git diff y buscar, use las opciones que proporciona el registro de git. Específicamente, intente 'git log .. -S" línea que me importa "--diff-filter = M' –

+2

El proceso que describe es lo que hace git bisect. Sin embargo, no tienes que contar hashes. Si bien su patrón 0-6, 0-3/4-6, etc. es claro y comprensible, no puede usar números de compromiso. Tienes que usar come hash y eso no está claro. git bisect es tu amigo. –

10

Sin más detalles Sólo puedo insinuar posibles soluciones. Si sabe que el archivo o la línea afectada, se puede tratar ya sea git-blame (git blame *file*, o git blame *revision* *file*), o puede intentar la llamada 'pico búsqueda' con git-log, es decir git log -S'*line* tratando de encontrar la revisión que introdujo da línea, o se elimina dado línea. Puede buscar y examinar todas las fusiones, por ejemplo, a través del git log -p -m --grep=Merge, y examinar cómo se relacionan con sus padres (-m muestran diffs a todos los padres; alternativamente, -c muestra la combinación de diferencias, pero no muestra cambios de fusión triviales, es decir, si se tomó una de las caras) .

0

Para otros que buscan una solución más simple, el fuego de gitk (o desde Git GUI ir al repositorio> Visualícense X Historia) y utilizar su herramienta de búsqueda.

9

Git log tiene potentes opciones de búsqueda.Ya que no hay la indicación que puede saber un trozo de código que desapareció, se puede buscar esa cadena de código

git log <HERE>..<THERE> -S"line I care about" --diff-filter=M

buscará de aquí para allá para la cadena después de -S y sólo cuando se modificó la línea (agregado o eliminado)

Puede lograr aún más precisión en su búsqueda si usa -G en lugar de -S. -G proporciona búsqueda de expresión regular en lugar de búsqueda literal de cadena con -S.

+0

¡Esto es IMPRESIONANTE! No sabía sobre esto. ¡Gracias! –

+0

necesita más votos positivos ... –

+1

Esto puede ser muy útil con la opción -p para mostrar parches en lugar de cometer resúmenes. Por lo tanto, puede ver los cambios de las confirmaciones que coinciden. – studgeek

Cuestiones relacionadas