2012-05-04 31 views
6

Todos los estándares de codificación y buenas prácticas hablan aparte, ¿cómo es que Git sí mismo se ocupa técnicamente de grandes commits vs commits pequeños. Por ejemplo, ¿Git es más inteligente con fusiones de sucursales (por ejemplo, menos conflictos) con cualquiera de los casos, la recolección de basura se vuelve más eficiente o algo similar? ¿O hay alguna diferencia?El rendimiento de Git con Big Commits contra commits pequeños

Para ser claro, me refiero al escenario cuando el código se está modificando de A a B, y el "compromiso enorme" es simplemente cambiar el código de A a B, mientras que el "pequeño compromiso" tiene una gran cantidad de intermedios commits (por ejemplo, para cada pequeño cambio de característica), pero eventualmente terminan exactamente en el mismo B.

+0

+1: Esta es una pregunta importante para aquellos que tienen que operar en una operación corporativa de revisión antes del compromiso que tiende a ralentizar el ciclo de confirmación. Puede depender de la medida del "tamaño" y del estilo de cambio. Supongo que un límite de media docena de conflictos de combinación básicos, o un cambio funcional como un pequeño límite <-> probablemente pequeño. –

Respuesta

4

Los "muchos commits pequeños" usarán un poco más de espacio, pero la diferencia probablemente no valga la pena pagar el precio de la historia perdida .

El efecto en el archivo packfile dependerá de la cantidad de cambios que no se hayan modificado posteriormente. Por ejemplo, si una confirmación posterior toca líneas que una confirmación anterior también tocó, el estado intermedio de esas líneas no sería visible en el historial con una confirmación grande, y por lo tanto no habría ningún objeto en el archivo de paquete para representarlas.

No puedo imaginar que la cantidad de confirmaciones en una sucursal reduzca o aumente la complejidad de la fusión; pero no puedo hablar con autoridad sobre eso ya que no he examinado exactamente cómo se realiza la fusión típica por recursivo. Según entiendo, es equivalente a un diff3 desde el último punto en el que se combinaron (o dividieron). En ese caso, un compromiso grande no sería más o menos eficiente que muchos compromisos pequeños.

Hay otro aspecto a considerar, dependiendo del tiempo. Si está trabajando en una sucursal y fusionando regularmente la sucursal ascendente entre sus propios commits, entonces muchos commits pequeños producirán menos conflictos porque mantendrá una mejor paridad con la rama ascendente, y por lo tanto se apartará menos de ella. Esto ciertamente causará menos problemas cuando sea el momento de fusionar.

La recolección de basura no se vería afectada en gran medida, ya que en ambos casos, no hay compromisos suspendidos u objetos sueltos inherentes en ninguno de los métodos.

En general, sin embargo, los paquetes de archivos suelen ser lo suficientemente eficaces cuando se trata de texto que el beneficio de poder ver un historial completo y sin adulterar a menudo supera el costo del espacio adicional que toma.

+1

Creo que esto podría tener un efecto en los conflictos de combinación en que un gran compromiso causará un gran conflicto de fusión, difícil de administrar. Si bien muchos commits pequeños causarán muchos pequeños conflictos de fusión, que deberían ser más fáciles de tratar. – svick

+0

@svick Has leído mi mente. Acabo de agregar la parte sobre poder mantener una mejor paridad antes de ver tu comentario :) – Greyson

Cuestiones relacionadas