GUÍA DE REFERENCIA RÁPIDA

Configuración

Operaciones


Configuración inicial

Para comenzar a personalizar aspectos básicos y avanzados de Git debemos saber del funcionamiento y cómo modificar su configuración predeterminada. Una herramienta inherente de Git llamada git config permite establecer y obtener variables de configuración que controlan aspectos del funcionamiento y la apariencia de Git. Estas variables se pueden almacenar en tres lugares diferentes:

  1. [path]/etc/gitconfig (⚙️): Contiene los valores aplicados a cada usuario en el sistema y todos sus repositorios (si pasa la opción --system a git config, lee y escribe desde este archivo de configuración específicamente. Debido a que se trata de un archivo de configuración del sistema, se necesitaría información administrativa o privilegios de superusuario para realizar cambios.

  2. ~/.gitconfig o ~/.config/git/config (⚙️): Contiene valores específicos personalmente para el usuario. Puedes hacer que Git lea y escriba en este archivo específicamente al pasar la opción --global a git config, y esto afecta todos los repositorios con los que trabaja en el sistema del usuario.

  3. .git/config (⚙️): Específico para ese único repositorio. Puede obligar a Git a leer y escribir en este archivo pasando la opción --local a git config, pero de hecho es la predeterminada. Como es de esperar, necesita estar ubicado en algún lugar de un repositorio de Git para que esta opción funcione correctamente.

Cada nivel anula los valores del nivel anterior, por lo que los valores en .git/config superan a los de [path]/etc/gitconfig.

Puede ver todas sus configuraciones y de dónde provienen indicando el siguiente comando:

git config --list --show-origin

git config show


Configuración de identidad

Después de instalar Git, los usuarios deben establecer inmediatamente el nombre de usuario y la dirección de correo eléctronico, que se usarán para cada confirmación de Git.

Configurar el nombre de usuario

git config --global user.name "nombre de usuario" 

Configurar el email para el usuario

git config --global user.email "usuario@correo.com"
Clic ver demo


Configurar editor

Configurar VS code como el editor por defecto para git

git config --global core.editor "code --wait"

La opción --wait es para que la terminal se quede esperando hasta que cerremos el editor de texto.

Ver el archivo de configuración con el editor por defecto

git config --global -e 

git core editor


La propiedad autocrlf para git

Para Windows

Si estás editando archivos en Windows o utilizando algún otro sistema, pero colaborando con más gente que usa Windows. Es muy posible que alguna vez nos topemos con problemas de finales de línea. Esto se debe a que Windows utiliza retorno de carro y salto de línea para marcar los finales de línea de sus archivos. Mientras qie Mac y Linux utilizan solamente el carácter de salto de línea.

Git lo maneja convertiendo automáticamente los finales CRLF en LF al hacer confirmaciones de cambios ( commit ); y, viceversa, al extraer código ( checkout ) a la carpeta de trabajo. Se puede activar esta funcionalidad con el parámetro core.autocrlf. Si estás en una máquina con Windows, ajustalo a true, para convertir finales LF en CRLF cuando se extrae código, lo podemos indicar de la siguiente forma ejecutando el comando:

git config --global core.autocrlf true

Para Mac o Linux

Si estás en una máquina con Linux o Mac, entonces no nos interesa convertir automáticamente los finales de línea al extraer código, sino que interesa arreglar los posibles CRLF que pudieran aparecer accidentalmente. Le podemos indicar a Git que convierta CRLF en LF al confirmar cambios ( commit ), pero no en sentido inverso, lo podemos indicar de la siguiente forma:

git config --global core.autocrlf input


Colores

Git puede marcar con colores los resultados que se muestran en la terminal, ayudándote así a leerlos más fácilmente. Los siguientes parámetros se pueden modificar:

color.ui

Git coloreará automáticamente la mayor parte de los resultados que muestra. Podemos ajustar con precisión cada una de las partes a colorear; pero si deseas activar de un golpe todos los colores por defecto, sólo debemos cambiar a “true” el parámetro ui.color”.

Para desactivar totalmente los colores:

git config --global color.ui false

El valor predeterminado es auto.

color.*

Cuando se requiere ajustar específicamente, comando a comando, donde colorear y cómo colorear, podemos emplear los ajustes particulares de color. Cada uno de ellos se puede fijar en true, false o always:

Si no quieres usar el coloreado en el comando status por ejemplo, puedes indicar:

git config --global color.status false

Además, cada uno de los comandos tiene parámetros adicionales para asignar colores a partes específicas, por si quieres precisar aún más.

Podemos ajustar a cualquiera de los siguientes colores:

También se pueden aplicar atributos como:

Por ejemplo, para mostrar la meta-información del comando diff con letra color cian y con caracteres en negrita, podemos indicar:

git config --global color.diff.meta "cyan bold"

diff color

Otro ejemplo para cambiar los colores del comando status para la salida de color.status.changed (cuando un archivo a cambiado de estado), color.status.untracked (cuando un archivo no es seguido por git) y color.status.added (cuando un archivo es agregado al 'stage area' ):

git config --global color.status.changed "white red bold" 
git config --global color.status.untracked "white magenta bold"
git config --global color.status.added "white green bold"

status color

Recordemos que cualquier mensaje de un comando de git se puede controlar mediante el archivo .gitconfig. Podemos abrir el archivo con el comando git config --global -e y podemos indicar colores usando el siguiente formato:

[color "branch"]
  current = black green dim
  local = yellow
  remote = magenta
[color "diff"]
  meta = yellow bold
  frag = magenta bold
  old = red bold
  new = green bold
  commit = yellow bold
[color "status"]
  added = black green bold dim
  changed = black red bold dim
  untracked = black yellow bold 

status color


ALIAS

La herramienta config también nos permite establecer alias que nos sirven principalmente para ahorrarnos un poco la escritura de comandos más largos. Aquí te dejo algunos ejemplos:

branch

git config --global alias.br branch

checkout

git config --global alias.co checkout

commit

git config --global alias.ci commit 

status

git config --global alias.st status

remote

git config --global alias.rt remote
Clic ver demo


Rama por defecto

Por defecto, Git creará una rama llamada master cuando crees un nuevo repositorio con git init. Desde la versión 2.28 de Git en adelante, puede establecer un nombre diferente para la rama inicial. Para configurar main como el nombre de rama predeterminado, podemos indicar lo siguiente:

git config --global init.defaultBranch main 

Inicializar un proyecto con git

Para iniciar un proyecto en Git, primera debemos situarnos en el directorio donde tendrás tu proyecto o podemos crear en este caso una carpeta y entrar en ella y partir desde cero. Si estás Windows, Mac o Linux podemos crear una carpeta con el comando mkdir y luego entrar en ella con el comando cd

Crea una carpeta para contener el proyecto y accedemos a esa carpeta

mkdir git-tutorial && cd git-tutorial

Inicializar un repositorio en local con git en el directorio actual

git init

Crear un nuevo repositorio en local con el nombre especificado (crea la carpeta y dentro el repositorio local)

git init tutorial-git
Una vez inicializado el repositorio se crea una carpeta oculta llamada .git dentro del proyecto. Resultará obvio, pero conviene decir que nunca se debe borrar esa carpeta (al menos que quieras que tu proyecto no sea controlado por git).

Clic ver demo

init repository


Contenido de la carpeta .git

📂 .git
├── 📂 branches
├── ⚙️ config => contiene las opciones de configuración de este repositorio
├── 📄 description
├── 📄 HEAD => contiene la referencia del commit a partir del cual se trabaja
├── 📂 hooks => contiene los script que se ejecutan en determinado momento
│   ├── 📄 applypatch-msg.sample
│   ├── 📄 commit-msg.sample
│   ├── 📄 fsmonitor-watchman.sample
│   ├── 📄 post-update.sample
│   ├── 📄 pre-applypatch.sample
│   ├── 📄 pre-commit.sample
│   ├── 📄 pre-merge-commit.sample
│   ├── 📄 pre-push.sample
│   ├── 📄 pre-rebase.sample
│   ├── 📄 pre-receive.sample
│   ├── 📄 prepare-commit-msg.sample
│   ├── 📄 push-to-checkout.sample
│   └── 📄 update.sample
├── 📄 index => el área "staging" tiene la información de los archivos que se incluirán en el "commit"
├── 📂 info => relativamente sin importancia contiene el archivo exclude
│   └── 📄 exclude => se puede usa para ignorar archivos en este proyecto (no está versionado como .gitignore)
├── 📂 logs => contiene el historial de las distintas ramas (interactivo con el comando log, reflog)
│   ├── 📄 HEAD
│   └── 📂 refs
│       └── 📂 heads
│           └── 📄 main
├── 📂 objects => el depósito interno de objetos, indexados por SHAs
│   ├── 📄 info
│   └── 📄 pack
└── 📂 refs => La copia maestra de todos los refs que existen en el repositorio, ya sean stashes, tags, etc.
    ├── 📂 heads
    │   └── 📄 main
    └── 📂 tags


Visualización de los cambios en los archivos

STATUS

El comando status muestra las rutas que tienen diferencias entre el archivo de índice y la confirmación HEAD actual, las rutas que tienen diferencias entre el árbol de trabajo y el archivo de índice, y las rutas en el árbol de trabajo que no son rastreadas por Git (y no son ignoradas con archivos .gitinore).

git status

git status

SHORT STATUS

Si bien la salida de estado de git es bastante completa, también es bastante prolija. Git también tiene un indicador corto de estado para que pueda ver sus cambios de una manera más compacta. Si ejecuta git status -s o git status --short en resumen, obtiene una salida mucho más simplificada del comando.

git short status


Agregar archivos a preparación

El staging o área de preparación es un lugar donde se guardan temporalmente los cambios, para luego en caso de ser confirmados serán llevados definitivamente al repositorio. Sabemos que el repositorio es el lugar donde se guardan todos los registros de los cambios realizados a los archivos.

El área del staging se puede considerar como el limbo donde los archivos están esperando por ser enviados al repositorio o ser regresado a la carpeta del proyecto.

Como funciona el staging

Agregar un archivo al stage area

git add archivo.txt

Agregar más de un archivo al stage area

git add archivo1.txt archivo2.txt

Agregar todos los archivos que terminan con la misma extensión

git add *.txt

Agregar todos los archivos al stage area

git add .

Agregar archivos de forma interactiva

git add -i
Clic ver demo

git add interactive


Eliminar archivos seguidos por git

Eliminar un archivo primera forma

rm archivo.txt
git add archivo.txt
git commit -m 'archivo eliminado'

Eliminar un archivo segunda forma

git rm archivo.txt
git commit -m 'archivo eliminado'
Clic ver demo


Bajar y recuperar archivos del stage area

Sacar un archivo del stage area

git rm --cached archivo.txt 

Recuperar un archivo, descartando los cambios

git restore archivo.txt

Clic ver demo

git restore staged


Renombrar archivos

Cuando renombramos un archivo en nuestra copia de trabajo directamente, Git considera esta operación como dos operaciones, la primera es borrar los archivos con el nombre antiguo y el nuevo, y la segunda es añadir el archivo recién nombrado al 'stage area' o área de preparación.

Cambiar nombre a un archivo primera forma

mv archivo1.txt archivo.txt
git status
git add archivo1.txt archivo.txt
git commit -m 'renombrando archivo'

El inconveniente de la operación anterior es que rompe el historial de revisiones del archivo, y no podría obtener el historial de revisiones de este archivo recién nombrado antes de este momento de renombramiento. No es deseable en el control de versiones.

Cambiar nombre a un archivo segunda forma (recomendado)

Git tiene un comando para renombrar archivos y resolver el problema anterior de enlazamiento roto.

git mv archivo1.txt archivo.txt
git commit -m 'archivo renombrado'

Ver los cambios realizados antes de añadir al stage area:

git diff

Ver los cambios realizados estando añadido el archivo al astage area:

git diff --staged 


Configurar repositorio remoto

Si has iniciado un repositorio local con git init, entonces no tendrás ningún repositorio remoto al cual enviar los cambios realizados. Un patrón común a la hora de iniciar un nuevo repositorio es ir a un servicio como Github o Gitlab y tener creado un repositorio para obtener la URL.

Agregar un remoto:

git remote add origin <URL>

Eliminar origen remoto:

git remote remove origin
Clic ver demo

En el ejemplo uso la herramienta de gh cli, para crear un nuevo repositorio en github.
remote add


Eliminar el seguimiento de GIT

Si por error inicilizamos un repositorio local en un directorio que no era simplemente eliminamos la carpeta oculta .git, por medio del siguiente comando:

rm -rf .git

Este comando rm se utiliza para remover directorios con todo su contenido dentro, siempre y cuando se utilice el flag -r y podemos indicar que se lleve a cabo a la fuerza por medio del flag -f de esta manera no nos solicitará confirmaciones.

Clic ver demo


Ignorar archivos

A menudo, necesitaremos que cierta clase de archivos no sean monitoreados por Git. Por lo general, se trata de archivos generados automáticamente, como archivos de registro o archivos producidos por un sistema de compilación. En tales casos, Git nos permite crear un archivo .gitignore donde podemos definir una lista de patrones que nos sirvan para ignorar todo tipo de archivos o directorio que coincidan con ellos.

El archivo .gitignore, es un archivo de texto que le dice a Git qué archivos o carpetas ignorar en un proyecto.

Un archivo .gitignore generalmente se coloca en el directorio raíz de un proyecto. También puedes crear un archivo .gitignore global, y cualquier entrada en ese archivo se ingorará en todos tus repositorios de Git.

Cada entrada en este archivo es una regla o patrón para ignorar archivos o directorios, veamos algunos ejemplos:

# ignora todos los archivos con extensión .a
*.a

# ignora todos los archivos dentro de la carpeta TODO
# pero no en los subdirectorio
/TODO

# ignora todos los archivos en cualquier directorio llamado build
build/

# ignora doc/notas.txt, pero no ignora doc/semana2/notas.txt
doc/*.txt

# ignorar todos los archivos .pdf en el directorio doc/ y cualquiera de sus subdirectorios
doc/**/*.pdf 

En el siguiente repositorio podemos encontrar una colección de plantillas para archivos .gitignore

Cada línea de un archivo .gitignore especifica un patrón. Al decidir si ignorar una ruta, Git normalmente verifica los patrones de gitignore de múltiples fuentes, con el siguiente orden de procedencia, de mayor a menor (dentro de un nivel de precedencia, el último patrón coincidente decide el resultado).


Ramas

Las ramas son una división del estado del código, esto permite crear nuevos caminos a favor de la evolución del código y desarrollo del software. En la práctica ramificar nuestro proyecto es es algo común para poder trabajar sobre una funcionalidad en la que sabemos que nos va a ocupar varios días y posiblemente sea algo experimental, que no sabemos si cuya funcionalidad vamos a incorporar. Existen muchas razones en las que un proyecto tanto a nivel personal o de un equipo deben crear nuevas ramas en su evolución.

Crear una rama nueva

El procedimiento para crear una nueva rama es sencillo. Usando el comando branch, seguido del nombre de la rama.

git branch nueva 

Este comando en sí no produce ninguna salida, pero podrías ver las “branches” de un proyecto con el comando “git branch

Mostrar ramas y sus commits

Para obtener una descripción más detallada de las ramas usamos el comando git show-branch

git show-branch

Esto nos muestra todas las ramas del proyecto con sus commits realizados:

*  [gh-pages~19] modificado index.html
*  [gh-pages~20] actualizada la función
*+ [main] deploy

Pasar de una rama a otra

Para moverse entre las diferentes ramas tenemos el comando checkout que le debemos indicar el nombre de la rama que queremos que sea la activa.

git checkout nueva 

Esta sencilla instrucción tiene mucha potencia, porque nos cambiará automáticamente todos los archivos de nuestro proyecto, los de todas las carpetas, para que tenga el contenido actual de la rama correspondiente. (Es divertido a la vez, ver como se mueven los archivos como por arte de magia)

Crear nuevas ramas y moverse en un solo comando

El comando checkout tiene la posibilidad de crear una rama nueva y moverte a ella en un único paso. Para crear una nueva rama y situarte sobre ella tendrás que darle un nombre y usar el flag -b.

git checkout -b otrarama

Como salida veremos el mensaje “Switched to a otrarama”. El proyecto puede tener varios estados en un momento dado y tú podrás moverte de uno a otro con total libertad y sin tener que cambiar de carpeta ni nada parecido.

Fusionar ramas

A medidas que creamos ramas y cambiamos el estado de los directorios o archivos del proyecto empezará a divergir de una rama a otra. Llegará el momento en el que tengamos que fusionar ramas para poder incorporar el trabajo realizado a la rama master.

El proceso de fusionado se conoce como “merge” y puede llegar a ser muy simple o más complejo si se encuentran cambios que GIT no pueda procesar de manera automática. Git para procesar el merge usa un antecesor común y comprueba los cambios que se han introducido al proyecto desde entonces, combinando el código de ambas ramas.

Para hacer un merge nos situamos en una rama, en este caso la “master”, y decimos con qué otra rama se debe fusionar el código.

El siguiente comando, lanzado desde la rama “master”, permite fusionarla con la rama “nueva”.

git merge nueva
Un merge necesita un mensaje, igual que ocurre con los commit, por lo que al realizar ese comando se abrirá el editor configurado por defecto, en la mayoría de los casos es “Vim”, para que introduzcas los comentarios que estimes oportuno. Para evitar este paso podemos tomar un atajo con el flag -m de la siguiente manera:

git merge nueva -m "Esto es un merge con mensaje"

Borrar ramas

Borrar rama local

git branch -d localBranchName 

Borrar rama remota

git push origin --delete remoteBranchName

Descargar una rama desde el repositorio remoto

Clonamos el proyecto

git clone URL/repo.git NombreProyecto

Creamos un nuevo branch localmente, basado en el branch remoto

git checkout -b nombre_branch origin/nombre_branch