Git parece 'perder' un compromiso

¿Es posible que Git tenga un commit en master y, quizás debido a que un desarrollador resuelva un conflicto incorrectamente, realmente 'pierda' el commit? ( Editar : Al "perder el compromiso", me refiero no solo a perder los cambios, sino a perder todos los loggings de que la confirmación haya sucedido).

Escenario: hace una o dos semanas hubo una corrección de errores en nuestra twig principal que sabemos que se envió a nuestro server en vivo y funcionó. Hoy, la corrección de errores desapareció de vivo. Recordaba haber resuelto un conflicto reciente en ese file, pero cuando fui a search la corrección en nuestro repository de git, no pude encontrar rastro de él en la twig principal ni en ninguna otra twig que sospeche que haya tocado el file. Revisé el historial de git del file y la culpa del git pero no vi confirmaciones lo suficientemente recientes como para haber sido la corrección de errores. ¿Cómo es esto posible?

Siempre que esto me ha pasado, siempre ha sido una fusión.

Este escenario exacto me pasó una vez (lo pienso muchas veces, aunque no fui capaz de probarlo excepto una vez).

Esto es lo que sucedió:

  1. Alguien se ramifica desde el maestro a su propia twig, llamado feature/foo .
  2. Hago una corrección en la twig principal.
  3. Completan su trabajo en feature/foo y lo fusionan en master como este:

     # git status On branch feature/foo # git checkout master # git merge feature/foo --theirs 

Usaron --theirs porque el 98% del time es apropiado– dice que cada vez que hacen un cambio y entra en conflicto con el maestro, adopta el código de su twig. Pero nunca fusionaron el maestro en su twig de características antes de fusionarse de nuevo en el maestro, por lo que su twig no tenía mi solución. El --theirs asegura que su código no fijo sobrescribió mi código fijo, y mi cambio desapareció mágicamente.

Pude detectar esto mirando las líneas mágicamente no git annotate través de la git annotate . Revisé commit after commit, usando git annotate y mirando las líneas en cuestión hasta que descubrí qué commit fue el último en tener mi solución y qué commit ya no tenía mi solución. Descubrí que mi solución desapareció durante esa fusión.

Antes de este incidente, he tenido fusiones normales haciendo lo mismo, excepto que sucedió en mercurial en lugar de git. El desarrollador no fusiona el maestro en su twig de características, y cuando fusionaron su arreglo de nuevo en el maestro después de que hice la corrección, mi solución desapareció.

Después de este incidente, convoqué una reunión solo para que pudiera educar a otros desarrolladores sobre este problema y hacerles saber que las fusiones deberían manejarse con cuidado.

Si no puede encontrar la confirmación en el historial de git, parece que si alguien hizo git push --force al control remoto.

Localmente puede suceder cuando hagas un git reset --hard .

Compruebe git reflog para get una list de las operaciones recientes . La primera columna es una list de SHA1s de HEADs orderados por time, los más nuevos primero. Esto puede ayudarte a encontrar el compromiso perdido.