Documento Sobre Git
Documento Sobre Git
Ir a la navegaciónIr a la búsqueda
Para otros usos de este término, véase GIT.
Git
git-scm.com
Git-logo.svg
Gitweb screenshot.png
Información general
Modelo de desarrollo Software libre
Desarrollador(es) Linus Torvalds, Junio Hamano y
Software Freedom Conservancy
Autor(es) Linus Torvalds
Lanzamiento inicial 7 de abril de 2005
Última versión estable 2.22.0 (info)
7 de junio de 2019 (1 día)
Género Control de versiones
Programado en C, Bourne Shell, Perl1
Sistema operativo Unix-like, Windows, Linux
Licencia GNU GPL v2
Idiomas inglés
[editar datos en Wikidata]
Git (pronunciado "guit"2) 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.
Características
El diseño de Git se basó en BitKeeper y en Monotone. 56 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.7 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.8
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.
Órdenes básicas:
git fetch:
git pull:
Muestra el estado actual de la rama, como los cambios que hay sin
commitear.
git branch:
Buenas prácticas:
Cada desarrollador o equipo de desarrollo puede hacer
uso de Git de la forma que le parezca más conveniente. Sin
embargo una buena práctica es la siguiente, utilizando 4
tipos de ramas: Master, Development, Features, y Hotfix.
Master:
Es la rama principal. Contiene el repositorio que se
encuentra publicado en producción, por lo que debe estar
siempre estable.
Development:
Es una rama sacada de Master. Es la rama de integración,
todas las nuevas funcionalidades se deben integrar en esta
rama. Luego que se realice la integración y se corrijan los
errores (en caso de haber alguno), es decir que la rama se
encuentre estable, se puede hacer un merge de
development sobre la rama Master.
Features:
Cada nueva funcionalidad se debe realizar en una rama
nueva, específica para esa funcionalidad. Estas se deben
sacar de Development. Una vez que la funcionalidad esté
desarrollada, se hace un merge de la rama sobre
Development, donde se integrará con las demás
funcionalidades.
Hotfix:
Son errores de software que surgen en producción, por lo
que se deben arreglar y publicar de forma urgente. Es por
ello, que son ramas sacadas de Master. Una vez corregido
el error, se debe hacer una unificación de la rama sobre
Master. Al final, para que no quede desactualizada, se
debe realizar la unificación de Master sobre Development.
Control de versiones:
Características:
Un sistema de control de versiones debe proporcionar:
Terminología
La terminología empleada puede variar de sistema a
sistema, pero a continuación se describen algunos
términos de uso común.12
Repositorio
El repositorio es el lugar en el que se almacenan los datos
actualizados e históricos de cambios, a menudo en un
servidor. A veces se le denomina depósito o depot. Puede
ser un sistema de archivos en un disco duro, un banco de
datos, etc..
Módulo
Conjunto de directorios y/o archivos dentro del repositorio
que pertenecen a un proyecto común.
Revisión ("version")
Una revisión es una versión determinada de la información
que se gestiona. Hay sistemas que identifican las revisiones
con un contador (Ej. subversion). Hay otros sistemas que
identifican las revisiones mediante un código de detección
de modificaciones (Ej. Git usa SHA1). A la última versión se
le suele identificar de forma especial con el nombre de
HEAD. Para marcar una revisión concreta se usan los
rótulos o tags.
Rotular ("tag")
Darle a alguna versión de cada uno de los ficheros del
módulo en desarrollo en un momento preciso un nombre
común ("etiqueta" o "rótulo") para asegurarse de
reencontrar ese estado de desarrollo posteriormente bajo
ese nombre. En la práctica se rotula a todos los archivos en
un momento determinado. Para eso el módulo se
"congela" durante el rotulado para imponer una versión
coherente. Pero bajo ciertas circunstancias puede ser
necesario utilizar versiones de algunos ficheros que no
coinciden temporalmente con las de los otros ficheros del
módulo.
Los tags permiten identificar de forma fácil revisiones
importantes en el proyecto. Por ejemplo se suelen usar
tags para identificar el contenido de las versiones
publicadas del proyecto.
En algunos sistemas se considera un tag como una rama en
la que los ficheros no evolucionan, están congelados.
Línea base ("baseline")
Una revisión aprobada de un documento o fichero fuente,
a partir del cual se pueden realizar cambios subsiguientes.
Abrir rama ("branch") o ramificar
Un módulo puede ser branched o bifurcado en un instante
de tiempo de forma que, desde ese momento en adelante
se tienen dos copias (ramas) que evolucionan de forma
independiente siguiendo su propia línea de desarrollo. El
módulo tiene entonces 2 (o más) "ramas". La ventaja es
que se puede hacer un "merge" de las modificaciones de
ambas ramas, posibilitando la creación de "ramas de
prueba" que contengan código para evaluación, si se
decide que las modificaciones realizadas en la "rama de
prueba" sean preservadas, se hace un "merge" con la rama
principal. Son motivos habituales para la creación de
ramas la creación de nuevas funcionalidades o la
corrección de errores.
Desplegar ("Check-out", "checkout", "co")
Un despliegue crea una copia de trabajo local desde el
repositorio. Se puede especificar una revisión concreta, y
predeterminadamente se suele obtener la última.
"Publicar" o "Enviar" ("commit", "check-in", "ci", "install",
"submit")
Un commit sucede cuando una copia de los cambios
hechos a una copia local es escrita o integrada sobre el
repositorio.
Conflicto
Un conflicto ocurre cuando el sistema no puede manejar
adecuadamente cambios realizados por dos o más
usuarios en un mismo archivo. Por ejemplo, si se da esta
secuencia de circunstancias:
Los usuarios X e Y despliegan versiones del archivo A en
que las líneas n1 hasta n2 son comunes.
El usuario X envía cambios entre las líneas n1 y n2 al
archivo A.
El usuario Y no actualiza el archivo A tras el envío del
usuario X.
El usuario Y realiza cambios entre las líneas n1 y n2.
El usuario Y intenta posteriormente enviar esos cambios al
archivo A.
El sistema es incapaz de fusionar los cambios. El usuario Y
debe resolver el conflicto combinando los cambios, o
eligiendo uno de ellos para descartar el otro.
Resolver
El acto de la intervención del usuario para atender un
conflicto entre diferentes cambios al mismo archivo.
Cambio ("change", "diff", "delta")
Un cambio representa una modificación específica a un
archivo bajo control de versiones. La granularidad de la
modificación considerada un cambio varía entre diferentes
sistemas de control de versiones.
Lista de cambios ("changelist", "change set", "patch")
En muchos sistemas de control de versiones con commits
multi-cambio atómicos, una lista de cambios identifica el
conjunto de cambios hechos en un único commit. Esto
también puede representar una vista secuencial del código
fuente, permitiendo que el fuente sea examinado a partir
de cualquier identificador de lista de cambios particular.
Exportación ("export")
Una exportación es similar a un check-out, salvo porque
crea un árbol de directorios limpio sin los metadatos de
control de versiones presentes en la copia de trabajo. Se
utiliza a menudo de forma previa a la publicación de los
contenidos.
Importación ("import")
Una importación es la acción de copia un árbol de
directorios local (que no es en ese momento una copia de
trabajo) en el repositorio por primera vez.
Integración o fusión ("merge")
Una integración o fusión une dos conjuntos de cambios
sobre un fichero o un conjunto de ficheros en una revisión
unificada de dicho fichero o ficheros.
Esto puede suceder cuando un usuario, trabajando en esos
ficheros, actualiza su copia local con los cambios
realizados, y añadidos al repositorio, por otros usuarios.
Análogamente, este mismo proceso puede ocurrir en el
repositorio cuando un usuario intenta check-in sus
cambios.
Puede suceder después de que el código haya sido
branched, y un problema anterior al branching sea
arreglado en una rama, y se necesite incorporar dicho
arreglo en la otra.
Puede suceder después de que los ficheros hayan sido
branched, desarrollados de forma independiente por un
tiempo, y que entonces se haya requerido que fueran
fundidos de nuevo en un único trunk unificado.
Integración inversa
El proceso de fundir ramas de diferentes equipos en el
trunk principal del sistema de versiones.
Actualización ("sync" o "update")
Una actualización integra los cambios que han sido hechos
en el repositorio (por ejemplo por otras personas) en la
copia de trabajo local.
Copia de trabajo ("workspace")
La copia de trabajo es la copia local de los ficheros de un
repositorio, en un momento del tiempo o revisión
específicos. Todo el trabajo realizado sobre los ficheros en
un repositorio se realiza inicialmente sobre una copia de
trabajo, de ahí su nombre. Conceptualmente, es un cajón
de arena o sandbox.
Congelar
Significa permitir los últimos cambios (commits) para
solucionar las fallas a resolver en una entrega (release) y
suspender cualquier otro cambio antes de una entrega,
con el fin de obtener una versión consistente. Si no se
congela el repositorio, un desarrollador podría comenzar a
resolver una falla cuya resolución no está prevista y cuya
solución dé lugar a efectos colaterales imprevistos.
Formas de colaborar:
Para colaborar en un proyecto usando un sistema de
control de versiones lo primero que hay que hacer es
crearse una copia local obteniendo información del
repositorio. A continuación el usuario puede modificar la
copia. Existen dos esquemas básicos de funcionamiento
para que los usuarios puedan ir aportando sus
modificaciones:
Arquitecturas de almacenamiento:
Podemos clasificar los sistemas de control de versiones
atendiendo a la arquitectura utilizada para el
almacenamiento del código:
Flujos de trabajo:
El flujo de trabajo de un sistema de control de versiones
indica cómo se relacionan los distintos usuarios para
colaborar entre sí en la consecución de los objetivos del
proyecto.
Uso de ramas
Las ramas, en un sistema de control de versiones,
constituyen una potente herramienta que flexibiliza la
forma en la que los colaboradores cooperan en el
proyecto (en inglés Branching Workflows). Las ramas son
solo una herramienta que es posible utilizar de distintas
formas para conseguir distintos objetivos. Veamos
algunas posibilidades.34
Ramas puntuales
Las ramas puntuales, también llamadas ramas de
soporte, son ramas que se crean de forma puntual para
realizar una funcionalidad muy concreta. Por ejemplo
añadir una nueva característica (se les llama ramas de
nueva funcionalidad o directamente por su nombre en
inglés topic branch o feature branch) o corregir un fallo
concreto (se les llama ramas para corregir error o
directamente por su nombre en inglés hotfix branch).