Unidad 4: Manejadores de Versiones



Control de versiones 

  
Es la gestión de los diversos cambios que se realizan sobre los elementos de algún producto o una configuración del mismo. Una versión, revisión o edición de un producto, es el estado en el que se encuentra el mismo en un momento dado de su desarrollo o modificación.
Aunque un sistema de control de versiones puede realizarse de forma manual, es muy aconsejable disponer de herramientas que faciliten esta gestión dando lugar a los llamados sistemas de control de versiones o VCS (del inglés Version Control System). Estos sistemas facilitan la administración de las distintas versiones de cada producto desarrollado, así como las posibles especializaciones realizadas (por ejemplo, para algún cliente específico). Ejemplos de este tipo de herramientas son entre otros: CVS, Subversion, SourceSafe, ClearCase, Darcs, Bazaar, Plastic SCM, Git, SCCS, Mercurial, Perforce, Fossil SCM, Team Foundation Server.

El control de versiones se realiza principalmente en la industria informática para controlar las distintas versiones del código fuente dando lugar a los sistemas de control de código fuente o SCM (siglas del inglés Source Code Management). Sin embargo, los mismos conceptos son aplicables a otros ámbitos como documentos, imágenes, sitios web, etc.

Características

Un sistema de control de versiones debe proporcionar:
  • Mecanismo de almacenamiento de los elementos que deba gestionar (ej. archivos de texto, imágenes, documentación...).
  • Posibilidad de realizar cambios sobre los elementos almacenados (ej. modificaciones parciales, añadir, borrar, renombrar o mover elementos).
  • Registro histórico de las acciones realizadas con cada elemento o conjunto de elementos (normalmente pudiendo volver o extraer un estado anterior del producto).
Aunque no es estrictamente necesario, suele ser muy útil la generación de informes con los cambios introducidos entre dos versiones, informes de estado, marcado con nombre identificativo de la versión de un conjunto de ficheros, etc.

Sistemas de control de versiones locales

   Un método de control de versiones usado por mucha gente es copiar los archivos a otro directorio (quizás indicando la fecha y hora en que lo hicieron, si son avispados). Este enfoque es muy común porque es muy simple, pero también tremendamente propenso a errores. Es fácil olvidar en qué directorio te encuentras, y guardar accidentalmente en el archivo equivocado o sobrescribir archivos que no querías.
Para hacer frente a este problema, los programadores desarrollaron hace tiempo VCSs locales que contenían una simple base de datos en la que se llevaba registro de todos los cambios realizados sobre los archivos.
Una de las herramientas de control de versiones más popular fue un sistema llamado rcs, que todavía podemos encontrar en muchos de los ordenadores actuales. Hasta el famoso sistema operativo Mac OS X incluye el comando rcs cuando instalas las herramientas de desarrollo. Esta herramienta funciona básicamente guardando conjuntos de parches (es decir, las diferencias entre archivos) de una versión a otra en un formato especial en disco; puede entonces recrear cómo era un archivo en cualquier momento sumando los distintos parches.

Sistemas de control de versiones centralizados

El siguiente gran problema que se encuentra la gente es que necesitan colaborar con desarrolladores en otros sistemas. Para solventar este problema, se desarrollaron los sistemas de control de versiones centralizados (Centralized Version Control Systems o CVCSs en inglés). Estos sistemas, como CVS, Subversion, y Perforce, tienen un único servidor que contiene todos los archivos versionados, y varios clientes que descargan los archivos desde ese lugar central. Durante muchos años éste ha sido el estándar para el control de versiones.
Esta configuración ofrece muchas ventajas, especialmente frente a VCSs locales. Por ejemplo, todo el mundo puede saber (hasta cierto punto) en qué están trabajando los otros colaboradores del proyecto. Los administradores tienen control detallado de qué puede hacer cada uno; y es mucho más fácil administrar un CVCS que tener que lidiar con bases de datos locales en cada cliente.
Sin embargo, esta configuración también tiene serias desventajas. La más obvia es el punto único de fallo que representa el servidor centralizado. Si ese servidor se cae durante una hora, entonces durante esa hora nadie puede colaborar o guardar cambios versionados de aquello en que están trabajando. Si el disco duro en el que se encuentra la base de datos central se corrompe, y no se han llevado copias de seguridad adecuadamente, pierdes absolutamente todo —toda la historia del proyecto salvo aquellas instantáneas que la gente pueda tener en sus máquinas locales. Los VCSs locales sufren de este mismo problema cuando tienes toda la historia del proyecto en un único lugar, te arriesgas a perderlo todo.

Sistemas de control de versiones distribuidos

Es aquí donde entran los sistemas de control de versiones distribuidos (Distributed Version Control Systems o DVCSs en inglés). En un DVCS (como Git, Mercurial, Bazaar o Darcs), los clientes no sólo descargan la última instantánea de los archivos: replican completamente el repositorio. Así, si un servidor muere, y estos sistemas estaban colaborando a través de él, cualquiera de los repositorios de los clientes puede copiarse en el servidor para restaurarlo. Cada vez que se descarga una instantánea, en realidad se hace una copia de seguridad completa de todos los datos.
Es más, muchos de estos sistemas se las arreglan bastante bien teniendo varios repositorios con los que trabajar, por lo que puedes colaborar con distintos grupos de gente simultáneamente dentro del mismo proyecto. Esto te permite establecer varios flujos de trabajo que no son posibles en sistemas centralizados, como pueden ser los modelos jerárquicos.


Git

 
Es un software de control de versiones diseñado por Linus Torvalds, pensando en la eficiencia y la
confiabilidad del mantenimiento de versiones de aplicaciones cuando éstas tienen un gran número de archivos de código fuente. Su propósito es llevar registro de los cambios en archivos de computadora y coordinar el trabajo que varias personas realizan sobre archivos compartidos.
Al principio, Git se pensó como un motor de bajo nivel sobre el cual otros pudieran escribir la interfaz de usuario o front end como Cogito o StGIT.​ Sin embargo, Git se ha convertido desde entonces en un sistema de control de versiones con funcionalidad plena. Hay algunos proyectos de mucha relevancia que ya usan Git, en particular, el grupo de programación del núcleo Linux.
 


Características

El diseño de Git se basó en BitKeeper y en Monotone.​ Originalmente fue diseñado como un motor de sistema de control de versiones de bajo nivel sobre el cual otros podrían codificar interfaces frontales, tales como Cogito o StGIT. Desde ese entonces hasta ahora el núcleo del proyecto Git se ha vuelto un sistema de control de versiones completo, utilizable en forma directa.​

Linus Torvalds buscaba un sistema distribuido que pudiera usar en forma semejante a BitKeeper, pero ninguno de los sistemas bajo software libre disponibles cumplía con sus requerimientos, especialmente en cuanto a desempeño. El diseño de Git mantiene una enorme cantidad de código distribuida y gestionada por mucha gente, que incide en numerosos detalles de rendimiento, y de la necesidad de rapidez en una primera implementación.
Entre las características más relevantes se encuentran:
  • Fuerte apoyo al desarrollo no lineal, por ende rapidez en la gestión de ramas y mezclado de diferentes versiones. Git incluye herramientas específicas para navegar y visualizar un historial de desarrollo no lineal. Una presunción fundamental en Git, es que un cambio será fusionado mucho más frecuentemente de lo que se escribe originalmente, conforme se pasa entre varios programadores que lo revisan.
  • Gestión distribuida. Al igual que Darcs, BitKeeper, Mercurial, SVK, Bazaar y Monotone, Git le da a cada programador una copia local del historial del desarrollo entero, y los cambios se propagan entre los repositorios locales. Los cambios se importan como ramas adicionales y pueden ser fusionados en la misma manera que se hace con la rama local.
  • Los almacenes de información pueden publicarse por HTTP, FTP, rsync o mediante un protocolo nativo, ya sea a través de una conexión TCP/IP simple o a través de cifrado SSH. Git también puede emular servidores CVS, lo que habilita el uso de clientes CVS pre-existentes y módulos IDE para CVS pre-existentes en el acceso de repositorios Git.
  • Los repositorios Subversion y svk se pueden usar directamente con git-svn.
  • Gestión eficiente de proyectos grandes, dada la rapidez de gestión de diferencias entre archivos, entre otras mejoras de optimización de velocidad de ejecución.
  • Todas las versiones previas a un cambio determinado, implican la notificación de un cambio posterior en cualquiera de ellas a ese cambio (denominado autenticación criptográfica de historial). Esto existía en Monotone.
  • Resulta algo más caro trabajar con ficheros concretos frente a proyectos, eso diferencia el trabajo frente a CVS, que trabaja con base en cambios de fichero, pero mejora el trabajo con afectaciones de código que concurren en operaciones similares en varios archivos.
  • Los renombrados se trabajan basándose en similitudes entre ficheros, aparte de nombres de ficheros, pero no se hacen marcas explícitas de cambios de nombre con base en supuestos nombres únicos de nodos de sistema de ficheros, lo que evita posibles y desastrosas coincidencias de ficheros diferentes en un único nombre.
  • Realmacenamiento periódico en paquetes (ficheros). Esto es relativamente eficiente para escritura de cambios y relativamente ineficiente para lectura si el reempaquetado (con base en diferencias) no ocurre cada cierto tiempo.
 
Órdenes básicas
  •  git fetch:
Descarga los cambios realizados en el repositorio remoto.
  • git merge <nombre_rama>:
Impacta en la rama en la que te encuentras parado, los cambios realizados en la rama “nombre_rama”.
  • git pull:
Unifica los comandos fetch y merge en un único comando.
  • git commit -am "<mensaje>":
Confirma los cambios realizados. El “mensaje” generalmente se usa para asociar al commit una breve descripción de los cambios realizados.
  • git push origin <nombre_rama>:
Sube la rama “nombre_rama” al servidor remoto.
  • git status:
Muestra el estado actual de la rama, como los cambios que hay sin commitear.
  • git add <nombre_archivo>:
Comienza a trackear el archivo “nombre_archivo”.
  • git checkout -b <nombre_rama_nueva>:
Crea una rama a partir de la que te encuentres parado con el nombre “nombre_rama_nueva”, y luego salta sobre la rama nueva, por lo que quedas parado en esta última.
  • git checkout -t origin/<nombre_rama>:
Si existe una rama remota de nombre “nombre_rama”, al ejecutar este comando se crea una rama local con el nombre “nombre_rama” para hacer un seguimiento de la rama remota con el mismo nombre.
  • git branch:
Lista todas las ramas locales.
  • git branch -a:
Lista todas las ramas locales y remotas.
  • git branch -d <nombre_rama>:
Elimina la rama local con el nombre “nombre_rama”.
  • git push origin <nombre_rama>:
Commitea los cambios desde el branch local origin al branch “nombre_rama”.
  • git remote prune origin:
Actualiza tu repositorio remoto en caso que algún otro desarrollador haya eliminado alguna rama remota.
  • git reset --hard HEAD:
Elimina los cambios realizados que aún no se hayan hecho commit.
  • git revert <hash_commit>:
Revierte el commitrealizado, identificado por el “hash_commit”.
 

GitHub

 

Es una forja (plataforma de desarrollo colaborativo) para alojar proyectos utilizando el sistema de control de versiones Git. Se utiliza principalmente para la creación de código fuente de programas de computadora. El software que opera GitHub fue escrito en Ruby on Rails. Desde enero de 2010, GitHub opera bajo el nombre de GitHub, Inc. Anteriormente era conocida como Logical Awesome LLC. El código de los proyectos alojados en GitHub se almacena típicamente de forma pública, aunque utilizando una cuenta de pago, también permite hospedar repositorios privados.
 
Características
  • Página web para cada proyecto.
  • Gráfico para ver cómo los desarrolladores trabajan en sus repositorios y bifurcaciones del proyecto.
  • Funcionalidades como si se tratase de una red social, por ejemplo, seguidores.
  • Herramienta para trabajo colaborativo entre programadores.
  • Gestor de proyectos de estilo Kanban.
 
Referencias



 
 


Comentarios

  1. Cabe destacar que un controlador de versiones es un sistema que nos permite guardar un registro de las modificaciones que realizamos sobre un fichero a lo largo del tiempo. Habitualmente se utiliza en entornos de desarrollo de software, pero puede resultar de gran utilidad para cualquier persona que necesite un control robusto sobre la tarea que está realizando.

    Gracias a los sistemas de control de versiones más potentes como lo es Git, conseguimos muchas ventajas. Como las siguientes aquí mencionadas:
    • Acceso al registro de modificaciones sobre un fichero. Esto nos permite además ver los comentarios asociados a cada modificación y la persona que ha realizado dicha modificación
    • Posibilidad de regresar al estado anterior de un fichero o conjunto de ficheros
    • Creación de ramas para gestionar cambios que finalmente se mezclarán con la rama principal
    • Facilidad para etiquetar modificaciones concretas. Esto además, acaba desembocando en un DML de ITIL, con lo que conseguimos un repositorio con todas las releases del producto

    ResponderEliminar
  2. Los manejadores de versiones son un grupo de aplicaciones originalmente para gestionar ágilmente los cambios en el código fuente de los programas y poder revertirlos, cuyo ámbito ha sido ampliado pasando del concepto control de versiones al de gestión de configuración de software, en el que se engloban todas las actividades que pueden realizarse por un equipo sobre un gran proyecto software u otra actividad que genere ficheros digitales (por ejemplo: documentos, ofertas, dibujos, esquemas, etcétera).

    Gestión de Configuración de Software es una especialización de la gestión de configuración a todas las actividades en el sector del desarrollo de software.
    Trata y controla:
    La elaboración de código fuente por varios desarrolladores simultáneamente.
    El seguimiento del estado de las fases del desarrollo de software (versiones) y sus cambios (control de versiones).
    La conducción de la integración de las partes del software en un solo producto de software.

    ResponderEliminar
  3. Mi primera experiencia con un manejador de subversión, fue al usar el Google Doc, donde yo podía crear un documento y compartirlo con ciertos niveles de uso como solo lectura, como lectura con posibilidad de realizar comentarios y como coeditor, esto me resulto súper útil, pues podía trabajar a distancia con mis compañeros de estudio, profesores y/o tutores, ya que al trabajar y estudiar no podía reunirme con ellos de forma física o digamos presencial. Esto da lugar al trabajo colaborativo y no presencial donde la ubicación geográfica no es relevante o importante. Los que se requería era de un hardware adecuado, un sistema operativo con navegador web, un proveedor de correo y/o repositorio para almacenar documentos como el ahora google drive y conexión a Internet.
    Trasladar esta utilidad a el desarrollo de programas es de suma importancia ya que el trabajo en equipos y con división de roles y asignación de tareas se hace posible y además de que no tenemos que estar todos en el mismos lugar para poder realizar los aportes que son necesarios, y el manejo de subversión que permite ver la evolucion y aporte de cada una de las partes, además que en situación de error y porque no de desastre nos permite regresar a un punta anterior a donde se a producido el problema

    ResponderEliminar
  4. Todos los sistemas de control de versiones se basan en disponer de un repositorio, que es el conjunto de información gestionada por el sistema. Este repositorio contiene el historial de versiones de todos los elementos gestionados.

    Cada uno de los usuarios puede crearse una copia local duplicando el contenido del repositorio para permitir su uso. Es posible duplicar la última versión o cualquier versión almacenada en el historial. Este proceso se suele conocer como checkout o desproteger. Para modificar la copia local existen dos semánticas básicas:

    Exclusivos
    Para poder realizar un cambio es necesario marcar en el repositorio el elemento que se desea modificar y el sistema se encargará de impedir que otro usuario pueda modificar dicho elemento.

    Colaborativos
    En el que cada usuario se descarga la copia, la modifica, y el sistema automáticamente combina las diversas modificaciones. El principal problema es la posible aparición de conflictos que deban ser solucionados manualmente o las posibles inconsistencias que surjan al modificar el mismo fichero por varias personas no coordinadas. Además, esta semántica no es apropiada para ficheros binarios.

    ResponderEliminar
  5. Richard Ramírez
    15620917
    Cuando se habla de sistemas de control de versiones es una herramienta que se encarga de registrar todos los cambios hechos en uno o más proyectos, de manera tal que cumple la función de guardar las versiones del producto en todas las fases de su desarrollo. Estas versiones registran su estado en un momento determinado y se van guardando a medida que se van haciendo las modificaciones al código fuente. Haciendo retrospectiva en el pasado el control de versiones se solía almacenar en medios extraíbles tales como diskettes y CD’s en archivos comprimidos, por lo cual se hacía tedioso dicho almacenamiento. Por eso nacen los manejadores de versiones para facilitar y agilizar el almacenamiento de los mismos. Los manejadores de versiones se clasifican en dos grupos muy importantes tales como centralizados donde está almacenado todos los fuentes en un directorio único, o repositorio fuente, ya sea en un pc o un servidor, cuando se habla de distribuidos no existe repositorio central, cada desarrollador posee una copia del repositorio con todas las versiones, y según se va desarrollando y haciendo cambio en las fuentes, las versiones se van haciendo distintas unas a otras, por ende los sistemas distribuidos permiten que en cualquier momento los desarrolladores se sincronizan en sus repositorios y el primero que toque las fuentes esta se convertirá en la versión mas reciente un ejemplo de ello son GIT y MERCURIAL . En lo personal me parece que el manejador de versiones GIT posee gran desempeño y adaptabilidad a cualquier plataforma donde se ejecute, se usa mucho en proyectos de código abierto distribuido, cada repositorio de GIT posee capacidades de gestión de revisiones, sin depender de la red o del servidor central.

    ResponderEliminar
  6. Para el desarrollo de software en equipo es ideal usar el sistema de control de versiones, permite agilizar el trabajo y aumenta la colaboración dentro del proyecto. Actualmente existen repositorios online que nos permite versiones nuestros proyectos y hacer colaboración entre desarrolladores, uno de ellos es GitHub.

    ResponderEliminar
  7. CONTROL DE VERSIONES
    Es cuando gestionamos los cambios que se realizan sobre los archivos a lo largo del tiempo de algún proyecto en específico, de modo que podamos recuperar versiones específicas más adelante. Podemos encontrar varios problemas si no utilizamos herramientas del control de versiones, por ejemplo:
    1.- No funciona el sistema de un día para otro, y no entendemos el por qué, si no hemos hecho cambios en el código.
    2.-Tenemos que utilizar una serie de números y fechas para ir recordando la última modificación y avances del proyecto.
    3.- Nuestro dispositivo donde tenemos guardado el sistema, sufre un daño y perdemos por completo el proyecto.
    4.-Cuando se está trabajando en equipo y se debe integrar el código de cada programador.

    Es aquí, cuando tomamos la decisión y utilizamos los sistemas de control de versiones como herramienta para solucionar nuestros problemas:
    1.- Git
    2.-Mercurial
    3.-Subversión.
    También encontramos los servicios de alojamiento de proyectos como son:
    1.-Bitbucket.
    2.-Github
    3.-Google Code
    Estos tres últimos son servicios basados en Web para alojar proyectos, llamados también repositorios en la nube, que nos ofrecen ventajas como descargar nuestro proyecto en cualquier ordenador, permitir que varios usuarios trabajen en el mismo proyecto, entre otros… específico con Git, por ejemplo utilizamos el Branch para volver a la versión anterior del proyecto y podemos a su vez ir creando copias de trabajo que luego fusionaremos al proyecto raíz sin la preocupación de perder alguna línea de código primordial.

    ResponderEliminar
  8. Gracias a todas las herramientas que la tecnología nos provee, cada día el desarrollo de software se vuelve más eficiente. Existe una gran variedad de ellas, pero hay una que se destaca entre todas y que le da al desarrollador la capacidad de gestionar de una manera sencilla y oportuna sus proyectos: un sistema de control de versiones.

    Un sistema de control de versiones es una herramienta que registra todos los cambios hechos en uno o más proyectos, guardando así versiones del producto en todas sus fases del desarrollo. Las versiones son como fotografías que registran su estado en ese momento del tiempo y se van guardando a medida que se hacen modificaciones al código fuente.

    Considero las mas relvenates Git y Mercurial

    Anteriormente resultaba dificil conocer la versión hechs del código de programación, recuerdo la cantidad de veces que elimine código, que posteriormente sería necesario para otros elemenmtos del software que diseñaba; aspecto muy importante que garantiza en la actualidad los sistemsa de control de versiones

    ResponderEliminar
  9. How to get casino site【VIP】quick access【WG】tips
    How to get casino site【VIP】quick access【WG】tips, tips for betting on sport, casino games, roulette, luckyclub casino games, jackpots, live dealer,

    ResponderEliminar

Publicar un comentario

Entradas populares de este blog

Unidad 1: Definición del FRONTEND & BACKEND

Unidad 2: Lenguajes,Framework & Librerias Frontend