¿Cómo search un historial de repository git para encontrar un error de fusión?

En algún punto de nuestras twigs de desarrollo pasadas 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 twig principal que esperábamos que estuvieran allí. (Hubo varias fusiones de diferentes twigs antes de una fusión final a una twig principal. Por lo tanto, la bifurcación y la fusión de la historia fue bastante compleja.)

¿Hay alguna manera fácil de search en un repository de git para determinar en qué combinación se tomó la decisión "incorrecta"?

(Ya sé la respuesta para este caso en particular, pero el process de encontrarlo fue un poco tedioso).

EDITAR: La razón por la que la culpa de git resultó inadecuada es que la línea se tocó en una confirmación en algún momento después del error de fusión.

Si conoce una línea en un file 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 file. Luego puede ir a través del logging de git y get la confirmación exacta asociada con la combinación de bifurcación incorrecta.

EDITAR: 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 desea. digamos que tienes numbers 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 search la desaparición.

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

La primera iteración, verá la línea que le importa desaparecer. Luego, corta el número de revisión a la mitad y vuelve a intentarlo

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

Si grep todavía muestra que la línea desaparece (con el signo '-'), entonces sabrá que la línea desapareció en la revisión 0 a 3. Si grep no muestra la línea desapareciendo, entonces la línea desapareció en las revisiones 4-6 .

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

Sin más detalles, solo puedo insinuar posibles soluciones. Si conoce el file o la línea afectada, puede probar git-culpa ( git blame *file* , o git blame *revision* *file* ), o puede intentar la llamada 'búsqueda de pico ' con git-log , es decir git log -S'*line* tratando de encontrar la revisión que introdujo la línea dada, o eliminó la línea dada. Puede search y examinar todas las fusiones, por ejemplo, a través de git log -p -m --grep=Merge , y examinar cómo se relacionan con sus padres ( -m show diffs a todos los padres; alternativamente -c muestra diff combinado pero no lo hace mostrar cambios de fusión triviales, es decir, si se tomó un lado).

¿Puede git-bisect ayuda en su caso?

Git Log tiene potentes opciones de búsqueda. Como existe la indicación de que puede saber que un fragment de código desapareció, puede search esa cadena de código

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

Buscará desde AQUÍ hasta ALLÍ para la cadena después de -S y solo donde la línea fue modificada (agregada o eliminada)

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.

Para otros que buscan una solución más simple, enciendan gitk (o desde la GUI de Git diríjase a Repositorio> Visualizar historial de X ) y use su herramienta de búsqueda.