2009-09-29 17 views
22

Nuestro proyecto lleva más de una semana usando git, y todos lo estamos disfrutando mucho (usarlo en un grupo de colaboración ajustado resulta ser una experiencia de git diferente). Para mantener las cosas lo más simples posible, no realizamos modificaciones ni modificaciones en el historial. Pero cometimos algunos errores en la primera semana. Se realizaron algunas confirmaciones que no se deberían haber hecho, y logramos fusionar una rama de características en la rama de integración incorrecta (1.1 en lugar de 1.0). Y no nos enteramos de estas cosas hasta que estuvieron en nuestra historia.¿Cuáles son las consecuencias prácticas de reescribir la historia de GIT?

Ahora veo muchas advertencias sobre la reescritura de la historia, pero no estoy seguro de entender los peligros involucrados. Utilizamos un repositorio desnudo compartido, y todas las ramas se insertan allí para realizar una copia de seguridad.

Me gustaría esperar que si reescribes el historial (digamos quita una confirmación), la lista completa de confirmaciones posteriores "pierda" esa confirmación (y tal vez no compile/trabaje). También esperaría que si esto sucede, podría elegir arreglar esto en la parte superior de la historia (y dejar esa parte de la historia como no compilada).

  • Si reescribo el historial (y todo compila/funciona en todas las ramas afectadas), ¿necesitarán mis compañeros de trabajo hacer algún comando especial? (En otras palabras, ¿"sabrán que lo he hecho" si lo hice bien?)
  • ¿Algún usuario con cambios locales que no conozca sea elegible para fusionar fallas en git pull?
  • ¿Me falta algo esencial aquí?

Cualquier referencia a artículos/tutoriales sobre este tema también sería muy agradable.

+0

Trabajas en un equipo de otras personas y no cambias de base? ¿Cómo se asegura de que todo ingrese en el orden correcto? – Goober

+0

@Goober: ingenua respuesta mía aquí, ¿es eso un problema? Estamos impulsados ​​por pruebas, así que creo que lo veremos. – krosenvold

Respuesta

14

La lectura requerida es Problems with rewriting history en el Manual del usuario de Git.

Si reescribo el historial (y todo compila/funciona en todas las ramas afectadas), mis compañeros necesitarán hacer algún comando especial (es decir, "sabrán que lo he hecho" si lo hice bien ?)?

Ellos sabrán, y Git les dirá en términos muy claros que algo está mal. Obtendrán mensajes de error inesperados y, en el proceso de tratar de resolver los conflictos de fusión resultantes, invierten inadvertidamente las confirmaciones anteriores. Este problema crea un mensaje real, y si tiene curiosidad por ver qué sucede, siempre puede probarlo en una copia temporal de sus repositorios.

¿Algún usuario con cambios locales que no conozca sea elegible para fusionar fallas en git pull?

Absolutamente, ver arriba.

¿Echas en falta algo esencial aquí?

¡Evite volver a escribir el historial a (casi) todos los costos!

+0

En realidad, leí esa parte del manual, parece que he leído todos los manuales de RSN;) ¿Las ramas reescritas siempre obtienen nuevas identidades? Eso de hecho explica por qué nunca debería hacerse ... – krosenvold

+0

Debido a la forma en que Git identifica commits por su contenido * y todas las confirmaciones anteriores *, cualquier cambio (aunque menor) de una confirmación parecerá una rama de desarrollo totalmente nueva para Git. No hay forma de que una historia reescrita se vea "casi igual". –

+0

Gracias, extraño cómo solo perderse una pequeña información en git puede marcar la diferencia. – krosenvold

5

Como se mencionó en los otros comentarios de respuesta, en la práctica cada compromiso es único y el historial de reescritura realizará nuevas confirmaciones.

Puede pensar que corta las ramas de un árbol y luego crea nuevas al instante.Incluso pueden parecer iguales pero no lo son. Sí, magia vudú. En esta analogía, revertir sería casi como soportar una rama caída con un registro, por lo que crecerá sin caerse.

Eso nos lleva a a couple good reasons to rewrite history:

  • delgado abajo de un depósito privado antes de hacerlo público: por ejemplo, crear una nueva rama privada local, prueba, prueba, reescribir, empujar.
  • Elimina datos confidenciales de un repositorio privado antes de salir a bolsa.

Aquellos que ya revelan lo que Greg ya dijo: reescribiendo el historial will potentially screw up everyone si el repositorio es público (confirmaciones enviadas). Motivo por el que también defiendo evitar hacerlo a toda costa, incluso en repositorios privados, solo para mantener el buen hábito: así que se debe evitar a toda costa el historial de reescritura(esto significa prestar suficiente atención antes de hacerlo: peso ! los pros y los contras)

y hay al menos otra filosófica y daba razón: historia reescrita son datos perdió. Es cierto que un historial de git con revert podría parecer más desordenado que uno reset. Pero si se escribe correctamente, todo ese "desorden" puede ocultarse en ramas separadas y aún así podemos ver con precisión en qué punto se realizó una reversión. E incluso con motivos o pruebas de por qué se hizo.

Volver a la analogía del árbol, incluso si se elimina el registro de apoyo, la rama revertida mostrará las curvas de crecimiento sinuosas, y es hermoso!

+1

Tenga en cuenta que hay una edición más reciente (2da) del capítulo "Reescribir el historial". https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History – Randall

+1

Estoy de acuerdo en decirle a las personas que aprendan y juzguen como adultos cuando es una buena idea hacer cosas. El historial de reescritura, hecho con frecuencia en ramas de funciones que otros no deben trabajar (aún) es obligatorio y obligatorio en nuestra empresa. –

+0

@XavierAriasBotargues tal vez sea el uso cotidiano más convincente para la reescritura: en la práctica, es mucho más fácil simplemente limpiar y eliminar un montón de desorden inútil al hacer un desarrollo en solitario. y muy poco o ningún beneficio en hacer un esfuerzo adicional para mantener esa historia de todos modos. aún ... espero que su compañía no cierre a los que revertirán. ;PAG – cregox

Cuestiones relacionadas