Para cambios ocultos en commits de fusión
Las confirmaciones de fusión tienen sus cambios ocultos automáticamente en la salida del registro de Git. Tanto el pico como la culpa inversa no encontraron el cambio. Así que la línea que quería había sido agregada y luego eliminada y quería encontrar la fusión que la eliminó. El git log -p -- path/file
historial del archivo solo mostró que se estaba agregando. Aquí está la mejor manera que encontré para encontrarlo:
git log -p -U9999 -- path/file
Busque el cambio, luego busque "^ commit" hacia atrás: el primer "^ commit" es el commit donde el archivo tuvo esa última línea. El segundo "^ commit" es después de que desapareció. El segundo commit podría ser el que lo eliminó. los-U9999
está destinado a mostrar el contenido completo del archivo (después de cada vez que el archivo se ha cambiado), suponiendo que sus archivos están todos max 9999 líneas.
Encuentra cualquier fusión relacionada a través de la fuerza bruta (diferencie cada posible compromiso de fusión con su primer padre, ejecute contra toneladas de confirmaciones)
git log --merges --pretty=format:"git diff %h^...%h | grep target_text" HEAD ^$(git merge-base A B) | sh -v 2>&1 | less
(Intenté restringir más el filtro de revisión, pero me encontré con problemas y no recomiendo esto. Los cambios de agregar / quitar que estaba buscando estaban en diferentes ramas que se fusionaron en diferentes momentos y A ... B no incluyó cuando los cambios se fusionaron en la línea principal).
Mostrar un árbol Git con estas dos confirmaciones (y gran parte del complejo historial de Git eliminado):
git log --graph --oneline A B ^$(git merge-base A B)
(A es la primera confirmación anterior, B es la segunda confirmación anterior)
Muestra el historial de A y el historial de B menos el historial de A y B.
Versión alternativa (parece mostrar la ruta de forma más lineal en lugar del árbol de historial de Git normal; sin embargo, prefiero el árbol de historial de Git normal):
git log --graph --oneline A...B
Tres, no dos puntos: tres puntos significa "r1 r2 --no $ (git merge-base --all r1 r2). Es el conjunto de commits a los que se puede acceder desde cualquiera de r1 (lado izquierdo) o r2 (derecha lado), pero no de ambos ". - fuente: "hombre gitrevisions"
git log -S<string> /path/to/file
quiere una-c
o-cc
así para mostrar el traslado durante la fusión (conflictos)