¿Cuándo es un compromiso de control de versión demasiado grande? [cerrado]

61

He escuchado en varios lugares "No hacer confirmaciones grandes", pero en realidad nunca he entendido cuál es una confirmación "grande". ¿Es grande si trabajas en un montón de archivos incluso si están relacionados? ¿En cuántas partes de un proyecto deberías estar trabajando al mismo tiempo?

Para mí, tengo problemas para intentar hacer "pequeños compromisos", ya que olvido o creo algo que crea algo más que crea algo más. Entonces terminas con cosas como esta:

Made custom outgoing queue

Bot
-New field msgQueue which is nothing more than a SingleThreadExecutor
-sendMsg blocks until message is sent, and adds wait between when messages get
sent
-adminExist calls updated (see controller)
-Removed calles to sendMessage

Controller
-New field msgWait denotes time to wait between messages
-Starting of service plugins moved to reloadPlugins
-adminExists moved from Server because of Global admins. Checks at the channel,
server, and global level

Admin
-New methods getServer and getChannel that get the appropiate object Admin
belongs to

BotEvent
-toString() also show's extra and extra1

Channel
-channel field renamed to name
-Fixed typo in channel(int)

Server
-Moved adminExists to Controller

PluginExecutor
-Minor testing added, will be removed later

JS Plugins
-Updated to framework changes
-Replaced InstanceTracker.getController() with Controller.instance
-VLC talk now in own file

Various NB project updates and changes

---

Affected files
Modify  /trunk/Quackbot-Core/dist/Quackbot-Core.jar
Modify  /trunk/Quackbot-Core/dist/README.TXT
Modify  /trunk/Quackbot-Core/nbproject/private/private.properties
Modify  /trunk/Quackbot-Core/nbproject/private/private.xml
Modify  /trunk/Quackbot-Core/src/Quackbot/Bot.java
Modify  /trunk/Quackbot-Core/src/Quackbot/Controller.java
Modify  /trunk/Quackbot-Core/src/Quackbot/PluginExecutor.java
Modify  /trunk/Quackbot-Core/src/Quackbot/info/Admin.java
Modify  /trunk/Quackbot-Core/src/Quackbot/info/BotEvent.java
Modify  /trunk/Quackbot-Core/src/Quackbot/info/Channel.java
Modify  /trunk/Quackbot-Core/src/Quackbot/info/Server.java
Modify  /trunk/Quackbot-GUI/dist/Quackbot-GUI.jar
Modify  /trunk/Quackbot-GUI/dist/README.TXT
Modify  /trunk/Quackbot-GUI/dist/lib/Quackbot-Core.jar
Modify  /trunk/Quackbot-GUI/nbproject/private/private.properties
Modify  /trunk/Quackbot-GUI/nbproject/private/private.xml
Modify  /trunk/Quackbot-GUI/src/Quackbot/GUI.java
Modify  /trunk/Quackbot-GUI/src/Quackbot/log/ControlAppender.java
Delete  /trunk/Quackbot-GUI/src/Quackbot/log/WriteOutput.java
Modify  /trunk/Quackbot-Impl/dist/Quackbot-Impl.jar
Modify  /trunk/Quackbot-Impl/dist/README.TXT
Modify  /trunk/Quackbot-Impl/dist/lib/Quackbot-Core.jar
Modify  /trunk/Quackbot-Impl/dist/lib/Quackbot-GUI.jar
Modify  /trunk/Quackbot-Impl/dist/lib/Quackbot-Plugins.jar
Modify  /trunk/Quackbot-Impl/lib/javarebel.stats
Add /trunk/Quackbot-Impl/lib/jrebel.info
Modify  /trunk/Quackbot-Impl/nbproject/private/private.properties
Modify  /trunk/Quackbot-Impl/nbproject/private/private.xml
Modify  /trunk/Quackbot-Impl/nbproject/project.properties
Modify  /trunk/Quackbot-Impl/plugins/CMDs/Admin/reload.js
Add /trunk/Quackbot-Impl/plugins/CMDs/Operator/hostBan
Modify  /trunk/Quackbot-Impl/plugins/CMDs/Operator/mute.js
Modify  /trunk/Quackbot-Impl/plugins/CMDs/lyokofreak/curPlaying.js
Modify  /trunk/Quackbot-Impl/plugins/CMDs/lyokofreak/lfautomode.js
Modify  /trunk/Quackbot-Impl/plugins/listeners/onJoin.js
Modify  /trunk/Quackbot-Impl/plugins/listeners/onQuit.js
Modify  /trunk/Quackbot-Impl/plugins/testCase.js
Add /trunk/Quackbot-Impl/plugins/utils/whatsPlaying.js
Modify  /trunk/Quackbot-Impl/src/Quackbot/impl/SandBox.java
Add /trunk/Quackbot-Impl/vlc_http
Add /trunk/Quackbot-Impl/vlc_http/current.html
Modify  /trunk/Quackbot-Plugins/dist/Quackbot-Plugins.jar
Modify  /trunk/Quackbot-Plugins/dist/README.TXT
Modify  /trunk/Quackbot-Plugins/dist/lib/Quackbot-Core.jar
Modify  /trunk/Quackbot-Plugins/nbproject/private/private.properties
Modify  /trunk/Quackbot-Plugins/nbproject/private/private.xml
Modify  /trunk/Quackbot-Plugins/src/Quackbot/plugins/JSPlugin.java
Add /trunk/Quackbot-Plugins/vlc_http
Add /trunk/global-lib/jrebel.jar

Sí ....

Entonces para preguntas:

  • ¿Cuáles son algunos factores para cuando un compromiso se vuelve demasiado grande ( cosas no obvias )?
  • ¿Cómo puedes prevenir tales compromisos? Por favor, especifique
  • ¿Qué pasa cuando estás en etapas de desarrollo semi-tempranas cuando las cosas se mueven rápidamente? ¿Son enormes los cometidos todavía bien?
pregunta TheLQ 12.10.2010 - 03:47

19 respuestas

65
  

Para mí, tengo problemas para intentar hacer "pequeños compromisos", ya que olvido o creo algo que crea algo más que crea algo más.

Eso es un problema. Parece que necesitas aprender para dividir tu trabajo en partes más pequeñas y manejables.

El problema con las grandes confirmaciones son:

  • En un proyecto de varias personas, existe una mayor probabilidad de que sus confirmaciones causen conflictos para que otros desarrolladores lo resuelvan.
  • Es más difícil describir con precisión lo que se ha hecho en los mensajes de registro.
  • Es más difícil rastrear el orden en que se realizaron los cambios y, por lo tanto, comprender la causa de los problemas.
  • Aumenta la probabilidad de perder mucho trabajo no comprometido.

A veces, las grandes confirmaciones son inevitables; p.ej. Si tienes que cambiar una API importante. Pero ese no es normalmente el caso. Y si se encuentra en esta situación, probablemente sea una buena idea crear una sucursal y hacer su trabajo allí ... con muchos compromisos pequeños ... y reintegrarse cuando haya terminado.

(Otro caso es cuando haces una importación inicial, pero eso NO es problemático desde la perspectiva de los problemas mencionados anteriormente).

    
respondido por el Stephen C 10.10.2010 - 16:30
38

El principio de responsabilidad única.

Cada confirmación de control de fuente debe servir solo para un propósito. Si tiene que poner la palabra "y" o "también" en su resumen, debe dividirlo.

Es muy común terminar con muchos cambios independientes o no relacionados en su copia de trabajo. Esto se conoce como el "problema de la copia de trabajo enmarañada", y en realidad es muy difícil de evitar incluso para los desarrolladores disciplinados. Sin embargo, Git y Mercurial te ofrecen herramientas para resolverlo: git add -p o selección de trozos y colas mercuriales en TortoiseHg respectivamente.

    
respondido por el jammycakes 20.01.2011 - 00:23
25

Imagine que el cliente pidió que se hiciera un cambio en particular, por ejemplo, para agregar una regla de que algo u otro no se puede hacer dentro de los dos días posteriores a la fecha "cualquiera que sea". Luego, después de haber hecho el cambio, cambian de opinión. Usted querrá revertir su compromiso. Si todo se complica con algunas cosas acerca de cambiar el orden de los informes no relacionados, tu vida es una miseria.

Un elemento de trabajo, un conjunto de cambios. Una solicitud del cliente, un conjunto de cambios. Una cosa sobre la que podrías cambiar de opinión, un conjunto de cambios. A veces eso significa que es una sola línea de código. A veces son diez archivos diferentes, incluido el esquema de base de datos. Esta bien.

    
respondido por el Kate Gregory 10.10.2010 - 21:11
10

Las confirmaciones grandes se producen cuando hay toneladas de cambios que no todos van en el mismo grupo. Si cambio la lógica del controlador, entonces el modelo de conexión de la base de datos, entonces algunos misc. Scripts, no debería estar empaquetando todo en un solo commit.

La prevención es hacer compromisos de acuerdo con lo que estás completando. En el ejemplo anterior, yo cometería después de la lógica del controlador, después del trabajo de la base de datos y después de los scripts. No deje de comprometerse simplemente porque usted sabe lo que cambió. Otras personas volverán a mirar tu "Cosas cambiadas" para enviar el mensaje de confirmación y se preguntarán qué estabas fumando.

Las importaciones iniciales son probablemente los mayores compromisos que deberías tener. ¿Configurando un sistema desde cero? Claro que tienen algunos grandes compromisos. Después de nivelarlo, es hora de mantener las cosas organizadas.

    
respondido por el Josh K 10.10.2010 - 07:05
7

Si sabe de antemano que va a trabajar en una gran parte del código, le sugeriría que cree una rama para su función específica mientras que periódicamente extrae el código de la línea principal para asegurarse de que su código permanezca sincronizado. Cuando haya terminado de trabajar en la rama, vuelva a fusionar todos los cambios en la línea principal. De esta manera, otros miembros del equipo no se sorprenderán o molestarán cuando vean un gran compromiso. Además, hay muchas menos posibilidades de romper cosas. Sigue practicando para dividir las cosas en compromisos más pequeños. Con el tiempo se convertirá en una segunda naturaleza.

    
respondido por el ysolik 10.10.2010 - 08:08
7

Este ejemplo muestra una confirmación que es demasiado grande.

Como regla general, describa el cambio en una oración o una línea de texto. (De acuerdo con esta regla, el compromiso debe dividirse en 10-15 más pequeños). Si no puede comentar adecuadamente un compromiso en una línea, ya es demasiado grande.

Para practicar confirmaciones más pequeñas, tome notas en su bloc de notas (o en el Bloc de notas) de lo que ya ha cambiado o agregado. Confirme antes de que se convierta en una lista larga o antes de realizar un cambio de código no relacionado con lo que ya tiene en el bloc de notas.

    
respondido por el azheglov 11.10.2010 - 04:41
5

Lo que realmente importa no es el tamaño del compromiso, es el alcance del cambio lo que debe determinar cómo están organizados sus compromisos.

Puede, por ejemplo, cambiar cada instancia de __macro1 a __macro2 en una base de código grande, que cambia 200 archivos. 200 compromisos no serían sanos en ese caso.

Lo que quieres terminar es poder extraer el repositorio en cualquier revisión individual y tener el trabajo de compilación. ¿Cambió de libfoo a libbar ? Espero que el cambio incluya la actualización de sus scripts de compilación y Makefiles también (o lo que sea aplicable).

A veces, es posible que deba realizar una serie de cambios experimentales que logren una cosa, en cuyo caso, debe determinar qué ámbito es más importante para usted si necesita revertir más adelante. ¿Depende uno del otro? Comprométalos todos a la vez en una sola revisión. De lo contrario, en ese caso, sugeriría un compromiso por cambio. Deberías estar haciendo algo así en otra rama, o en otro repo de todos modos.

Mientras que sí, tiene el poder de revertir un solo archivo a una revisión previa (lo que hace que un archivo sea más extenso), al hacerlo se arruinan herramientas como la bisección más adelante y se contamina el historial. .

Si te detienes y piensas "Ok, pasan las pruebas, creo que esto funciona ... pero si va mal, ¿puedo hacerlo fácilmente?" .. terminarás haciendo compromisos sensatos.

    
respondido por el Tim Post 15.10.2010 - 11:57
5

En mi campo (modelado de física), descubrí un error en la salida de hoy que no estaba en el repositorio hace 6 meses. Cuando esto suceda, haré una búsqueda binaria en las revisiones:

  1. Ejecutar modelo desde hace 3 meses
  2. Si el error aún está en la salida, ejecute el modelo desde hace 4.5 meses
  3. ... repita hasta que encuentre el compromiso que cede en resultados incorrectos

Cuando el error se introdujo en una comisión monstruosa, tengo que sentarme con un peine de dientes finos para encontrar el origen del problema. Si la confirmación tocó un pequeño número de archivos, es menos doloroso rastrear la (s) línea (s) de código que introdujo el problema.

Recomendaría dividir su problema en una serie de tareas más pequeñas (lo ideal sería poner cada tarea en un rastreador de errores). Haga un compromiso al completar cada tarea (y cierre ese error / característica en su rastreador de errores).

    
respondido por el Pete 15.10.2010 - 23:16
4

Lo que hay que entender aquí es que "Grande" en este contexto tiene que ver con el número de cambios distintos, no con el tamaño físico de la confirmación (aunque generalmente los dos van de la mano).

No es tan una cuestión de "no cometer grandes compromisos" como hacer hacer pequeños compromisos: el ser ideal para realizar pequeños cambios independientes.

Desde el registro de cambios queda claro que tienes una serie de cosas que podrían haberse cometido por separado (y con seguridad) y, por lo tanto, es bastante evidente que es demasiado grande.

La razón por la que esto puede ser un problema es que su último compromiso es su punto de referencia para los cambios que está realizando actualmente y, por ejemplo, si obtiene el primer bit correcto y luego el siguiente bit incorrecto, habrá no es una manera fácil de hacer que su trabajo vuelva al punto en el que comenzó a cometer errores (BTDTGTTS).

Por supuesto, a veces los cambios solo son grandes, refactorización a gran escala, y como lo sugieren otros, aquí es donde debe ramificarse, de esa manera, aunque sus confirmaciones individuales pueden romper las cosas, se separan del tronco principal de desarrollo para que no se No es un problema y puede continuar comprometiéndose temprano y con frecuencia.

Una cosa más: si aparece algo en medio de tu trabajo que requiere una atención más inmediata, debes cambiarlo por separado (idealmente en un conjunto de carpetas completamente distinto) y enviarlo por separado.

El verdadero desafío en todo esto no es la mecánica, es la mentalidad: que un compromiso no es solo una copia de respaldo que se realiza de vez en cuando, sino que cada compromiso es una piedra en el camino y que no hay nada. está mal con un montón de pequeñas confirmaciones y el hecho de que mezclar diferentes cosas en una mafia de comillas es tan malo como una munición de partes de la funcionalidad vagamente relacionadas en un montón de código.

    
respondido por el Murph 10.10.2010 - 12:42
4

Como mínimo, prepárese para comprometerse cada vez que piense: "Me gusta mi progreso hasta ahora, y no quiero perderlo si los cambios que estoy a punto de hacer son un desastre". Luego tiene la opción de aprovechar el VCS para eliminar cualquier callejón sin salida que haya intentado o el código especial de depuración que agregó para localizar un problema. (por ejemplo, con git reset --hard o rm -rf *; svn update )

    
respondido por el Ken Bloom 11.10.2010 - 05:29
2

No hay una regla estricta y rápida, no hay una línea divisoria más allá de la cual tu compromiso es demasiado grande.

Hay es , sin embargo, existe una pauta de que las confirmaciones más pequeñas son mejores, dentro de lo razonable (es decir, cometer cada línea es probablemente excesivo).

Tengo en cuenta este tipo de pautas:

  • Un solo compromiso debe incluir cambios para una sola corrección de errores
  • Un solo compromiso no debe incluir más de medio día de trabajo
  • Un solo compromiso no debería romper la compilación

Por supuesto, esto es lo que tengo en cuenta: YMMV. Diferentes desarrolladores favorecen diferentes niveles de granularidad.

    
respondido por el Bevan 10.10.2010 - 20:31
1

Cuanto más pequeño sea el compromiso, más fácil será encontrar exactamente de dónde proviene una posible regresión.

Idealmente, una confirmación debería ser atómica , en el sentido del cambio coherente más pequeño en la base del código (relacionado con un error, una característica, etc.).

En cuanto a las sugerencias específicas para mantener el tamaño del compromiso pequeño, depende en gran medida de su VCS y de su configuración: debe poder realizar el compromiso local o trabajar en su propia sucursal en el servidor.

La clave es comprometerse con su rama "privada" cada vez que realiza un cambio atómico, y luego puede combinar su rama regularmente, por ejemplo, todas las semanas.

Al usar un DVD, su flujo de trabajo podría verse así:

code code code
git commit       // create commit locally with meaningful message
code code code
git commit       // create commit locally with meaningful message
code code code
git commit       // create commit locally with meaningful message
...
git push         // push your previous commits to the team server

Usando un vcs centralizado:

svn copy trunk my_feature_branch  // create your private branch
svn co my_private_branch          //
code code code
svn commit                        // commit on your private branch with meaningful comment
code code code
svn commit                        // commit on your private branch with meaningful comment
code code code
svn commit                        // commit on your private branch with meaningful comment
...
svn merge my_feature_branch trunk  // all your previous commit are merged to main/master branch
    
respondido por el Xavier T. 20.01.2011 - 10:56
0

Probablemente has escuchado el dicho de que la perfección es cuando no puedes quitar nada más. Eso también debe describir su estándar para el tamaño de compromiso.

Depende de tu proyecto donde esté el tamaño "perfecto". Si está enviando a clientes externos, un buen tamaño podría ser el incremento más pequeño con el que se sentiría cómodo si no terminara el siguiente a tiempo. Si está creando aplicaciones internas, implementadas con frecuencia, el mejor tamaño podría ser el incremento más pequeño que no rompa nada (y lo acerca más a donde quiere estar).

Los modernos sistemas de control de versiones lo ayudan a crear buenos compromisos con bifurcaciones fáciles, rebasado interactivo, área de preparación, etc.

    
respondido por el Peter Eisentraut 10.10.2010 - 11:20
0

Los mensajes de confirmación deben ser de una sola línea (y para git max 60 chars). La cantidad de código que se confirma debe ser lo suficientemente pequeña para mantener el mensaje descriptivo dentro de ese límite.

Tiendo a comprometerme cada vez (incluso más ahora que hemos cambiado a git) Me han hecho una buena parte, ya que permite capturar el "por qué" las cosas se hicieron de esta manera.

    
respondido por el user1249 10.10.2010 - 20:43
0

A veces, has estado trabajando todo el día en varios cambios diferentes lógicamente diferentes, y olvidaste ingresar tu código en el medio. El uso de git citool puede ser muy útil para dividir su trabajo en partes del tamaño de un bocado al final del día, incluso si no fue tan cuidadoso durante el día mientras trabajaba.

git citool puede permitirle seleccionar qué fragmentos específicos de un archivo (o qué líneas específicas) cometer en un compromiso en particular, para que pueda dividir (no superpuestos) los cambios realizados en el mismo archivo en varios confirmaciones.

(Parece que usas Subversion. No conozco una herramienta que haga esto para Subversion, pero podrías utilizar el uso de git-svn , el adaptador de Subversion para git, que cambiará tu vida).

    
respondido por el Ken Bloom 11.10.2010 - 05:23
0

Cuanto mayor sea el compromiso, es más probable que rompas la compilación y el resto de tu equipo te pague. Intento realizar cambios dos veces al día. Justo antes del almuerzo y antes de irme a casa. Así que a las 12 pm y a las 4:30 pm trato de que todo funcione y esté listo para comprometerse. Encuentro que esta práctica me funciona.

    
respondido por el Nickz 11.10.2010 - 07:21
0

Para responder a sus preguntas:

1) Para mí, el compromiso estándar se considera grande si está haciendo más de una cosa. En realidad, me refiero a corregir un error o agregar una función.

2) Prevenga tales compromisos convirtiéndolo en un hábito y una regla para cometer cada vez que termine algo.

3) En las primeras etapas de desarrollo, permito que los compromisos incluyan la primera creación de los archivos que se utilizarán más adelante.

Me gustaría tener en cuenta que al finalizar quiero decir que todos los errores que puedes identificar se han solucionado y que no se romperá la compilación al comprometerse.

Sí, esto genera una gran cantidad de confirmaciones, pero le permite revertir exactamente lo que rompió las cosas en lugar de tener que revertir una gran serie de cambios que se cometieron al mismo tiempo donde solo uno de los cambios está causando un problema .

También me gustaría señalar que las reglas cambian un poco para los sistemas de control de versiones distribuidas (DVCS) como Mercurial y Git. En el caso de que uses uno de esos, te comprometes siempre que hayas realizado un cambio, pero aún no lo hayas probado y luego ingresas al repositorio central cuando está funcionando. Esto es preferible, ya que le permite revisar más cambios en su código sin tener que preocuparse por romper la compilación.

    
respondido por el indyK1ng 20.01.2011 - 17:51
0

En mi caso, estoy intentando enviar archivos de un servidor al sistema de repositorio (SVN). Este es el compromiso inicial y no quiero descargarlo porque es un proyecto muy grande (unos pocos GB) y quiero realizar el compromiso inicial desde el servidor de los clientes.

El problema es que el cliente está en un servidor compartido, el cliente svn muere (o cualquier otro software) si se ejecuta más de un minuto.

Una alternativa sería descargar el proyecto en mi computadora y hacer la confirmación inicial desde allí, pero me interesa saber si hay una opción en SVN para dividir la confirmación grande en algo más, similar a los métodos de transacción.

El desarrollador antes que yo nunca usó un sistema de control de versiones.

    
respondido por el CGeorges 24.03.2013 - 15:12
-1

La compañía para la que trabajo obliga a una revisión del código de pares para cada confirmación. Por lo tanto, cualquier compromiso que haga que sea difícil para un par averiguar lo que está pasando y revisar en un tiempo razonable, es demasiado grande.

    
respondido por el Uri 20.01.2011 - 05:56

Lea otras preguntas en las etiquetas