trucos tag que name hace conectar con commits commands comentarios codigos git version-control cvs

tag - Diferencia entre GIT y CVS



git tag name (6)

"Usar feliz CVS por más de x años", es una idea interesante :-) Es un gran paso adelante por mantener muchas copias, pero ...

Supongo que te has acostumbrado a todos sus caprichos, o no haces muchas ramificaciones y uniones. Hay una posibilidad peor;

Las personas de su organización se han acostumbrado a las limitaciones de los cvs y sus prácticas laborales se han adaptado en consecuencia;

por ejemplo, nunca tener más de un desarrollador trabajando en un paquete a la vez, solo usando derivaciones en emergencias, etc.

El principio básico es que cuanto más difícil es algo, menos gente lo hace.

¿Cuál es la diferencia entre los sistemas de control de versiones de Git y CVS?

He estado felizmente usando CVS por más de 10 años, y ahora me han dicho que Git está mucho mejor. ¿Podría alguien explicar por favor cuál es la diferencia entre los dos y por qué uno es mejor que el otro?



Git es un DVCS , a diferencia del CVS que es centralizado. La descripción simplificada será: usted obtiene todos los beneficios del control de versión cuando no está conectado a ninguno de los múltiples repositorios posibles, además las operaciones son más rápidas.


La principal diferencia es que (como ya se dijo en otras respuestas) CVS es (antigua) sistema de control de versiones centralizado, mientras que Git se distribuye.

Pero incluso si usa el control de versiones para un único desarrollador, en una sola máquina (cuenta única), existen algunas diferencias entre Git y CVS:

  • Configurando el repositorio . Git almacena el repositorio en .git directorio .git en .git directorio principal de su proyecto; CVS requiere la configuración de CVSROOT, un lugar central para almacenar información de control de versiones para diferentes proyectos (módulos). La consecuencia de ese diseño para el usuario es que importar fuentes existentes al control de versiones es tan simple como "git init && git add. && git commit" en Git, mientras que es más complicado en CVS.

  • Operaciones atómicas Debido a que CVS al principio era un conjunto de scripts alrededor del sistema de control de versiones RCS por archivo, las confirmaciones (y otras operaciones) no son atómicas en CVS; si una operación en el repositorio se interrumpe en el medio, el repositorio puede dejarse en un estado inconsistente. En Git todas las operaciones son atómicas: o tienen éxito como conjunto, o fallan sin ningún cambio.

  • Conjuntos de cambios Los cambios en CVS son por archivo, mientras que los cambios (confirmaciones) en Git siempre se refieren a todo el proyecto. Este es un cambio de paradigma muy importante. Una de las consecuencias de esto es que es muy fácil en Git revertir (crear un cambio que deshace) o deshacer todo el cambio; Otra consecuencia es que en CVS es fácil hacer revisiones parciales, mientras que actualmente es casi imposible en Git. El hecho de que los cambios se realicen por archivo y se agrupen dio lugar a la invención del formato de registro de cambios de GNU para los mensajes de compromiso en CVS; Los usuarios de Git usan (y algunas herramientas de Git esperan) diferentes convenciones, con una sola línea que describe (resume) el cambio, seguido por una línea vacía, seguida de una descripción más detallada de los cambios.

  • Nombrar revisiones / números de versión . Hay otro problema relacionado con el hecho de que en CVS los cambios son por archivos: los números de versión (como se puede ver a veces en la expansión de palabras clave , ver a continuación) como 1.4 refleja la cantidad de tiempo que se ha cambiado el archivo. En Git cada versión de un proyecto como un todo (cada compromiso) tiene su nombre único dado por SHA-1 id; por lo general, los primeros 7-8 caracteres son suficientes para identificar una confirmación (no se puede usar un esquema de numeración simple para las versiones en el sistema de control de versiones distribuidas, que requiere autorización de numeración central). En CVS para tener un número de versión o un nombre simbólico que se refiera al estado del proyecto como un todo, usted usa etiquetas ; lo mismo es cierto en Git si desea usar un nombre como ''v1.5.6-rc2'' para alguna versión de un proyecto ... pero las etiquetas en Git son mucho más fáciles de usar.

  • Fácil ramificación . Las ramas en CVS son, en mi opinión, demasiado complicadas y difíciles de tratar. Debe etiquetar las ramas para tener un nombre para una rama de repositorio completa (e incluso eso puede fallar en algunos casos, si no recuerdo mal, debido al manejo por archivo). Agregue a eso el hecho de que CVS no tiene seguimiento de fusión , por lo que debe recordar o etiquetar manualmente los puntos de fusión y bifurcación, y proporcionar manualmente la información correcta para "cvs update -j" para fusionar las ramas, y hace que la bifurcación ser innecesariamente difícil de usar. En Git crear y fusionar sucursales es muy fácil; Git recuerda toda la información requerida por sí misma (por lo que fusionar una rama es tan fácil como "git merge branchname ") ... tenía que hacerlo, porque el desarrollo distribuido naturalmente lleva a múltiples ramas.

    Esto significa que puede usar ramas de tema , es decir, desarrollar una función separada en varios pasos en una rama de funciones separada.

  • Renombrar (y copiar) el seguimiento . Los cambios de nombre de archivo no son compatibles en CVS, y el cambio de nombre manual puede dividir el historial en dos, o llevar a un historial no válido donde no se puede recuperar correctamente el estado de un proyecto antes de cambiar el nombre. Git utiliza la detección heurística de redenominación, basada en la similitud de contenido y nombre de archivo (esta solución funciona bien en la práctica). También puede solicitar la detección de copia de archivos. Esto significa que:

    • cuando se examina la confirmación especificada, se obtiene información de que se renombró un archivo,
    • fusionarse correctamente lleva a cambiar el nombre de la cuenta (por ejemplo, si el archivo fue renombrado solo en una rama)
    • "git blame", el equivalente (mejor) de "cvs annotate", una herramienta para mostrar el historial de contenido de un archivo en línea, puede seguir el movimiento del código también a través de cambios de nombre
  • Archivos binarios CVS tiene solo un soporte muy limitado para archivos binarios (por ejemplo, imágenes), requiriendo que los usuarios marquen archivos binarios explícitamente al agregar (o más tarde usando "cvs admin", o mediante envoltorios para hacer eso automáticamente basándose en el nombre del archivo), para evitar archivo binario mediante conversión al final de línea y expansión de palabra clave. Git detecta automáticamente el archivo binario basado en los contenidos de la misma manera que lo hace el diff de CNU y otras herramientas; puede anular esta detección usando el mecanismo de gitattributes. Además, los archivos binarios son seguros contra el mapeo irrecuperable gracias al valor predeterminado de ''safecrlf'' (y al hecho de que debe solicitar la conversión al final de la línea, aunque esto podría activarse de manera predeterminada según la distribución), y esa palabra clave (limitada) la expansión es un estricto ''opt-in'' en Git.

  • Expansión de palabras clave Git ofrece un conjunto de palabras clave muy, muy limitado en comparación con CVS (por defecto). Esto se debe a dos hechos: los cambios en Git son por repositorio y no por archivo, y Git evita modificar los archivos que no cambiaron al cambiar a otra rama o rebobinar a otro punto en el historial. Si desea incrustar el número de revisión con Git, debe hacerlo utilizando su sistema de compilación, por ejemplo, siguiendo el ejemplo del script GIT-VERSION-GEN en las fuentes del kernel de Linux y en las fuentes de Git.

  • Enmendando confirmaciones Debido a que en VCS distribuidos, como por ejemplo, el acto de publicación de Git es independiente de la creación de un compromiso, uno puede cambiar (editar, reescribir) una parte no publicada del historial sin molestar a otros usuarios. En particular, si observa un error tipográfico (u otro error) en el mensaje de confirmación, o un error en la confirmación, simplemente puede usar "git commit --amend". Esto no es posible (al menos no sin hackers pesados) en CVS.

  • Más herramientas Git ofrece muchas más herramientas que CVS. Uno de los más importantes es " git bisect " que se puede utilizar para encontrar una confirmación (revisión) que introdujo un error; Si sus confirmaciones son pequeñas y autónomas, debería ser bastante fácil descubrir dónde está el error.

Si colaboras con al menos otro desarrollador, también encontrarás las siguientes diferencias entre Git y CVS:

  • Confirmar antes de la fusión Git utiliza commit-before-merge en lugar de, como CVS, merge-before-commit (o update-then-commit ). Si mientras editabas archivos, preparándote para crear una nueva confirmación (nueva revisión), alguien más creó una nueva confirmación en la misma rama y ahora está en el repositorio, CVS te obliga a actualizar primero tu directorio de trabajo y resolver conflictos antes de permitirte comprometer. Este no es el caso con Git. Primero se compromete, guardando su estado en control de versiones, luego combina otros cambios de desarrollador. También puede pedirle al otro desarrollador que realice la combinación y resuelva los conflictos.

    Si prefiere tener un historial lineal y evitar las fusiones, siempre puede usar el flujo de trabajo commit-merge-recommit a través de "git rebase" (y "git pull - rebase"), que es similar a CVS en que usted reproduce los cambios en la parte superior de estado actualizado. Pero siempre te comprometes primero.

  • No es necesario tener un repositorio central. Con Git no es necesario tener un solo lugar central donde se comprometen los cambios. Cada desarrollador puede tener su propio repositorio (o mejores repositorios: uno privado en el que él / ella hace el desarrollo, y el público en el que publica la parte que está lista), y puede extraer / buscar de otros repositorios, en moda simétrica. Por otro lado, es común que un proyecto más grande tenga un repositorio central socialmente definido / nominado del que todos extraen (obtienen cambios).

Finalmente, Git ofrece muchas más posibilidades cuando se necesita colaboración con un gran número de desarrolladores. A continuación hay diferencias entre CVS en Git para diferentes etapas de interés y posición en un proyecto (bajo el control de versión usando CVS o Git):

  • lurker . Si solo está interesado en obtener los últimos cambios de un proyecto ( sin propagación de sus cambios ) o en el desarrollo privado (sin contribuir a los proyectos originales); o utiliza proyectos en el extranjero como base de su propio proyecto (los cambios son locales y no tiene sentido publicarlos).

    Git admite aquí el acceso anónimo no autenticado de solo lectura a través del protocolo git:// personalizado eficiente, o si está detrás del firewall bloqueando DEFAULT_GIT_PORT (9418) puede usar HTTP sin formato.

    Para CVS, la solución más común (según tengo entendido) para el acceso de solo lectura es la cuenta de invitado para el protocolo ''pserver'' en CVS_AUTH_PORT (2401), generalmente llamado "anónimo" y con una contraseña vacía. Las credenciales se almacenan de forma predeterminada en el archivo $HOME/.cvspass , por lo que debe proporcionarlo solo una vez; aún así, esto es un poco de barrera (debe saber el nombre de la cuenta de invitado, o prestar atención a los mensajes del servidor CVS) y la molestia.

  • desarrollador de franjas (colaborador de hojas) . Una forma de propagar sus cambios en OSS es enviando parches por correo electrónico . Esta es la solución más común si usted es (más o menos) un desarrollador accidental, envía un cambio único o una sola corrección de errores. Por cierto. el envío de parches puede realizarse a través de un panel de revisión (sistema de revisión de parches) o medios similares, no solo por correo electrónico.

    Git ofrece aquí herramientas que ayudan en este mecanismo de propagación (publicación) tanto para remitente (cliente) como para mantenedor (servidor). Para las personas que desean enviar sus cambios por correo electrónico, existe la herramienta " git rebase " (o "git pull - rebase") para reproducir sus propios cambios además de la versión actual de upstream, por lo que sus cambios se encuentran en la versión actual (son nuevos ), y " git format-patch " para crear un correo electrónico con mensaje de confirmación (y autoría), cambio en forma de formato de formato unificado (extendido) (más diffstat para una revisión más fácil). El mantenedor puede convertir dicho correo electrónico directamente en commit conservando toda la información (incluido el mensaje de confirmación) usando " git am ".

    CVS no ofrece tales herramientas: puede usar "cvs diff" / "cvs rdiff" para generar cambios y usar el parche de GNU para aplicar cambios, pero hasta donde yo sé, no hay forma de automatizar la aplicación del mensaje de confirmación. CVS estaba destinado a ser utilizado en la forma de cliente <-> servidor ...

  • teniente . Si eres mantenedor de una parte separada de un proyecto (subsistema), o si el desarrollo de tu proyecto sigue el flujo de trabajo de "red de confianza" utilizado en el desarrollo del kernel de Linux ... o solo si tienes tu propio repositorio público, y los cambios desea publicar son demasiado grandes para enviar por correo electrónico como serie de parches , puede enviar solicitud de extracción al mantenedor (principal) del proyecto.

    Esta es una solución específica para los sistemas de control de versiones distribuidas , por lo que, por supuesto, CVS no es compatible con esa forma de colaboración. Incluso hay una herramienta llamada "git request-pull" que ayuda a preparar el correo electrónico para enviar al mantenedor con la solicitud de extracción de su repositorio. Gracias al "paquete de git" puede usar este mecanismo incluso sin tener un repositorio público, enviando paquetes de cambios por correo electrónico o sneakernet. Algunos de los sitios de hospedaje de Git como GitHub tienen soporte para notificar que alguien está trabajando (publicó algún trabajo) en su proyecto (siempre que use el mismo sitio de alojamiento de Git), y para PM-ing tipo de solicitud de extracción.

  • desarrollador principal , es decir, alguien que publica directamente sus cambios (en el repositorio principal / canónico). Esta categoría es más amplia para los sistemas de control de versiones distribuidas, ya que tener múltiples desarrolladores con acceso de escritura al repositorio central no solo es un flujo de trabajo posible (puede tener un único mantenedor que envíe cambios al repositorio canónico, un conjunto de tenientes / mantenedores del subsistema desde el cual tira, y una amplia gama de desarrolladores de hoja que envían parches por correo a la lista de correo del desarrollador / proyecto, oa uno de los tenientes / submaintadores).

    Con Git tiene la opción de usar el protocolo SSH ( protocolo git envuelto en SSH) para publicar cambios, con herramientas como "git shell" (para ayudar a la seguridad, limitar el acceso de las cuentas shell) o Gitosis (para gestionar el acceso sin requerir cuentas shell separadas ) y HTTPS con WebDAV, con autenticación HTTP común.

    Con CVS hay una opción entre el protocolo pserver no cifrado personalizado (texto sin formato) o el uso de shell remoto (donde realmente debe usar SSH ) para publicar los cambios, que para el sistema de control de versiones centralizado significa comprometer los cambios (creación de confirmaciones). Bueno, también puedes tunelizar el protocolo ''pserver'' usando SSH, y hay tres herramientas de fiesta que lo automatizan ... pero no creo que sea tan fácil como, por ejemplo, Gitosis.

En general, los sistemas de control de versiones distribuidas, como Git, ofrecen una selección mucho más amplia de posibles flujos de trabajo. Con los sistemas de control de versiones centralizadas, como CVS, por necesidad debe distinguir entre las personas con acceso de commit al repositorio, y aquellos sin ... y CVS no ofrece ninguna herramienta para ayudar a aceptar contribuciones (a través de parches) de personas sin comprometer el acceso

Karl Fogel en Producir software de código abierto en la sección sobre control de versiones indica que es mejor no proporcionar controles demasiado estrictos, rígidos y rigurosos en áreas donde se permite realizar cambios en el repositorio público; es mucho mejor confiar (para esto) en las restricciones sociales (como la revisión del código) que en las restricciones técnicas; Los sistemas de control de versiones distribuidas reducen aún más mi humildad ...

HTH (esperanza que ayuda)


También soy un usuario mayor de 10 años de cvs, aunque también me gusta git, y con el tiempo llegaré a preferirlo, aunque la mayoría de los proyectos en los que trabajo actualmente usan cvs, o svn, y no podemos parecerlo. hacer que la burocracia en la que trabajo convenza para dejarnos perforar un agujero en el firewall.

Un par de cosas que hacen que los cvs sean más agradables de lo que podrían ser de otra manera son cvsps, y otro son los guiones de parches de Andrew Morton o colcha. Cvsps le permite reconstituir los múltiples archivos de una confirmación en un solo parche (y así extraer "conjuntos de cambios" de CVS) mientras que el parche o los scripts de Andrew Morton le permiten realizar "conjuntos de cambios" sensibles en cvs de manera fácil y cómoda, permitiéndole trabaje en múltiples cosas al mismo tiempo mientras las mantiene separadas antes de comprometerse. CVS tiene sus peculiaridades, pero estoy acostumbrado a la mayoría de ellos.


El sitio web de Git lo explica mejor probablemente.

La característica de mi mascota es poder hacer commits fuera de línea. Y la velocidad, la velocidad absoluta a la que sucede todo, excepto empujar y tirar. (Y estas operaciones son, por diseño, no destructivas, por lo que puede empujar / tirar cuando vaya a tomar un café si su repo central está rezagado). Otra cosa agradable es que incluye baterías incluidas: el gitk incorporado es un visor de historia bastante bueno; git gui es una herramienta de compromiso lo suficientemente buena; con colorización de salida, git add -i , git add -p , git rebase -i son interfaces interactivas lo suficientemente buenas; git daemon y git instaweb son lo suficientemente buenos para la colaboración ad hoc si no quieres / no puedes jugar con tu repositorio central.