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:
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