3  Git para novatos

Fecha de publicación

17 de agosto de 2024

Cuando trabajamos en un proyecto, me imagino que te ha pasado algo así:

“notFinal.doc” por Jorge Cham, https://www.phdcomics.com

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.

A diagram demonstrating how a single document grows as the result of sequential changes

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 diagram with one source document that has been modified in two different ways to produce two different versions of the document

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.

A diagram that shows the merging of two different document versions into one document that contains all of the changes from both versions

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.

Tip
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.

Tip

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:

Tip
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.

Tip
git config --global init.defaultBranch main

Con estos comandos puedes editar y listar las configuraciones que acabas de hacer

Tip
git config --global --edit
git config --list

Finalmente para pedir ayuda sobre un comando en particular, se puede utilizar el siguiente comando:

Tip
git help
git config -h
git config --help
git help config

3.2 Inicializar un repositorio

Tip
git init
git status

git init dentro de repositorios?

Borrados de archivos

Tip
rm archivo
rm -rf .git

3.3 Haciendo cambios

A diagram showing how "git add" registers changes in the staging area, while "git commit" moves changes from the staging area to the repository

$ vim bitacora.qmd
# Agregue cualquier texto
# Presione :wq
$ cat bitacora.qmd
Tip
git status
git add bitacoras.qmd

Ahora usaremos los commits convencionales para ir guardando los cambios.

Tip
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?

Tip
git diff
 git commit -m "feat: mi segundo commit"

La forma correcta es hacer esto:

Tip
git add bitacoras.qmd
git diff
git diff --staged

Para ir siguiendo los cambios

Tip
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
Importante

Git no registra directorios por si solos. Tienen que haber archivos dentro de estos.

Tip
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 el HEAD para agregar o eliminar commits de esta. Como reset 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

Tip
# 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

Tip
# 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

:::

Tip
git commit -m "feat: a.txt b.txt"
git reset --hard

Un artículo muy completo al respecto este el siguiente.

git reflog

Tip
git reflog

3.5 Creando repositorios remotos

https://www.github.com

Tip

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.
Tip
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

Tip
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”

Tip

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

Tip
git status
git branch -a
git log --oneline -graph

En rama-detalles agregue más información a su README.md. Lo que quiera

Tip
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

Tip
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:

Tip

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

Tip
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

3.9 Resumen