Resumen: Acerca Del Control de Versiones
Resumen: Acerca Del Control de Versiones
Resumen: Acerca Del Control de Versiones
Copias instantáneas.
Git maneja sus datos como un conjunto de copias instantáneas de un sistema de
archivos miniatura. Cada vez que confirmas un cambio, o guardas el estado de tu
proyecto en Git, él copia tus archivos en ese momento y guarda una referencia a esa copia
instantánea. De no haberse modificado Git no almacena el archivo de nuevo, sino un enlace
al archivo anterior idéntico que ya tiene almacenado. Git maneja sus datos como una
secuencia de copias instantáneas.
La mayoría de las operaciones en Git sólo necesitan archivos y recursos locales para
funcionar. Debido a que tienes toda la historia del proyecto en tu disco local, la mayoría de
las operaciones parecen prácticamente inmediatas.
La mayoría de las operaciones en Git sólo necesitan archivos y recursos locales para
funcionar.Debido a que tienes toda la historia del proyecto en tu disco local, la mayoría de la
Las operaciones parecen prácticamente inmediatas.
Por ejemplo, para navegar por la historia del proyecto, Git no necesita conectarse al
servidor para obtener la historia y mostrarla -simplemente la lee directamente de tu
base de datos local. Si quieres ver los cambios introducidos en un archivo entre la
versión actual y la de hace un mes, Git puede buscar el archivo de hace un mes y hacer
un cálculo de diferencias localmente,u obtener una versión antigua desde la red y hacerlo
de manera local. Esto también significa que hay muy poco que no puedes hacer si estás
desconectado o sin VPN.
Todo en Git es verificado mediante una suma de comprobación (checksum) antes de ser
almacenado, y es identificado a partir de ese momento mediante dicha suma. Esto significa
que es imposible cambiar los contenidos de cualquier archivo o directorio sin que Git lo
sepa.
El mecanismo que usa Git para generar esta suma de comprobación se conoce como
hash SHA-1. Se trata de una cadena de 40 caracteres hexadecimales (0-9 y a-f), y se
calcula con base en los contenidos del archivo o estructura del directorio en Git. Un
hash SHA-1 se ve de la siguiente forma:
24b9da6552252987aa493b52f8696cd6d3b00373
Verás estos valores hash por todos lados en Git, ya que guarda todo no por nombre de
archivo, sino por el valor hash de sus contenidos.
Git tiene tres estados principales en los que se pueden encontrar tus archivos: confirmado
(committed), modificado (modified), y preparado (staged). Confirmado: significa que
los datos están almacenados de manera segura en tu base de datos local. Modificado:
significa que has modificado el archivo pero todavía no lo has confirmado a tu base de
datos. Preparado: significa que has marcado un archivo modificado en su versión
actual para que vaya en tu próxima confirmación.
Esto nos lleva a las tres secciones principales de un proyecto de Git: El directorio de Git
(Git directory), el directorio de trabajo (working directory), y el área de preparación
(staging area).
El directorio de Git es donde se almacenan los metadatos y la base de datos de objetos
para tu proyecto. Es la parte más importante de Git, y es lo que se copia cuando se
clona un repositorio desde otra computadora.
El directorio de trabajo es una copia de una versión del proyecto. Estos archivos se
sacan de la base de datos comprimida en el directorio de Git, y se colocan en disco
para que los puedas usar o modificar.
El área de preparación es un archivo,que almacena información acerca de lo que va a ir en
tu próxima confirmación. A veces se le denomina índice (“index”).
El flujo de trabajo básico en Git es algo así:
● Modificas una serie de archivos en tu directorio de trabajo.
● Preparas los archivos, añadiendo a tu área de preparación.
● Confirmas los cambios, lo que toma los archivos tal y como están en el área de
preparación y almacena esa copia instantánea de manera permanente en tu directorio de
Git.
Si una versión concreta de un archivo está en el directorio de Git, se considera
confirmada (committed). Si ha sufrido cambios desde que se obtuvo del repositorio,
pero ha sido añadida al área de preparación, está preparada (staged). Y si ha sufrido
cambios desde que se obtuvo del repositorio, pero no se ha preparado, está modificada
(modified).
Puedes instalarlo como un paquete, a partir de un archivo instalador o bajando el código
fuente y comparándolo tú mismo.
Git trae una herramienta llamada git config, que te permite obtener y establecer variables de
configuración que controlan el aspecto y funcionamiento de Git. Estas variables pueden
almacenarse en tres sitios distintos:
1. Archivo /etc/gitconfig: Contiene valores para todos los usuarios del sistema y todos sus
repositorios. Si pasas la opción --system a git config, lee y escribe específicamente en este
archivo.
2. Archivo ~/.gitconfig o ~/.config/git/config: Este archivo es específico de tu usuario. Puedes
hacer que Git lea y escriba específicamente en este archivo pasando la opción --global.
3. Archivo config en el directorio de Git (es decir, .git/config) del repositorio que estés
utilizando actualmente: Este archivo es específico del repositorio actual.
Cada nivel sobrescribe los valores del nivel anterior, por lo que los valores de .git/config
tienen preferencia sobre los de /etc/gitconfig (C:\Users\$USER). También busca el
archivo /etc/gitconfig, aunque esta ruta es relativa a la raíz MSys, que es donde decidiste
instalar Git en tu sistema Windows cuando ejecutaste el instalador.
Lo primero que deberás hacer cuando instales Git es establecer tu nombre de usuario y
dirección de correo electrónico. Porque los "commits" de Git usan esta información, y es
introducida de manera inmutable en los commits que envías:
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
Sólo necesitas hacer esto una vez si especificas la opción --global, ya que Git siempre
usará esta información para todo lo que hagas en ese sistema. Si quieres sobrescribir esta
información con otro nombre o dirección de correo para proyectos específicos, puedes
ejecutar el comando sin la opción --global cuando estés en ese proyecto.
Muchas de las herramientas de interfaz gráfica te ayudarán a hacer esto la primera vez
que las uses.
Tu Editor.
Tu identidad está configurada, puedes elegir el editor de texto por defecto que se utilizará
cuando Git necesite que introduzcas un mensaje. Si no indicas nada, Git usará el editor por
defecto de tu sistema, si quieres comprobar tu configuración, puedes usar el comando git
config --list para mostrar todas las propiedades que Git ha configurado:
$ git config --list
user.name=John Doe
user.email=johndoe@example.com
color.status=auto
color.branch=auto
color.interactive=auto
color.diff=auto
...
Puede que veas claves repetidas, porque Git lee la misma clave de distintos archivos
(/etc/gitconfig y ~/.gitconfig, por ejemplo). En estos casos, Git usa el último valor para
cada clave única que ve.
También puedes comprobar el valor que Git utilizará para una clave específica ejecutando
git config <key>:
$ git config user.name
John Doe
Si necesitas ayuda usando Git, existen tres formas de ver la página del manual (manpage)
para cualquier comando de Git:
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
Por ejemplo, puedes ver la página del manual para el comando config ejecutando
$ git help config
Estos comandos son muy útiles porque puedes acceder a ellos desde cualquier sitio,
incluso sin conexión.
Ignorar Archivos.
A veces, hay tipos de archivos que no quieres que Git añada automáticamente o que ni
siquiera aparezca como no rastreado, para ello podemos utilizar el comando .gitignore.
La primera línea le indica a Git que ignore cualquier archivo que termine en “.o” o “.a” -
archivos de objeto o librerías que pueden ser producto de compilar tu código. La segunda
línea le indica a Git que ignore todos los archivos que terminan con una tilde (~), la cual es
usada por varios editores de texto como Emacs para marcar archivos temporales. También
puedes incluir cosas como trazas, temporales, o pid directamente; documentación generada
automáticamente; etc. Crear un archivo .gitignore antes de comenzar a trabajar es
generalmente una buena idea, ya que evitas confirmar accidentalmente archivos que en
realidad no quieres incluir en tu repositorio Git.
Las reglas sobre los patrones que puedes incluir en el archivo .gitignore son las siguientes:
● Ignorar las líneas en blanco y aquellas que comienzan con #.
● Aceptar patrones glob estándar.
● Los patrones pueden terminar en barra (/) para especificar un directorio.
● Los patrones pueden negarse si se añade al principio el signo de exclamación (!).
Los patrones glob son una especie de expresión regular simplificada usada por los
terminales. Un asterisco (*) corresponde a cero o más caracteres; [abc] corresponde a
cualquier carácter dentro de los corchetes; el signo de interrogación (?) corresponde a un
carácter cualquiera; y los corchetes sobre caracteres separados por un guión ([0-9])
corresponde a cualquier carácter entre ellos. También puedes usar dos asteriscos para
indicar directorios anidados; a/**/z coincide con a/z, a/b/z, a/b/c/z, etc.
Eliminar Archivos.
Para eliminar archivos de Git, debes eliminarlos de tus archivos rastreados del área de
preparación y luego confirmar.Usa el comando git rm, que además elimina el archivo de tu
directorio de trabajo de manera que no aparezca la próxima vez como un archivo no
rastreado.Si modificaste el archivo y ya lo habías añadido al índice, tendrás que forzar su
eliminación con la opción -f. Esta propiedad existe por seguridad, para prevenir que elimines
accidentalmente datos que aún no han sido guardados como una instantánea y que por lo
tanto no podrás recuperar luego con Git.
Otra cosa que puedas mantener el archivo en tu disco duro pero sin que Git lo siga
rastreando, para hacerlo, utiliza la opción --cached. Al comando git rm puedes pasarle
archivos, directorios y patrones glob.
Deshacer Cosas.
a veces no es posible recuperar algo luego que lo has deshecho. Esta es una de las pocas
áreas en las que Git puede perder parte de tu trabajo si cometes un error.
Una de las acciones más comunes a deshacer es cuando confirmas un cambio antes de
tiempo y olvidas agregar algún archivo, o te equivocas en el mensaje de confirmación. Si
quieres rehacer la confirmación, puedes reconfirmar con la opción --amend.
Este comando utiliza tu área de preparación para la confirmación. Si no has hecho cambios
desde tu última confirmación, entonces la instantánea lucirá exactamente igual y lo único
que cambiarás será el mensaje de confirmación.
Se lanzará el mismo editor de confirmación, pero verás que ya incluye el mensaje de tu
confirmación anterior.
Inspeccionar un Remoto.
Si quieres ver más información acerca de un remoto en particular, puedes ejecutar el
comando git remote show [nombre-remoto].
El comando lista la URL del repositorio remoto y la información del rastreo de ramas. El
comando te indica claramente que si estás en la rama maestra y ejecutas el comando git
pull, automáticamente combinará la rama maestra remota con tu rama local, luego de haber
traído toda la información de ella. También lista todas las referencias remotas de las que ha
traído datos.
La Rama.
Para entender realmente cómo ramifica Git, previamente hemos de examinar la forma en
que almacena sus datos.
Git no los almacena de forma incremental (guardando sólo diferencias), sino que los
almacena como una serie de instantáneas (copias puntuales de los archivos completos, tal
y como se encuentran en ese momento).
En cada confirmación de cambios (commit), Git almacena una instantánea de tu trabajo
preparado. Contiene además unos metadatos con el autor y el mensaje explicativo, y uno o
varios apuntadores a las confirmaciones (commit) que sean padres directos de esta (un
padre en los casos de confirmación normal, y múltiples padres en los casos de estar
confirmando una fusión (merge) de dos o más ramas).
por ejemplo, que tienes una carpeta con tres archivos, que preparas (stage) todos ellos y los
confirmas (commit). Al preparar los archivos, Git realiza una suma de control de cada uno
de ellos (un resumen SHA-1, tal y como se mencionaba en Inicio - Sobre el Control de
Versiones), almacena una copia de cada uno en el repositorio (estas copias se denominan
"blobs"), y guarda cada suma de control en el área de preparación (staging area).
Cuando creas una confirmación con el comando git commit, Git realiza sumas de control de
cada subdirectorio, y las guarda como objetos árbol en el repositorio Git. Después, Git crea
un objeto de confirmación con los metadatos pertinentes y un apuntador al objeto árbol raíz
del proyecto.
En este momento, el repositorio de Git contendrá cinco objetos: un "blob" para cada uno de
los tres archivos, un árbol con la lista de contenidos del directorio (más sus respectivas
relaciones con los "blobs"), y una confirmación de cambios (commit) apuntando a la raíz de
ese árbol y conteniendo el resto de metadatos pertinentes.
Si haces más cambios y vuelves a confirmar, la siguiente confirmación guardará un
apuntador a su confirmación precedente.
Una rama Git es simplemente un apuntador móvil apuntando a una de esas confirmaciones.
La rama por defecto de Git es la rama master. Con la primera confirmación de cambios que
realicemos, se creará esta rama principal master apuntando a dicha confirmación. En cada
confirmación de cambios que realicemos, la rama irá avanzando automáticamente.
Cambiar de Rama.
Para saltar de una rama a otra, tienes que utilizar el comando git checkout.Esto mueve el
apuntador HEAD a la rama nombrada y realizar otra confirmación de cambios.
Observamos que la rama nombrada avanza, mientras que la rama master permanece en la
confirmación donde estaba cuando lanzaste el comando git checkout para saltar.
Este comando realiza dos acciones: Mueve el apuntador HEAD de nuevo a la rama master,
y revierte los archivos de tu directorio de trabajo; dejándolos tal y como estaban en la última
instantánea confirmada en dicha rama master. Esto supone que los cambios que hagas
desde este momento en adelante, divergieron de la antigua versión del proyecto.
Básicamente, lo que se está haciendo es rebobinar el trabajo que habías hecho
temporalmente en la rama nombrada; de tal forma que puedas avanzar en otra dirección
diferente.
Puedes saltar libremente de una a otra según estimes oportuno. Y todo ello simplemente
con tres comandos: git branch, git checkout y git commit.
También puedes ver esto utilizando el comando git log. Si ejecutas git log --oneline --
decorate --graph --all te mostrará el historial de tus confirmaciones, indicando dónde están
los apuntadores de tus ramas y como ha divergido tu historial.
Gestión de Ramas.
El comando git branch tiene más funciones que las de crear y borrar ramas. Si lo lanzas sin
parámetros, obtienes una lista de las ramas presentes en tu proyecto.
$ git branch
iss53
* master
testing
Fijate en el carácter * delante de la rama master: nos indica la rama activa en este momento
(la rama a la que apunta HEAD). Si hacemos una confirmación de cambios (commit), esa
será la rama que avance. Para ver la última confirmación de cambios en cada rama, puedes
usar el comando git branch -v.
$ git branch -v
iss53 93b412c fix javascript issue
* master 7a98805 Merge branch 'iss53'
testing 782fd34 add scott to the author list in the readmes
Otra opción útil para averiguar el estado de las ramas, es filtrarlas y mostrar solo aquellas
que han sido fusionadas o no con la rama actualmente activa.Para ello, Git dispone de las
opciones --merged y --no-merged.