Sobre
Del manual: Git es un sistema de control de revisiones distribuido, rápido y escalable con un conjunto de comandos excepcionalmente rico que proporciona operaciones de alto nivel y acceso completo a los componentes internos.
Ayuda
Para consultar el manual de Git, utilice man git. Hay dos formas de obtener más información sobre un comando específico como git log: man git-log o git help log.
Iniciar un proyecto
En primer lugar, es una buena práctica configurar el nombre y el correo electrónico que se utilizarán en los proyectos:
Shell
git config --global user.name "Tu Nombre Aquí" git config --global user.email su@email.com
Suponiendo que el proyecto a administrar se encuentra en la carpeta mi-proyecto, inicie Git:
cd mi-proyecto git init # Repositorio Git vacío iniciado en .git/ Initialized empty Git repository in .git/
Se ha creado un nuevo directorio .git/ dentro de la carpeta mi-proyecto. Luego, para hacer una copia del contenido completo de todos los archivos en el directorio actual, use:
# El punto '.' representa el directorio actual
git add .
El estado actual de los archivos se denomina snapshot, lo que significaría tomar una instantánea de los archivos. Con git add lo snapshot se guarda temporalmente en el índice, para que el contenido se almacene definitivamente usa:
git commit Commit inicial
# Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. ...
Se le pedirá que ingrese un mensaje para definir este almacenamiento; en este ejemplo se utilizó Commit inicial. No escribir un mensaje cancela el proceso. Se utilizó el editor vi, Esc + i habilita la inserción de texto, luego de escribir el mensaje guardar y salir presionando Esc y luego escribiendo :wq (escribir y salir).
También puede configurar el mensaje en la línea de comando usando -m:
git commit -m "Commit inicial"
Modifique algunos archivos, agregue el contenido actualizado al índice y ejecute commit. A continuación se muestran algunos comandos útiles para ayudar en el proceso.
# Para agregar varios archivos al índice git add archivo1 archivo2 archivo3 # Muestra cambios que no se han agregado al índice git diff # Muestra los cambios que ya están en el índice pero que aún no se han guardado
git diff --cached # Devuelve un resumen de la situación git status # Eliminar un archivo del índice git restore --staged nombre-del-archivo # Para guardar permanentemente git commit
Recuerde escribir el mensaje de commit, guardar y salir.
git commit -a
El comando anterior identificará cualquier modificación en archivos preexistentes, los agregará al índice y ejecutará el commit, todo al mismo tiempo. Los archivos nuevos serán ignorados.
Ejemplo: git format-patch convierte la confirmación en un correo electrónico, usa el título como asunto y el resto del texto como mensaje.
Historia del proyecto
El historial se puede consultar en cualquier momento mediante el comando git log.
# Historial de commit git log # Diferencia completa en cada paso git log -p # Resumen de cambios git log --stat --summary
Gestionando ramas (Branches)
A continuación se analizará el uso de ramas o subdivisiones de un proyecto, el acto de iniciar y gestionar un nuevo proyecto basado en el original. En el comando se utiliza el término inglés branches y para referirse al proyecto inicial se utiliza master. Estos términos se utilizarán en inglés a lo largo de esta documentación para facilitar el aprendizaje.
Un único repositorio Git puede contener various branches de desarrollo.
# Creando una nuevo branch llamado experimental
git branch experimental
Enumerando branches, el asterisco marca lo branch actual:
git branch experimental * master
Cambiando a lo branch experimental:
git switch experimental
Cambia a lo branch experimental con el comando de arriba, edite cualquier archivo y con los comandos de abajo haz commit y vuelve a lo branch master:
git commit -a git switch master
Verifique que el cambio realizado en el archivo mientras estaba en lo branch experimental no esté presente en el master. Para unir lo branch experimental con lo branch master use el comando:
git merge experimental
Al unir lo branch experimental con lo master, todos los cambios realizados en el archivo de lo branch experimental se agregarán a lo master. En este ejemplo anterior, los cambios solo se realizaron en el archivo de lo branch experimental.
Si se hicieran cambios en el mismo archivo en ambos branches, pero en líneas diferentes, al unir los branches se mantendrían ambos cambios.
Ejemplo práctico
Creemos el archivo proyecto.txt con el contenido a continuación y agréguelo a ambos branches:
# Cambiar a la rama maestra git switch master # Crea el archivo proyecto.txt vi proyecto.txt
proyecto.txt
1 2 3
# Agregar proyecto.txt al índice git add proyecto.txt # Guarde git commit -a # Cambiar a lo branch experimental git switch experimental # Combina todos los cambios realizados en el branch
# master incluida una copia del archivo proyecto.txt git merge master
Al ejecutar commit, recuerde agregar una descripción, guardar y salir.
Agrega el número 0 a la primera línea del archivo proyecto.txt mientras estás en lo branch experimental y agrega el número 4 al final del mismo archivo pero estando en lo branch master.
vi proyecto.txt
proyecto.txt | branch experimental
0 1 2 3
git commit -a git switch master vi proyecto.txt
proyecto.txt | branch master
1 2 3 4
git commit -a git merge experimental
Al unir lo branch experimental con lo master usando el comando anterior, el resultado será:
proyecto.txt | branch master
0 1 2 3 4
Vale recordar que en lo branch experimental el archivo continúa con el mismo contenido: 0,1,2,3.
Conflictos
Si se hicieran cambios en la misma línea tanto en lo branch master como en lo experimental, al usar el comando merge se mostraría un error de conflicto y el proceso se interrumpiría pidiendo una resolución. En este caso, Git no sabe cuál de los cambios conservar y, por tanto, necesita la intervención humana para resolver el conflicto.
Continuando con el ejemplo anterior, entra en lo branch experimental, añade -1 a la primera línea, commit, vuelve a lo branch master, añade +1 a la primera línea y commit.
Antes de unir los branches, veamos el aspecto actual de cada archivo:
proyecto.txt
# branch master # branch experimental
+1 -1
0 0
1 1
2 2
3 3
4
Unir:
git merge experimental
Auto-merging proyecto.txt CONFLICT (content): Merge conflict in proyecto.txt Automatic merge failed; fix conflicts and then commit the result.
Git diff mostrará este y otros conflictos existentes y se utiliza precisamente para este propósito.
git diff
Para corregir el conflicto usaremos el comando:
git mergetool
Este comando no necesariamente abrirá un editor para resolver el conflicto a menos que tenga instalada una de las opciones soportadas. En este ejemplo usaremos vimdiff, pero si tienes acceso a la interfaz gráfica puede ser una ventaja usar gvimdiff. Ejecute las siguientes configuraciones en Git:
# Establece vimdiff como predeterminado git config merge.tool vimdiff
# Utilice el estilo diff3 para mostrar conflictos git config merge.conflictstyle diff3
# No pregunta qué editor utilizar git config mergetool.prompt false
Para más información sobre los comandos anteriores:
git help config mergetool
# Lista de editores compatibles
git mergetool --tool-help
Resolver el conflicto:
git mergetool
vimdiff
╔═══════╦══════╦════════╗
║ ║ ║ ║
║ LOCAL ║ BASE ║ REMOTE ║
║ ║ ║ ║
╠═══════╩══════╩════════╣
║ ║
║ MERGED ║
║ ║
╚═══════════════════════╝
Las cuatro visualizaciones son:
- LOCAL: archivo de lo branch actual (master en nuestro ejemplo)
- BASE: versión anterior a los cambios, el ancestro común
- REMOTE: archivo de lo branch que estamos combinando (experimental en nuestro ejemplo)
- MERGED: este es el resultado de la combinación, que se utilizará al final
En vimdiff se utiliza el atajo Ctrl + W 2x para navegar entre ventanas. Utilice el comando :help window-moving dentro del editor para obtener más información sobre la navegación entre ventanas.
Para elegir la versión que desea utilizar, pulse Esc y, a continuación, escriba:
vimdiff
# Para utilizar el fichero BASE :diffg BA
# Para utilizar el fichero LOCAL :diffg LO # Para utilizar el fichero REMOTE :diffg RE
Ahora guarda, cierra, commit y limpia:
# Guardar y cerrar vimdiff Esc :wqa # Commit git commit -m "mensagem" # Elimina los archivos adicionales (por ejemplo, *.orig) # ¡Cuidadoso! Los archivos sin seguimiento serán eliminados git clean -f
También puede editar el archivo combinado(merged) escribiendo un código nuevo y guardándolo en lugar de usar una de las versiones disponibles.
Histórico
El siguiente comando mostrará una bonita representación gráfica del historial de cambios. Aquí los mensajes utilizados para cada commit tendrán mejor sentido.
gitk
Eliminar un Branch
Llegados a este punto, lo branch experimental ha cumplido su propósito de modificar el proyecto sin comprometer la versión original y puede eliminarse mediante el comando:
git branch -d experimental
Este comando comprueba si los cambios de lo branch experimental ya se han aplicado antes de borrarlo. Si has desarrollado una mala idea y quieres descartar los cambios de este branch, utiliza:
git branch -D mala-idea
Conclusión
Usa y abusa de los branches, son fáciles y baratos :-), es una forma estupenda de probar algo diferente.
Este artículo se ha dividido en partes para que no sea demasiado largo y te desanime a seguir aprendiendo, puedes seguir aprendiendo sobre Git leyendo: Uso de Git para compartir y colaborar en un proyecto, que es la continuación de este artículo.
Fuentes
- https://linux.die.net/man/7/gittutorial
- https://git-scm.com/
- https://stackoverflow.com/questions/24852116/what-exactly-is-a-merge-conflict
- https://stackoverflow.com/questions/161813/how-do-i-resolve-merge-conflicts-in-a-git-repository/7589612
- https://www.rosipov.com/blog/use-vimdiff-as-git-mergetool/
- https://chatgpt.com