¿Es tan esencial el git "Regla de oro de la reformulación"?

22

Recientemente tuve una discusión con personas absolutamente opuestas a una estrategia de rebase de ramas de características en GIT. Parece ser un patrón aceptado para usar rebase solo para sucursales locales y privadas, pero nunca lo use cuando haya varias personas trabajando en una misma característica y rama, según esta llamada "Regla de Oro de Rebasar" (como se explica aquí: https : //www.atlassian.com/git/tutorials/merging-vs-rebasing/conceptual-overview )

Me sorprende que haya un consenso sobre esto. Trabajé 3 años con una estrategia de rebase completa, con unos 20 desarrolladores trabajando juntos y adivina qué, funcionó.

El proceso es básicamente:

  • Usted crea su rama de características, llamémosla "myfeature" y la empuja a origin / myfeature
  • Otras personas pueden echarle un vistazo y trabajar en ello
  • A veces puede volver a crear una base desde master: desde "myfeature", git rebase origin / master ; y luego, sí, tienes que forzarlo.
  • ¿Qué sucede cuando otras personas quieren forzar sus compromisos? Simplemente lo reescriben: git rebase origin / myfeature . Entonces ahora están en avance rápido y pueden empujarlo sin forzar.

El único principio a respetar es que la rama característica es propiedad de alguien . El propietario es el único que puede forzar la fuerza.

Entonces, admito: tan pronto como hay una fuerza de empuje, existe el riesgo de cometer errores. Es verdad. Pero también hay muchas maneras de recuperarse de los errores, y realmente, en 3 años de desarrollo, no vi muchos errores de fuerza, y cuando sucedió, siempre encontramos una manera de recuperarnos adecuadamente.

Entonces, ¿por qué esta "Regla de Oro de Rebase" está siendo tan ampliamente aceptada? ¿Hay algo más que me perdí con eso? Entiendo que requiere un mínimo de organización (cada estrategia requiere alguna organización), pero funciona.

Joel
fuente
Algo que olvidé decir, pero tiene su importancia: en mi experiencia previa estábamos usando gerrit como herramienta de revisión de código. Significa que si alguien empuja un commit mientras el propietario de la rama está haciendo un rebase, no hay riesgo de que el commit se pierda, porque se empuja a gerrit en lugar de directamente al repositorio de origen. Y dado que el propietario de la sucursal es el único que tiene derecho a enviar los compromisos de gerrit, el riesgo de cometer errores fue muy bajo.
Joel
¿Qué sucede si fusiono la rama de características de otra persona con la mía?
Winston Ewert
Si su característica depende de otra, entonces supongo que podría cambiar la base de la otra: git rebase origin / otherFeature (digo rebase en lugar de fusionar, ya que el objetivo es mantener lineal el historial). Admito que la complejidad de todo eso aumenta mucho cuando introduces más y más dependencias entre ramas.
Joel

Respuestas:

10

El problema con el empuje forzado no se trata de la rama de características y el maestro, sino de empujar su maestro al maestro de otra persona: esa sincronización va a sobrescribir su maestro con sus cambios, ignorando lo que sea que esté en su punta.

Teniendo en cuenta este peligro, hay una razón por la que no debería usarlo en absoluto a menos que las cosas se hayan estropeado y absolutamente, debe usarlo para realizar reparaciones. Un sistema SCM nunca debería necesitar ser forzado de esta manera, si lo hace porque algo salió terriblemente mal (y mi primer enfoque en tales casos sería restaurar las copias de seguridad y repetir las operaciones para mantener el historial intacto).

Entonces, tal vez la pregunta es ¿por qué estás haciendo rebase? ¿Para un historial "limpio" cuando las características vuelven a ser maestras? Si es así, está desechando toda la buena historia sobre la ramificación por razones puramente de estilo. La fusión de avance rápido de la OMI tampoco es una buena práctica, debe mantener todo el historial para que pueda ver lo que realmente hizo, no una versión desinfectada después.

gbjbaanb
fuente
Podrías, por supuesto, tirar de master, rebase y luego forzar el empuje, pero eso no es atómico.
Kevin
@gbjbaanb tienes toda la razón, la estrategia de rebase tiene que ver con razones de estilo / historia más legible. No estoy tratando de argumentar que es mejor o no. Pero es posible hacerlo, y ese es el punto que quiero plantear. Por supuesto, no estaba hablando de empujar con fuerza al maestro, sino solo a las ramas de características.
Joel
44
En mi humilde opinión, la característica de diseño tanto de rebase como de fusión rápida fue un error. SCM se trata de mantener el historial para que pueda ver lo que sucedió cuando lo necesita y tomar instantáneas de puntos relevantes en el tiempo. Al menos eso es lo que la mayoría de la gente quiere, supongo que Linus quería que la historia fuera lo más simple para que él la leyera y así ponerla en su beneficio. En mi humilde opinión, debería haber hecho un mayor esfuerzo para hacer que las diferencias entre 2 revisiones sean más manejables en su lugar (es decir, permitir que la vista sea más simple, no la historia subyacente)
gbjbaanb
2
Cuando publica un artículo, ¿publica el primer borrador? ¿Existe alguna ley que diga que las herramientas que usa para escribir el primer borrador no pueden usarse para editarlo para su publicación? Git es una herramienta de desarrollo. Si desea preservar de manera confiable y verificable una serie, consérvela. Si desea editarlo para su publicación, edítelo. Git es estelar en ambas tareas.
jthill
5

Rebase no es esencial, ya que usted dice que es principalmente cosmético. A veces es mucho más simple que una fusión. Por lo tanto, puede tener un valor "real", pero solo "a veces"

El uso inadecuado de rebase puede ser costoso. Es improbable que pierda datos si sabe lo suficiente como para no entrar en pánico y buscar procedimientos de recuperación, pero "oye, nadie presione por un tiempo, tengo que arreglarlo ..." no es genial. Tampoco es que alguien pierda tiempo en la recuperación de la investigación y las pruebas cuando podrían haber estado agregando características o eliminando errores (o en casa con la familia).

Con esa compensación, los resultados de "muy pocas personas hacen un rebase y un empuje forzado" no es muy sorprendente.

Algunos flujos de trabajo pueden reducir el riesgo, por ejemplo, reducirlo a "cero siempre que recuerde qué ramas puede forzar y cuáles no". En realidad, podrían ser lo suficientemente seguros como para justificar el riesgo, pero la gente frecuentemente toma decisiones basadas en un folclore más amplio. Por otra parte, en realidad, los beneficios son bastante pequeños, entonces, ¿qué tan pequeño realmente debe ser el riesgo?

Rayas
fuente
3
"oye, nadie presionó por un tiempo, tengo que arreglarlo ..." ... suena como en los viejos tiempos de usar Visual Source Safe. Pensé que Git era mejor que eso.
gbjbaanb
Sí, por lo tanto, la gente establece reglas como "¡no juegues con las herramientas afiladas! (Empuje forzado)" ¡Para que puedan evitar tratar heridas evitables!
Rayas
2
@gbjbaanb Sí, Git es mejor que eso, cuando lo usas correctamente. Quejarse de que Git es incapaz de lidiar con el desarrollo concurrente de manera elegante cuando constantemente rebases y cambia los hash de confirmación de todo es como quejarse de que los autos son inferiores a los carruajes porque son mucho más pesados ​​para que el caballo los arrastre. No es culpa de la herramienta que la gente insista en usarla mal ...
Idan Arye
44
Bueno, de alguna manera es culpa de la herramienta. Git expone MUCHOS bordes afilados, y aunque a veces nota que son afilados, con frecuencia no lo hace. Si lo compara con decir CVS donde todos los bits afilados están en un solo subcomando ("cvs admin"? Tiene un buen tiempo ...) que hace todo lo posible para decir "esto puede cortarle mal, no lo haga úselo a menos que tenga una necesidad imperiosa ". U otros sistemas de control de versiones que omiten capacidades que pueden dañar.
Rayas
44
Eso no quiere decir que git no haya tomado decisiones de diseño válidas (funcionalidad relacionada con el grupo por subcomando, y prefiere permitir que git resuelva cosas más complejas en las manos correctas) ... pero son OPCIONES, y una puede ser crítica de elegir tener tantos bordes afilados, como uno puede ser crítico con la elección de otros VCS para dejar de lado tantas funciones útiles "solo porque alguien puede salir lastimado".
Rayas
2

Para agregar una voz diferente:

Sí, si trabaja como lo describe, no hay problema con el uso rebasey el empuje forzado. El punto crítico es: tiene un acuerdo en su equipo.

Las advertencias rebasey amigos son para el caso donde no hay un acuerdo especial. Normalmente, git lo protege automáticamente, por ejemplo, al no permitir un empuje que no avance rápidamente. El uso rebasey el empuje forzado anulan esa seguridad. Eso está bien si tienes algo más en su lugar.

En mi equipo, a veces también cambiamos las ramas de características si la historia se ha vuelto desordenada. O eliminamos la rama anterior y hacemos una nueva con un nombre nuevo, o simplemente coordinamos de manera informal (lo cual es posible porque somos un equipo pequeño y nadie más trabaja en nuestro repositorio).


Tenga en cuenta que el proyecto git en sí mismo también hace algo similar: tienen una rama de integración que se recrea regularmente, llamada "pu" ("actualizaciones propuestas"). Está documentado que esta rama se recrea regularmente y que no debe basar nuevos trabajos en ella.

sleske
fuente
1

Entonces, admito: tan pronto como hay una fuerza de empuje, existe el riesgo de cometer errores. Es verdad. Pero también hay muchas maneras de recuperarse de los errores, y realmente, en 3 años de desarrollo, no vi muchos errores de fuerza, y cuando sucedió, siempre encontramos una manera de recuperarnos adecuadamente.

La razón por la cual los usuarios de Git tienden a evitar el historial de mutación compartida es porque no hay una evitación o reparación automática de estos problemas. Tienes que saber lo que estás haciendo, y tienes que arreglar todo manualmente si te equivocas. Permitir que exactamente una persona haga fuerza de empuje no es intuitivo y contrario al diseño distribuido de Git. ¿Qué pasa si esa persona se va de vacaciones? ¿Alguien más posee temporalmente la sucursal? ¿Cómo sabes que no caminarán por todo lo que el dueño original estaba haciendo? Y en el mundo del código abierto, ¿qué sucede si el propietario de la sucursal se aleja gradualmente de la comunidad, sin irse oficialmente? Podría perder mucho tiempo esperando entregar la propiedad de la sucursal a otra persona.

Pero el problema real es este: si cometes un error y no te das cuenta de inmediato, los viejos compromisos eventualmente desaparecerán después de que haya transcurrido el tiempo suficiente. En ese momento, el problema puede ser irrecuperable (o al menos, potencialmente muy difícil de recuperar, dependiendo de cómo se vea su historia de respaldo: ¿hace copias de seguridad de las copias antiguas de su repositorio Git, es decir, no solo clones?).

Compare esto con el trabajo de evolución Changeset de Mercurial (que, debo señalar, aún no está terminado o es estable). Todos pueden realizar los cambios en el historial que deseen, siempre que los conjuntos de cambios no estén marcados como públicos. Estas enmiendas y rebases se pueden empujar y tirar con total impunidad, sin necesidad de un propietario de sucursal. No se eliminan datos nunca; todo el repositorio local es solo para agregar. Los conjuntos de cambios que ya no son necesarios se marcan como obsoletos, pero se mantienen indefinidamente. Finalmente, cuando arruinas tu historial (que se trata como una parte normal de tu flujo de trabajo diario), hay un comando ingenioso para limpiarlo automáticamente. Este es el tipo de UX que la gente espera antes de modificar la historia compartida.

Kevin
fuente
Estoy de acuerdo con esta "filosofía git" y también creo que las filosofías a veces pueden ser pirateadas :). Más en serio, como dije en los comentarios, eso fue hace 3 años, estaba en el caso particular de tener gerrit como una herramienta de revisión de código que actuaba como una herramienta de respaldo de facto, evitando tal pérdida dramática potencial. Ahora sigo pensando que rebase está bien cuando estás seguro de "controlar" una rama. Incluso en un proyecto de código abierto, si estoy desarrollando una función y abro una solicitud de extracción, "soy dueño" de ese RP, considero que tengo derecho a rebajar su rama, depende de mí no arruinar mi propio trabajo durante el rebase ... (1/2)
Joel
..., y si algunas personas quieren traer modificaciones a ese RP, entonces considero que deberían decírmelo primero, y es una cuestión de comunicación. (2/2)
Joel
PD: gracias por el enlace de evolución Changeset, eso es interesante
Joel
En realidad, rebase es como decir: "reescribamos todo mi trabajo desde cero (desde el último maestro), eliminando todo mi trabajo anterior". Si está bien para hacer eso, está bien para rebase.
Joel