Encontrar cuando se eliminó la línea

Hoy temprano descubrí que faltaba algún código de mi repository de git. Sabía algo del text que faltaba, y el file en el que estaba, así que usé git log -S'missingtext' /path/to/file . Sin embargo, lo único que regresó fue la confirmación en la que agregué la línea que contenía el text faltante. El text no estaba presente en HEAD, y la confirmación que lo agregaba estaba presente en mi twig, así que sabía que uno de los commits en el historial de mi sucursal debía haberlo eliminado, pero no aparecía.

Después de algunas búsquedas manuales, resultó que la línea se eliminó accidentalmente mientras se resolvía un conflicto para una combinación. Entonces me pregunto:

  1. ¿Es esta la razón por la cual el pico no pudo encontrar el compromiso que borró la línea?
  2. ¿Cómo pude haber encontrado dónde se eliminó "missingtext" sin tener que search manualmente el historial?

Cualquier idea sobre el n. ° 1 sería genial (asumí que el git log -S me daría mi respuesta), pero mi verdadera pregunta es n. ° 2, ya que me gustaría poder evitar esto en el futuro.

git log no muestra un diff para los commit de fusión por defecto. Las banderas -c o --cc deberían hacer el truco:

git log -c -S'missingtext' /path/to/file

Más discusión / explicación aquí .

Manera rápida y sucia # 2 – use un ciclo for.

 for commit in $(git log --pretty='%H'); do git diff -U0 --ignore-space-change "$commit^" "$commit" | grep '^-.*missingtext' > /dev/null && echo "$commit" done 

Esto includeá todos los cambios de combinación porque especifica explícitamente la confirmación base para la diferencia. Se me ocurrió esto porque git log -c -S... me estaba dando un montón de falsos positivos. Además, cuando especifiqué una ruta de file en el command de git log , omite la confirmación que estaba buscando.

Dado que esto puede ejecutarse por un time, puede especificar -n en el command git log o poner un && break al final del ciclo si solo necesita 1 resultado.

Gran respuesta a esto en Super Usuario: https://superuser.com/questions/541681/git-how-do-i-find-which-commit-deleted-a-line

 git blame --reverse START.. file.ext