tipos tag remove practices etiquetas crear best git version-control

tag - ¿Cuáles son tus pros y contras de git después de haberlo usado?



git tag best practices (13)

Estoy usando SVN en este momento, y he usado CVS y VSS en el pasado. SVN es el favorito actual en mis libros, pero he estado oyendo mucho sobre git. De las personas que han usado git, ¿cuáles son los pros y los contras de su experiencia?


Gran pregunta, he estado usando SVN por bastante tiempo, y me siento muy cómodo con eso. Pero tuve que usar Git un par de veces para obtener el código fuente de diferentes proyectos de código abierto. Todavía no me he tomado el tiempo para realmente aprender sobre eso. ¿Vale la pena?

También me gustaría preguntar cuáles son las ventajas de usar control de versión distribuida sobre un VCS normal como subversión.


El soporte de Windows es espantoso, así que me mudé a Mercurial , otro DVCS que es tan bueno.

Los beneficios de DVCS se hacen aparentes cuando, por ejemplo, tiene un repositorio en su servidor en la oficina y está trabajando en el sitio. Ser capaz de comprometerse localmente sin acceso a la oficina de su servidor (y esta reversión cuando sea necesario) es brillante.


No tengo mucha experiencia con git, pero:

Pros:

  • Es realmente rápido
  • Local commits rock
  • Rápido para iniciar un nuevo repositorio (sin configuración, etc.)
  • github es fácil de usar

(Realmente no he "necesitado" el lado distribuido de las cosas, más allá de poder tener un repositorio local y pasar a uno público).

Contras:

  • Creo que el soporte de Windows aún se está quedando atrás, y no puedes usarlo desde un símbolo del sistema normal
  • La falta de integración con IDE y Explorer
  • Me tomó un tiempo encontrar un buen texto introductorio en la línea del libro redbean.
  • El hecho de que "agregar" un archivo modificado solo agregue los contenidos en ese punto de tiempo (para que pueda aparecer como preparado para la confirmación y aún tener modificaciones que requieran otro git add ) tomó un tiempo para comprender

Skeet tiene la mayoría de ellos, pero:

Pro:

  • ¡Derivación! Es mucho mejor trabajar en fragmentos de funcionalidad en ramas separadas y aún así poder controlar las versiones que tener múltiples cosas en una rama. Y una vez que hayas decidido que te gusta la ramificación, debes amar lo fácil que Git lo hace en comparación con SVN

Pro:

  • Rápido, muy rápido.
  • Crear un nuevo repos es muy fácil en comparación con SVN
  • El repositorio completo se encuentra en una sola carpeta .git - no agregará una carpeta .SVN en cada carpeta de tu código (no es un gran problema, pero me gusta)
  • La ramificación es más fácil
  • GitHub!

Contras:

  • No se puede verificar una parte del repositorio (como una sola carpeta o solo un archivo)
  • No rastrea las carpetas vacías
  • Soporte de Bad Windows (no me molesta mucho, uso Linux)
  • Todavía no he encontrado una buena herramienta GUI para Git (uso KDESVN para SVN). No es un gran problema si te sientes cómodo con CLI.

La última versión de Git puede funcionar directamente en el símbolo del sistema de Windows, que es cómo lo uso. El proceso es bastante trivial para mí ahora.

También tengo instalado Git en un disco duro externo y en mi jumpdrive. Cuando en una computadora nueva, ejecuto un script que establece temporalmente la ruta para incluir las herramientas de Git. ¡Entonces puedes continuar desarrollando!


La fusión es mucho más simple en git ya que la creación de ramas es la opción predeterminada, no una opción adicional. Entonces, cuando tienes que fusionar algo, simplemente lo comprometes y luego unes las dos ramas (la existente y la nueva que git creó automáticamente para tu última comprobación).

Además, cuando usas git, siempre tienes todo el repositorio contigo. Puede registrarse mientras está fuera de línea y fusionarse más tarde (ya que la fusión es mucho más simple).

El inconveniente es que GIT es casi inutilizable en una unidad USB en Windows. Windows desactiva el almacenamiento en caché de estos y GIT funciona con millones de archivos pequeños. Además, todavía falta soporte de IDE. No estoy seguro de que esto último sea realmente un problema. La interfaz de usuario que viene con GIT es bastante agradable.

Además, no estoy 100% contento de que tengas que "agregar" archivos existentes todo el tiempo [EDIT] y la enorme cantidad de características. Para un principiante, son abrumadores y a menudo no está claro por qué querría utilizar una determinada opción / comando. Quiero decir, CVS viene con, digamos, 20 comandos. GIT viene con 73 y cada uno tiene muchas opciones (y eso sin contar los comandos de plomería ...).


Mucha gente lo negaría, pero la elección de la herramienta de administración del código fuente influye en la forma en que trabajas. Solía ​​trabajar mucho con Subversion, hasta que descubrí a Git por mí. Evité principalmente la ramificación en Subversion. Cuando no podía evitarlo, prefería configurar un espejo local (usando svk). Mientras que la bifurcación se realiza fácilmente tanto en Subversion como en Git, solo Git hace que la fusión (¡y el rebase!) Sea divertido, Subversion siempre ha sido un dolor real a la hora de fusionarse.

Lo segundo que realmente me gusta de Git (aparte de todos los puntos que ya se han mencionado) es el "índice", un área de preparación que contiene su próxima confirmación, y la posibilidad de agregar solo fragmentos únicos de un archivo modificado a la misma.


Otras Consideraciones:

Pros:

  • Flexible: no aplica uno, verdadero flujo de trabajo
  • Tan rápido que el control de versiones se convierte en una tarea menor
  • Ramas livianas, fácil fusión y zona de preparación permiten flujos de trabajo personalizados
  • Mas poderoso
  • Reposiciones muy compactas

Contras:

  • Sin controles de acceso incorporados
  • Herramientas débiles para archivos binarios. No compacta los cambios en los archivos binarios en el repositorio y el almacenamiento de los archivos binarios evita el manejo automático de los finales de línea en Windows.
  • Puede ser más difícil de aprender porque es más flexible y más poderoso. No siempre sigue la semántica CVS / SVN y no está organizado alrededor de archivos.

Trabajar con git es muy diferente de trabajar con otros sistemas de control de versiones.

Tener un repositorio local es muy importante. Significa que puede usar toda la potencia del sistema de control de versiones (y esto es mucho con git) sin molestar a nadie. Si hay un problema controvertido en su proyecto, puede trabajar en él de forma privada, creando ramas, apilando parches y puliéndolos. De esa forma, puede regresar con un parche planchado. Pero incluso en "funcionamiento normal" es mucho mejor si puede limpiar sus parches antes de mostrarlos al público y, de hecho, la eliminación de errores es mucho más fácil si tiene parches sanos y no solo instantáneas de "fin de día".

Antes de comprometer un conjunto más grande de parches, normalmente reordenar los parches y comprimir las correcciones de errores en mi nuevo código directamente en el parche. Entonces los parches parecen no haber cometido ningún error. Después de eso, mi rama privada se actualiza en HEAD y luego se presiona. Por lo general, nunca utilizo una combinación, ya que solo complica la historia.

En resumen: permite mantener tu historial limpio.

Esto le da una visión muy diferente de su trabajo. Le permite ver el estado actual como una adición de parches individuales que crean un historial que no es solo un registro, sino algo que usted pone allí a propósito. Los conjuntos de parches son los ladrillos de los que construye su aplicación, y se mueven al lugar correcto si es necesario.

Nunca volvería voluntariamente a ningún otro sistema de control de versiones que use antes de git o cualquier sistema de control de versiones que no sea compatible con rebase y las ramas y compromisos locales.


Numero de Comandos

Mientras que svn y otros VCS modernos como hg u otros son buenas y útiles herramientas, git es una tienda llena de máquinas-herramienta. Esto cuenta como pro y como estafa al mismo tiempo. Mientras que svn tiene 30 comandos (según ''svn help''), git envía 130 páginas de manual con más o menos cada una de ellas describiendo un solo comando. Una razón para esto es que git expone las funciones de nivel más bajo que la mayoría de los usuarios necesitarán como herramientas de línea de comandos. Pero incluso sin esos comandos de bajo nivel, Git envía muchas herramientas muy potentes y no se encuentran en ningún otro VCS que conozco (ver git-bisect , git-filter-branch , git-cherry o git-reset para ver ejemplos). Si bien es muy útil tener esas herramientas a mano, es bastante difícil para los principiantes entender qué comando necesitan y necesitan saber y cuáles no.

Modelo de desarrollo

Un tema similar es que git es lo suficientemente potente como para admitir modos de operación muy diferentes. Esto hace que sea difícil para los principiantes ya que no hay realmente un documento de "mejores prácticas" ya que la mejor práctica no es construir en git. Entonces debes decidir tú mismo si

  • Solo use fusiones para evitar conflictos con usted.
  • Utilice ramas privadas que se vuelven a establecer en HEAD upstream
  • Utilizar ramas de origen
    • que se fusionan regularmente (peces voladores)
    • se fusionó cuando terminó
  • Utilice un árbol de un mantenedor de proyecto, mantenedores de árbol, mantenedores de subsistemas, mantenedores de controladores y colaboradores con cada nivel extrayendo los parches del nivel siguiente (kernel de Linux)

Como tiene su repositorio local, incluso puede usar un modo de operación muy diferente al proyecto en el que está trabajando y simplemente ajustar sus conjuntos de cambios antes de empujarlos / publicarlos.

Camino de los cambios

Otra cosa que también cuenta como pro y contra según su punto de vista es que trabajar con git es más complicado que con cualquier VCS centralizado y aún más complicado que otros VCS distribuidos.

Con VCS centralizado, normalmente solo hace una confirmación y los cambios que realiza van al repositorio. En git, los cambios pueden pasar por un número bastante grande de pasos antes de que terminen en su destino final. Los pasos típicos son (pasos no tan comunes entre paréntesis):

  • Dir de trabajo (edición)
  • Índice aka área de preparación (git add)
  • Repositorio local (commit git)
  • (Otra rama local) (git rebase, git cherry-pick, git merge)
  • (repositorio del sub mantenedor) (git push, git pull, mail)
  • Repositorio en sentido ascendente (git push, git pull, mail)

Como puede omitir el índice, hay al menos 2 pasos involucrados, pero por lo general hay más. Esto requiere una comprensión más profunda de lo que estás haciendo y escribir muchos más comandos. Por otro lado, esto le da control sobre cada uno de estos pasos. Usted puede

  • decidir qué juncos / líneas van a entrar en el compromiso y cuáles no
  • decide qué parches quieres en cuál de tus sucursales locales
  • decidir cuáles de tus parches están publicados
  • Rehacer, aplastar, arreglar, dividir, reordenar los parches antes de publicarlos
  • decide en qué personas confías y acepta parches de
  • delegue partes del proyecto a otro mantenedor de confianza.

Todo este poder y las decisiones hacen que sea difícil para los principiantes comenzar con git. Una vez que se dominan, dan un enorme control sobre el código.

Acceso de escritura

Un profesional importante para cualquier VCS distribuido es que los contribuyentes no requieren acceso de escritura para beneficiarse del VCS. Todos los que tienen acceso de lectura pueden simplemente clonar el repositorio, crear ramas cuando sea necesario y comenzar a apilar conjuntos de parches puestos. Trabajar con cvs sin acceso de escritura es un verdadero dolor - con git no hay una gran diferencia en cómo obtener sus parches. Esto no solo es una ventaja técnica sino que también ahorra discusiones complicadas sobre si este noobie realmente debería tener acceso de escritura.



Pros:

  • todo lo mencionado anteriormente

Contras:

  • comportamiento extraño de autocrlf en Windows

  • imposibilidad de mover / cambiar el nombre del archivo o dir insode repo y kepp su historial de commit ( git mv simplemente elimina el archivo del repositorio, lo renombra y lo agrega al repositorio de nuevo, perdiendo así todo el historial)