3 Git para novatos
Cuando trabajamos en un proyecto, me imagino que te ha pasado algo así:
Imagínate que además de tener que lidiar con otros compañeros de trabajo editando el mismo archivo.
Para esto existen los sistemas de control de versiones comienzan con una versión base del documento y luego registran los cambios que realiza en cada paso del camino. Puede considerarlo como una grabación de su progreso: puede rebobinar para comenzar en el documento base y reproducir cada cambio que realizó, hasta llegar eventualmente a su versión más reciente.
Una vez que piense en los cambios como algo separado del documento en sí, podrá pensar en “reproducir” diferentes conjuntos de cambios en el documento base, lo que en última instancia dará como resultado diferentes versiones de ese documento. Por ejemplo, dos usuarios pueden realizar conjuntos de cambios independientes en el mismo documento.
A menos que varios usuarios realicen cambios en la misma sección del documento (un conflicto), puede incorporar dos conjuntos de cambios en el mismo documento base.
Un sistema de control de versiones es una herramienta que realiza un seguimiento de estos cambios por nosotros, creando efectivamente diferentes versiones de nuestros archivos. Nos permite decidir qué cambios se realizarán en la siguiente versión (cada registro de estos cambios se denomina (commit) y mantiene metadatos útiles sobre ellos. El historial completo de confirmaciones para un proyecto en particular y sus metadatos conforman un repositorio. Los repositorios se pueden mantener sincronizados en diferentes computadoras, lo que facilita la colaboración entre diferentes personas.
3.1 Configuración
Para configurar Git, necesitamos establecer nuestro nombre y dirección de correo electrónico. Estos detalles se utilizarán para identificar los cambios que realicemos en el repositorio.
git config --global user.name "Nombre Apellido"
git config --global user.email "nombre.apellido@ucr.ac.cr"
Todos los cambios subidos a Github, Gitlab, Bitbucket, etc. aparecerán con estos datos.
Una configuración importante es el fin de linea ya que este nos dará las líneas correctas para comparar. La explicación detallada de este problema se encuentra en la documentación de git.
En macOS y Linux:
git config --global core.autocrlf input
Y en Windows:
git config --global core.autocrlf true
Para configurar el editor de texto por defecto, se puede utilizar el siguiente comando:
Editor | Comando |
---|---|
Vim | $ git config --global core.editor "vim" |
Emacs | $ git config --global core.editor "emacs -nw" |
Una configuración más es el nombre de la rama principal, en este caso, se recomienda cambiar el nombre de la rama principal de master
a main
.
git config --global init.defaultBranch main
Con estos comandos puedes editar y listar las configuraciones que acabas de hacer
git config --global --edit
git config --list
Finalmente para pedir ayuda sobre un comando en particular, se puede utilizar el siguiente comando:
git help
git config -h
git config --help
git help config
3.2 Inicializar un repositorio
git init
git status
git init
dentro de repositorios?
Borrados de archivos
rm archivo
rm -rf .git
3.3 Haciendo cambios
$ vim bitacora.qmd
# Agregue cualquier texto
# Presione :wq
$ cat bitacora.qmd
git status
git add bitacoras.qmd
Ahora usaremos los commits convencionales para ir guardando los cambios.
git commit -m "feat: mi primer commit"
git log
Vuelvan a editar el archivo bitacoras.qmd
y ejecuten los siguientes commandos en ese orden. que observa?
git diff
git commit -m "feat: mi segundo commit"
La forma correcta es hacer esto:
git add bitacoras.qmd
git diff
git diff --staged
Para ir siguiendo los cambios
git log
git log -1 # Con -N para ver los últimos N cambios
git log --oneline
git log --oneline --graph
git diff HEAD bitacoras.qmd
git diff HEAD~1 bitacoras.qmd
git show HEAD~1 bitacoras.qmd
Git no registra directorios por si solos. Tienen que haber archivos dentro de estos.
mkdir folder_auxiliar
git status
git add folder_auxiliar
git status
touch folder_auxiliar/1.txt folder_auxiliar/2.txt
git status
git add folder_auxiliar
git status
git commit -m "feat: nuevos archivos auxiliares"
3.4 Deshaciendo cambios
Existen tres comandos para deshacer cambios,
restore
manipula el espacio de trabajo o el área de staging restaurando archivos a estados predefinidos (normalmente una versión anterior).reset
actualiza la rama de trabajo, moviendo elHEAD
para agregar o eliminar commits de esta. Comoreset
actualiza el historial de commits, ¡tenga cuidado al manipular commits ya publicadas!revert
no actualiza su historial.revert
crea un nuevo commit que revierte los cambios realizados por otro commit. Es esencialmente una reversión de los cambios anteriores, que hace avanzar su historia.reflog
es un historial de los cambios que se han realizado en el repositorio. Puede ser usado para revertir cambios antiguos.
git restore
# Agrega una línea al final de bitacoras.qmd
git restore # qué pasó?
# Vuelva a agregar la línea
git add bitacoras.qmd
git status
git restore --staged
# qué paso?
git restore -s <id commit> bitacoras.qmd
git revert
# Agregue la línea "EsTe tExTo eStA mAl HeScRito" en bitacoras.qmd
git add bitaoras.qmd
git commit -m "feat: nuevo texto bien escrito"
git log
# Oops. Ahora como arreglamos esto?
git revert HEAD
git reset
:::{.callout-tip}
touch a.txt b.txt
git add a.txt b.txt
git commit -m "feat: a.txt b.txt"
git reset --soft
:::
git commit -m "feat: a.txt b.txt"
git reset --hard
Un artículo muy completo al respecto este el siguiente.
git reflog
git reflog
3.5 Creando repositorios remotos
Creen un repositorio remoto enGitHub con el nombre “practica-git-fulano” (cambien fulano por tu nombre real).
Y sigan las instrucciones para crear un README.md
Con esto vamos a hacer lo siguiente
- Modifique localmente el README.md de su repositorio de modo que contenga
- Su nombre.
- Su actividad favorita fuera de clases.
git add README.md
git commit -m "feat: agrega información al README.md"
git push
Vaya a su repositorio remoto, y busque su README.md
Agregue al README.md
- Cómo harán este semestre para sacar una buena nota?
Verifiquen que el README.md de su computadora no ha cambiado. Ahora ejecuten
git pull
Qué paso?
3.6 Ramas
Una rama dentro degit es una referencia a commit particular.
Vamos a crear una rama llamada “rama-detalles”
Forma #1
git branch rama-detalles
git checkout rama-detalles
Forma #2
git switch -c rama-detalles
Forma #3
git checkout -b rama-detalles
Para verificar donde estamos podemos usar estos commandos
git status
git branch -a
git log --oneline -graph
En rama-detalles
agregue más información a su README.md. Lo que quiera
git add README.md
git commit -m "feat: agrega detalles a README.md"
git switch main
Qué pasó acá?
3.7 Merge y Rebase
Hay dos opciones para unir commits de diferentes ramas.
git merge
Podemos ejecutar las siguientes instrucciones
git switch main
git merge rama-detalles
git log --oneline --graph
git rebase
Vuelva a generar más commits en la rama main
y rama-detalles
.
Ahora haga los siguientes:
Apunte el id de los commits generados: por ejemplo main es 123abc y en rama-detalles es 456dfg
Ahora ejecute el siguiente commando
git switch main
git rebase rama-detalles
git log --oneline --graph
3.8 Clonar repositorios
La magia degit es poder modificar archivos de forma local y que otros vean su trabajo.
Fuera de cualquier directorio de trabajo, ejecute
git clone https://github.com/maikol-solis/Carrera-Git-CA-204-II-2024.git
o
git clone git@github.com:maikol-solis/Carrera-Git-CA-204-II-2024.git
De ahí en adelante seguiremos las instrucciones en https://github.com/maikol-solis/Carrera-Git-CA-204-II-2024