A distributed revision control system
Git es un sistema de control de versiones conocido por su velocidad, estabilidad y su modelo de colaboración distribuida. Originalmente fue creado en el 2006 para manejar el Kernel de linux, actualmente Git abarca un gran conjunto de características, un activo equipo de desarrollo, y muchas comunidades de hosting.
En tal de almacenar información de archivos en una única central de repositorios, Git le da a cada desarrollador una copia completa del repositorio. Para facilitar la colaboración, Git otorga a cada repositorio los cambios compartidos con cualquier repositorio.
Beneficios de usar Git
Comandos rapidos
Una copia local del repositorio significa que casi toda la acción con el controlador de versiones son mucho más rápidas. En tal de la comunicación con la central del servidor en una coneccion en la red, las acciones en Git son realizadas en una máquina local. Esto también significa que se puede trabajar offline sin cambiar el flujo de trabajo.
Estabilidad
Como cada colaborador esencialmente hace un backup de todo el proyecto, el riesgo de un crasheo del servidor, un archivo corrupto, o cualquier tipo de dato perdido es mucho más bajo que el de un sistema centralizado que se encuentra en un único punto de acceso.
Entorno aislado
Cada copia de un repositorio en Git, remoto o local, contiene el historial completo del proyecto. Esto le da a cada usuario la libertad de experimentar con nuevas adiciones y ediciones para ponerlas públicas en un commit.
Combinacion Eficiente
Un completo historial por cada desarrollador también significa un historial divergente por cada desarrollador. Al momento de hacer un commit local, se está afuera de la sincronización con todos los demás en el proyecto. Para hacer frente a esta masiva cantidad de ramas, Git es muy bueno manejando las líneas divergentes del desarrollo.
Cada repositorio en Git contiene 4 componentes:
El directorio de trabajo
El área de ensayo
El historial de commits
Las ramas de desarrollo
Aquí es donde actualmente se editan los archivos, se compila el código, y se desarrolla el proyecto. Aquí se tiene acceso a un conjunto de comandos que pueden guardar, alterar, y transferir el contenido de un archivo.
Este es un intermediario entre el directorio de trabajo y el historial del proyecto. En tal de forzar a hacer commits todos tus cambios a la vez, Git te permite agruparlos en conjuntos de cambios. Las etapas de cambio no son parte aún del historial del proyecto.
Una vez se han configurado los cambios en la etapa de cambios, se pueden comitear en el historial del proyecto donde lo mantendrá como una revisión “segura”. Los commits son “seguros” en el sentido que Git nunca lo cambiara por el mismo.
Las ramas hacen posible desarrollar múltiples características en paralelo al momento de halar el historial del proyecto.
Las ramas son baratas de hacer, simples de combinar, y fácil de compartir, los desarrolladores usan las ramas para todo desde long-running features con muchos contribuidores hasta a 5-minutos de arreglos.
Git tiene una gran contiene una gran lista de opciones de configuración que cubren todo desde tu nombre hasta tu herramienta favorita de merge. Para realizar estas configuración se utiliza el comando git config o manualmente editandolos en el archivo .gitconfig en el directorio del proyecto.
También es importante al instalar Git configurar la información de usuario, esto es importante ya que se necesita esta información al momento de editar o subir un proyecto público y saber el nombre de los colaboradores y la fecha en la que se realizaron los cambios, también es necesario ya que Git guarda la información de los commit en un servicio de tercero como Github.
Por defecto, Git no viene con ningún acceso directo, pero se pueden agregar por los comandos alias. Ejemplo:
git config --global alias.st status
git config --global alias.ci commit
git config --global alias.co checkout
git config --global alias.br branch
También para conseguir documentación sobre un comando en git se corre el comando git help <command-name>
La diferencia que existe entre en un archivo normal y un repositorio en Git es un directorio .git en la ruta del proyecto. Para crear un repositorio en Git se utiliza el comando git init el cual empieza a crear un track de los archivos que se encuentran es ese directorio.
Para inspeccionar el escenario del proyecto se utiliza el siguiente comando: git status , el cual retorna un mensaje con los cambios realizados, archivos sin track, y cambios sin ser committed, como el siguiente ejemplo:
Los commits representan cada versión guardada de un proyecto, el cual crea una unidad atómica de Git. Cada commit contiene una foto del proyecto, el nombre de usuario, fecha y mensaje del commit de la persona que lo hizo. Este tambien contiene una SHA-1 checksum del contenido completo.
Acerca del punto de mantener copias “seguras” de un proyecto de software, es el poder identificar con precisión el origen del problema que fue presentado. Con este fin es inútil la grabación de un commit sin la facilidad de poder deshacerse de él.
Para deshacerse de estos cambios pueden realizarse diferentes técnicas:
Simplemente eliminar estos commits del historial del proyecto
Dejar el commit como esta y usar un nuevo commit para eliminar los cambios introducidos por el commit anterior
Para esto Git ha desarrollado herramientas dedicadas para cada una de estas situaciones.
En el directorio de trabajo se pueden experimentar todos los tipos de cambios antes de subirlos al repositorio público sin afectar los archivos que se encuentran en la nube, pero hay veces que se torna algo mal y se necesite deshacer de algún tipo de cambio, entonces se utilizan los siguientes comando:
git reset --hard HEAD
git clean -f
Ramas en Git
Una rama en Git es simplemente un puntero móvil de algún commit o conjunto de estos. Al inicio se hace commit, te dan una rama principal que apunta a la última confirmación que ha realizado. Cada vez que confirma, esta avanza de forma automática.
Las ramas multiplican la funcionalidad básica ofrecida por el commit permitiendo a los usuarios a la mesa de su historia. Creación de una nueva rama es similar a solicitar un nuevo entorno de desarrollo, con un directorio de trabajo aislado, área de almacenamiento, y la historia del proyecto.
Esta configuración de git reset hacen que el directorio de trabajo y el de ensayo mache los archivos en el commit más reciente (también llamado HEAD), efectivamente obligando todos los cambios sin comitear.
Git es muy cuidadoso al momento de eliminar código, entonces tu debes también suplir la opción -f para forzar la eliminación de estos archivos.
Para hacer esto a archivos individuales se utiliza el siguiente comando para machear un simple archivo a la versión del commit mas reciente.
git checkout HEAD <file>
Este comando no cambia el historial del proyecto, y se puede reemplazar el HEAD con el ID del commit, rama, o etiqueta para hacer que el archivo mache la versión en ese commit. Pero, no intentes esto con git reset, ya que cambiará tu historial.
En cuanto los conflictos que se pueden ocasionar al momento de combinar 2 ramas que tienen diferentes cambios en la misma porción del código, Git no sabra cual version usar. Esto es llamado merge conflict. Cuando Git encuentra un merge conflict, se muestra un mensaje explicando el conflicto.
Para ver estos conflictos se puede utilizar el comando git status el cual mostrará un mensaje acerca de lo que está pasando como el siguiente:
1 2 3 4 |
# On branch master # Unmerged paths: # # both modified: <file> |
Para resolver este conflicto se utiliza el comando git add y luego commit a este:
git add <file>
git commit
Los repositorios son la central donde se encuentra la información del repositorio para esto Git utiliza diferentes servicios de terceros para la creación de colecciones de repositorios los cuales también contienen una interfaz gráfica las cuales facilitan la visualización de los datos y las iteraciones con el proyecto.
El principal rol de un repositorio remote es de representar otros desarrolladores con tu propio repositorio.
Para ver tu repositorio remoto se utiliza el siguiente comando, y para agregar un poco más de información acerca de este se utiliza la bandera -v:
git remote
Repositorios remotos
Para crear remotos de utilizar el siguiente comando:
git remote add <name> <path-to-repo>
Despues de correr este comando, se puede entrar al repositorio con el <name>.
Git acepta muchas protocolos de red para especificar la locación de un repositorio remoto, incluyendo file://, ssh://, http://, y el custom git://, por ejemplo:
git remote add some-user ssh://git@github.com/some-user/some-repo.git
Para eliminar remotos se utiliza la siguiente línea de comando:
git remote rm <remote-name>
El acto de descargar ramas desde otro repositorio es llamado fetching. Para atraer una rama remota, se puede especificar el repositorio y la rama que se desea buscar con el siguiente comando:
git fetch <remote> <branch>
Para ver las ramas descargadas debes utilizar el siguiente comando:
git branch -r
Un shortcut de los comandos fetch seguido con merge se utiliza el comando pull, esta es una manera más facil de hacer estos procedimientos. Ejemplo:
git pull origin/master
Y para completar este proceso se utiliza el push: git push <remote> <branch
Git, es una herramienta de trabajo indispensable para cualquier empresa de desarrollo de software, ya que esta permite mantener un control de las versiones de los productos. Esta herramienta es especialmente útil en la industria del desarrollo del software, ya que facilita a los desarrolladores en un proyecto de trabajo, contribuir con los cambios de un producto de una forma sencilla, y ayuda a manejar fácilmente los cambios en un producto.