Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Practico
Practico
º 3
Gestores de la
Configuración
Git 9
Sistema de Control de Versiones Distribuido (DVCS) 9
Fundamentos de Git 10
Manejo de Variaciones (Instantáneas) 10
Integridad 10
Estados de Archivos 10
Áreas de Git 11
¿Como usar Git? 12
Flujo de trabajo básico 12
Iniciar u obtener un repositorio 12
Inicializar el repositorio en un directorio existente: 12
Clonar un repositorio existente 12
Modificar archivos en el directorio de trabajo 12
Comprobamos el estado de los archivos 12
Añadir archivos a la Staging Area 14
Confirmar los cambios 14
Subir cambios al Repositorio Remoto 15
Ramificaciones en Git 16
¿Qué es una rama? 16
¿Como se crea una rama? 16
Confirmación de cambios en una rama 18
Fusión de ramas 19
Bibliografía 32
Subversion
Usamos el programa TortoiseSVN que es un cliente subversion.
Esta configuración también tiene serias desventajas. La más obvia es el punto único de
fallo que representa el servidor central. Si 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, se pierde absolutamente todo excepto las instantáneas
locales
● Manejo de versiones:
Almacena la información con los archivos iniciales y una lista de cambios en
estos. Modela la información que se almacena como un conjunto de archivos y las
modificaciones hechas sobre cada uno de ellos a lo largo del tiempo
● Control de acceso
Tortoise maneja la concurrencia a los archivos mediante bloqueos. Se utiliza
para evitar que dos o más personas modifiquen el mismo archivo al mismo tiempo, ya
que sólo se guardarían los cambios realizados por la última persona que guardó el
cambio.
El bloqueo debe ser explícito sobre un archivo, al obtenerlo, solo este usuario
puede confirmar ese archivo. Las confirmaciones de los demás se desestimarán hasta
que quite el bloqueo. Un archivo bloqueado no puede ser modificado de ninguna
forma en el repositorio, por lo que no puede ser siquiera borrado o renombrado,
excepto por el dueño del bloqueo.
Funcionamiento básico
Se mostrará el funcionamiento con un repositorio local usando TortoiseSVN
2. Agregamos un archivo
Se va a agregar un archivo directamente al repositorio, no desde una copia de
trabajo, sería como los archivos iniciales del repositorio.
Creamos un archivo txt y desde el repo-browser se agrega, junto con un mensaje para
la revisión.
Donde colocamos la url del repositorio (en este caso usamos el repositorio
local), la dirección de creación de la copia de trabajo, lo que nos deja con las siguientes
carpetas, las mismas del repositorio
4. Commit de archivos
Modificamos el archivo de texto que estaba dentro del repositorio, luego se
selecciona “SVN Commit...”, lo que permite subir al repositorio los archivos
modificados o creados, según la siguiente captura.
Allí se puede seleccionar los archivos para hacer el commit, junto con un
mensaje descriptivo que va al log de la revisión. Y así muestra la confirmación del
commit.
Git
Es un Sistema de Control de Versiones Distribuido (DVCS) 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. Su propósito es llevar registro de los cambios
en archivos de computadora y coordinar el trabajo que varias personas realizan sobre archivos
compartidos.
Fundamentos de Git
● Manejo de Variaciones (Instantáneas)
Git modela sus datos como un conjunto de instantáneas . Cada vez que se
confirma un cambio, o se guarda el estado de un proyecto, Git realiza una “foto” del
aspecto de todos sus archivos en ese momento, y guarda una referencia a esa
instantánea. Si el archivo no se a modificado, Git no almacena el archivo nuevamente,
sino, que genera un enlace al archivo anterior.
Una instantánea además contiene metadatos del autor, mesajes explicativos y
punteros a las confirmaciones que son padres directos de esta.
● Integridad
Antes de almacenar algo en Git es verificado mediante una suma de
comprobación, y es identificado por dicha suma. Esto garantiza que no se pierda
información durante su transmisión o sufrir corrupción de archivos sin que Git lo
detecte.
El mecanismo utilizado por Git es hash SHA-1 (Cadena de 40 caracteres
hexadecimales) y tiene un aspecto similar a este:
24b9da6552252987aa493b52f8696cd6d3b00373
● Estados de Archivos
Git posee 3 estados principales en los que pueden encontrarse los archivos:
○ Confirmado (Committed): Significa que los datos están guardados de manera
segura en la base de datos local (git directory).
○ Modificado (Modified): Significa que el archivo se a modificado pero que no
ha sido confirmado en la base de datos local.
● Áreas de Git
○ Directorio de Git (repositorio): Es donde Git almacena los metadatos y la base
de datos del proyecto, es lo que se copia cuando se clona un repositorio.
○ Directorio de trabajo (Working Directory): Es una copia de una versión del
proyecto. Estos archivos se sacan de la base de datos en el directorio de Git, y
se colocan en el disco para ser usados o modificados.
○ Área de preparación (Staging Area): Es un archivo, generalmente contenido
en el directorio de Git, que almacena información acerca de lo que se va a
mover al directorio de Git en el próximo commit.
Un archivo del directorio de trabajo puede estar en uno de estos dos estados:
● Tracked: Son aquellos archivos que existían en la última
instantánea, pueden estar modificados, en el Staged Área y sin
modificar.
● Untracked: Son todos los demás archivos, cualquiera que no
estuviese en la última instantánea.
Master Branch (Rama Maestra): Es la rama en la que estamos trabajando, que
por defecto.
Ramificaciones en Git
¿Qué es una rama?
Una rama es un puntero móvil que apunta a una instantánea. La rama por defecto de
Git es la rama master, esta se genera con la primera confirmación de cambios que realicemos.
La rama master apuntará siempre a la última instantánea realizada.
(La rama en verde es la rama en las que se está trabajando en el momento de usar el comando)
Git utiliza un puntero especial llamado HEAD que apunta a la rama local en la que
estés trabajando en ese momento, en el caso de la imagen anterior, la rama master.
Para cambiar de rama se utiliza el comando git checkout [nombre-rama], que modifica
el puntero del HEAD para apuntar a la rama solicitada.
Fusión de ramas
Se utiliza el comando git merge [nombre-rama], el comando origina que Git realiza
una fusión a tres bandas, utilizando las dos instantáneas apuntadas por el extremo de cada una
de las ramas y el ancestro en común de estas dos.
Git crea una nueva instantánea resultante de la fusión a tres bandas y crea una nueva
confirmación de cambios (commit) que apunte a ella. Este proceso se llama fusión confirmada
y se diferencia en que tiene más de un padre.
Si existe algún conflicto entre las ramas a fusionar, Git muestra un mensaje advirtiendo
de los archivos que generaron conflictos para que se arreglen de forma manual, una vez
modificados se deben confirmar los cambios realizados y realizar la fusión de ramas
nuevamente.
● Control de versiones
El control de versiones distribuido toma un enfoque entre iguales, opuesto al
enfoque de cliente-servidor de los sistemas centralizados. En lugar de un único
repositorio central en el cual los clientes se sincronizan (centralizado), la copia local del
código base de cada peer es un repositorio completo (distribuido). El control de
versiones distribuido sincroniza los repositorios intercambiando ajustes entre iguales.
● Modelado de datos
Git modela sus datos como un conjunto de instantáneas . Cada vez que se confirma un
cambio, o se guarda el estado de un proyecto, Git realiza una “foto” del aspecto de todos sus
archivos en ese momento, los archivos modificados se vuelven a copiar mientras que en los
archivos no modificados se crea un puntero al archivo en la instantánea más reciente; y guarda
una referencia a esa instantánea en la confirmación.
Subversion almacena la información con los archivos iniciales y una lista de cambios en
estos. Modela la información que se almacena como un conjunto de archivos y las
modificaciones hechas sobre cada uno de ellos a lo largo del tiempo.
● Usabilidad
SVN tiene más amplitud de plugins para distintas IDE, y a su vez es más amigable al
usuario. Por otro lado, git es más complejo lo que conlleva una interfaz menos amigable al
usuario que svn.
● Conectividad
SVN necesita conectividad permanente para cada operación, ya que no tenemos toda
la información en nuestra máquina. Git, al distribuir todo el repositorio a cada colaborador,
disminuye la necesidad de conectividad a sólo cuando se va a acceder al servidor remoto ya
sea para recibir o enviar datos. Este punto también afecta a la velocidad, al no haber
conectividad permanente, git es más rápido que svn para operaciones comunes.
● Historial de cambios
El historial de cambios de git es completo, tanto en el repositorio como en las copias
de trabajo locales, pero en svn el repositorio completo posee el historial y las copias de trabajo
solo tienen la versión más reciente
● Protección de datos
En la protección de datos ante pérdida, git tiene la solución al tener todo el repositorio
en cada copia de trabajo, por ende cada colaborador tiene un backup ante cualquier
catástrofe. En cambio bajo svn hay que poner énfasis en un backup del servidor central
El proceso suele ser: cada cierto tiempo (horas), descargarse las fuentes desde el
control de versiones (por ejemplo CVS, Git, Subversion, Mercurial o Microsoft Visual
SourceSafe) compilarlo, ejecutar pruebas y generar informes.
JENKINS
Jenkins es un servidor de integración continua que integra y verifica el código fuente y
genera un ejecutable (esto es llamado build y es totalmente automatizado). Esto permite
generar pruebas y hacer un control de calidad del código para detectar errores lo antes
posible.
Jenkins trabaja con tareas, donde se detalla qué hacer en un build. Un claro ejemplo
sería el programar la revisión continua cada cierto tiempo de un repositorio git de control de
versiones, y al encontrar un cambio de versión compilar y ejecutar pruebas. Si surgiera un
error Jenkins permite notificar a los integrantes ya sea al desarrollador que ha actualizado la
version nueva, a su supervisor, a un tester o a cualquier miembro del equipo al que fuera
importante notificar, esto se puede realizar por mail o cualquier otro medio.
Jenkins nos ofrece una herramienta de enlace durante todo el proceso de desarrollo.
Desde Jenkins podemos obtener métricas de calidad y ver resultados de test, generar y
visualizar documentación del proyecto e incluso extraer la version mas estable del software
para ser probado o para enviarlo a otras áreas como preproducción o producción (donde
queremos que termine nuestro código).
Para trabajar con esta bonita herramienta partimos de los ejercicios anteriores donde
utilizamos un repositorio Git para gestionar configuración y versiones. Este repositorio será
nuestra punto de entrada de COMMITS o modificaciones por parte de “desarrolladores”. De
esta manera vinculamos estas dos herramientas e integraremos conocimientos.
Además del gestor de versiones necesitamos tener todo lo necesario para realizar la
build (ejecutable), tanto el código fuente como las librerías, los scripts de test, etc.
Se puede observar los detalles de la tarea una vez terminada, donde vemos los
recientes cambios, el usuario que los realizó y el ID del commit.
Ventajas
Control periódico de la evolución del proyecto, modificaciones y nuevas versiones.
Automatización de pruebas y las build.
Acceso rápido a un historial completo de cambios y estados anteriores del proyecto
Gestión intuitiva de errores a través de la automatización de pruebas y las gestión de cambios.
Desventajas
Todos los involucrados deben ser ordenados y mantener una constancia en la documentación
de cambios.
Para mayor utilidad de la herramienta es necesario un conocimiento profundo que no todos
los usuarios de la misma pueden tener.
Bibliografía
● https://git-scm.com/book/es/v1/Empezando-Acerca-del-control-de-versiones/
● https://git-scm.com/book/es/v2/Fundamentos-de-Git-Obteniendo-un-repositorio-Git/
● https://tortoisesvn.net/docs/release/TortoiseSVN_es/index.html
● https://es.wikipedia.org/wiki/Control_de_versiones_distribuido
● https://jenkins.io/doc/
● https://es.wikipedia.org/wiki/Integracion_continua/