Así que imagina que sucede lo siguiente (y que todos estamos usando SourceTree):
- Todos estamos trabajando desde el origen / desarrollo.
- Me voy de vacaciones por una semana.
- Mi compañero de trabajo ha estado trabajando localmente durante los últimos días sin fusionar origen / desarrollo en su rama de desarrollo local.
- Intenta dar un empujón, le dicen que primero tiene que fusionarse y luego tira.
- Obtiene un conflicto, impidiendo que continúe la confirmación automática después de una fusión.
- Asumiendo que Git es como SVN, mi compañero de trabajo descarta los "nuevos" archivos en su copia de trabajo y luego confirma la fusión, borrando esos "nuevos" archivos del jefe de origen / desarrollo.
- Unas semanas de trabajo de desarrollo se suman a esa revisión.
- Regreso de vacaciones y descubro que faltan varios días de mi trabajo.
Todos somos muy nuevos en Git (este es nuestro primer proyecto usándolo), pero lo que hice para solucionarlo fue:
- Cambie el nombre de "revelar" a "revelar"
- Fusionar desarrollo_old en una nueva rama "desarrollo_nuevo".
- Restablezca la rama del desarrollo a la última confirmación antes de la fusión incorrecta.
- Cherry elige cada commit desde entonces, uno por uno, resolviendo conflictos a mano.
- Empuje desarrollo_veces y desarrollo_nuevo hasta el origen.
En este punto, desarrollo_nuevo es, espero, una copia "buena" de todos nuestros cambios con las semanas posteriores de trabajo reaplicadas. También estoy asumiendo que "cometen inversa" va a hacer cosas extrañas en una fusión, sobre todo porque las próximas semanas la pena de trabajo se basa en él - y puesto que de mezcla contiene una gran cantidad de cosas que sí queremos junto con cosas que don' t.
Espero que esto nunca vuelva a suceder, pero si vuelve a suceder, me gustaría saber de una manera más fácil / mejor de arreglar las cosas. ¿Existe una mejor manera de deshacer una fusión "mala", cuando se ha realizado mucho trabajo en el repositorio basado en esa fusión?
git log
formato favorito con anotaciones apropiadas sobre lo que sucedió en las diferentes confirmaciones? (Redactaría / anotaríagit log --graph --pretty=oneline --abbrev-commit
e iría desde allí)Respuestas:
Si entendí correctamente, esta es tu situación:
Después de un poco de historia común (o), te comprometiste y empujaste tu trabajo (y). Su compañero de trabajo (c) trabajó en su repositorio local e hizo una mala fusión (M). Posteriormente puede haber algunas confirmaciones adicionales (a) sobre M.
Ahora su gráfico se ve exactamente como antes de la fusión incorrecta:
Haz una buena fusión (G):
Resultando en:
Ahora trasplante los commits adicionales:
Esto da el resultado final:
Tenga en cuenta que esto podría generar más conflictos de fusión. También acaba de cambiar el historial, es decir, todos sus compañeros de trabajo deben clonar / restablecer / volver a crear un nuevo historial.
PD: por supuesto, debe reemplazar
G
,M
yX
en sus comandos por la identificación de confirmación correspondiente.fuente
Es bueno que esté pensando en cómo arreglar el repositorio, pero si su compañero de trabajo solo eliminó nuevos archivos y no sobrescribió muchas actualizaciones, entonces un enfoque mucho más simple sería simplemente restaurar los archivos que se eliminaron.
Probablemente comenzaría intentando simplemente seleccionar (en el encabezado actual) las confirmaciones originales en las que agregó el código que ahora ha desaparecido. Si por alguna razón eso no funciona, simplemente revise la revisión anterior con los archivos que agregó y vuelva a agregarlos en una nueva confirmación.
Lo que usted describe es en realidad un subconjunto de un conocido antipatrón Git, que por mi vida no puedo recordar el nombre, pero lo esencial es hacer cualquier "edición manual" durante una fusión Git (es decir, ediciones que en realidad no están resolviendo ningún conflicto de fusión, pero están haciendo un cambio totalmente no relacionado) se considera una práctica extremadamente mala porque están esencialmente enmascarados por la fusión en sí misma y se pasan por alto fácilmente en las revisiones de código o sesiones de depuración.
Así que definitivamente explique a su compañero de trabajo que esto fue un fracaso épico, pero considere darle una tirita antes de prepararse para una cirugía mayor.
fuente