Tabla de Contenidos

5. Control de versiones

En este tema vamos a ver tareas básicas en Git.

Mas información

Source:Stack overflow Developer survey 2022

Código nuestro que estas en GitHub.
Santificados sean tus commits.
Venga a nosotros tu fetch.
Hágase tu merge tanto en remoto como en local.
Danos hoy nuestro branch de cada día.
Perdona nuestras pulls, así como también nosotros perdonamos a los que nos pushean más rápido;
No nos dejes caer en los conflictos,
y líbranos del checkout.
Amén
---Javier del Moral (2023)

Instalando Git

Al instalar Git en Windows hay varias opciones a tener en cuenta que explicaremos en clase.

Una vez instalado Git, hay que indicar cual es nuestro nombre y nuestro correo.

git config --global user.name "juan"
git config --global user.email juan@micorreo.com

Por último , si estás en el instituto , habrá que configurar el proxy:

git config --global http.proxy http://172.16.0.9:8080
git config --global https.proxy http://172.16.0.9:8080

Para instalar Git en Linux y que sea la última versión usaremos los siguientes comandos (Ya que por ejemplo en Ubuntu 18.04 la versión e un poco vieja):

sudo add-apt-repository ppa:git-core/ppa
sudo apt update
sudo apt install git

El inicio de Git

Los comandos básicos de Git son:

git init



git clone https://github.com/lgonzalezmislata/prueba.git



Estados de un fichero

La staged area en git también se llama a veces cached o index o arbol de trabajo. Es que hay comandos que usan el modificador --cached para referirse a la staged area otros usan --staged y otro --worktree..
  • El comando git rm usa el modificador --cached para referirse a la staged area
  • El comando git restore usa el modificador --staged o --worktree para referirse a la staged area
  • El comando git diff usa el modificador --cached o --staged para referirse a la staged area
--cached --staged --worktree
git rm
git restore
git diff
Por defecto todos los ficheros del anterior commit ya está en el staged area, por eso para quitar un fichero de git hay que borrarlo del staged area. git rm --cached fichero.

git commit -m "mensaje"



git add fichero



git commit -a -m "mensaje"



git restore --staged fichero
También se puede usar el comando git reset fichero pero se creo el nuevo comando git restore que se puede usar la para hacer lo mismo así que recomendamos usar el comando más nuevo.



git rm --cached fichero.



git restore fichero
También se puede usar el comando git checkout fichero pero se creo el nuevo comando git restore que se puede usar la para hacer lo mismo así que recomendamos usar el comando más nuevo.



git status
En la rama master
Cambios a ser confirmados:
  (usa "git restore --staged <archivo>..." para sacar del área de stage)
	nuevos archivos: facturas.html

Cambios no rastreados para el commit:
  (usa "git add <archivo>..." para actualizar lo que será confirmado)
  (usa "git restore <archivo>..." para descartar los cambios en el directorio de trabajo)
	modificados:     main.js

Archivos sin seguimiento:
  (usa "git add <archivo>..." para incluirlo a lo que será confirmado)
	cliente.html



Para simplificar el uso de Git se recomienda hacer el git add justo antes de hace el git commit ya que sino hacemos los siguiente:
  • modificar un ficherio
  • git add
  • modificar el fichero de nuevo
  • Si hacemos ahora un git status. El fichero modificado está a la vez en el estado staged y modified 8-o 8-o 8-o 8-o
  • git commit

En el commit solo se guardan los primeros cambios y no los segundos. Ya que al hacer el git add , git se guarda como está el fichero en ese momento y en el git commit solo se hace como está en ese momento.Aunque si hiciéramos el git commit -a si que se guardaría el segundo cambio.

Más información:

Sincronización de Git

Una misma rama en git puede estar en varios sitios a la vez. El repositorio es el historio donde están todos los commits que se han hecho.

Vamos a explicar cada uno de ellos suponiendo que estamos en la rama master.

git switch master



git push
o
git push origin master



git fetch
o
git fetch origin master



git pull
o
git pull origin master 
El problema es que si hacemos git pull origin master y estamos en otra rama , se hace un merge de origin/master en la rama que estemos y eso no suele ser lo que queríamos hacer. Así que mi recomendación es nunca usar git pull y usar siempre git fetch.
Recuerda: Nunca uses git pull y usa siempre git fetch.



git merge origin/master



Remotes

El Git un "remote" hace referencia a un servidor de Git donde subimos el código. Por defecto cuando hacemos git clone se crea un remote llamado origin.

git remote -v

origin	https://github.com/lgonzalezmislata/prueba.git (fetch)
origin	https://github.com/lgonzalezmislata/prueba.git (push)



git remote add otroservidor https://www.otroservidor.com/lgonzalezmislata/prueba.git

Una vez creado el remote otroservidor ya podremos usarlo en los comandos git push, git fetch o git pull además de usar origin

Borrado de commits

El comando git reset <commit> vuelve a un commit anterior y borrando todos los siguientes.

git reset --hard 0d588ed



git reset --soft 0d588ed



git reset --mixed 0d588ed



git reset --soft HEAD~1


La siguiente tabla resume lo que hace cada modificador:

Borra los commits siguientes Se modifica área de trabajo Modifica staged area
--hard Si Si Si
--mixed Si No Si
--soft Si No No


Ejemplos de como hacer un commit y lo que se necesita hacer después de borrarlo

soft mixed hard
Hacer el commit
vi fichero
git add fichero
git commit -m "mensaje malo"
vi fichero
git add fichero
git commit -m "mensaje malo"
vi fichero
git add fichero
git commit -m "mensaje malo"
Borrar el commit
git reset --soft HEAD~1
git reset --mixed HEAD~1
git reset --hard HEAD~1
Rehacer el commit
git commit -m "mensaje bueno"
git add fichero
git commit -m "mensaje bueno"
vi fichero
git add fichero
git commit -m "mensaje bueno"



Mas información en:

Moverse por git

En git podemos movermos a otras ramas o a otros commit. Para movernos se usa el comando git switch.

También se puede usar el comando git checkout pero se creo el nuevo comando git switch que se puede usar la para hacer lo mismo así que recomendamos usar el comando más nuevo.

Ramas

Para movernos por ramas solo hay que indicar el nombre de la rama

git switch develop

Si la rama es del tipo origin/nombre_rama hay que indicar --detach ya que sobre esa rama no se pueden crear commit puesto que esa rama viene del remoto con git fetch

git switch --detach origin/develop

Commits

Podemos movernos a un commit anterior de forma que los ficheros de ese commit estén en nuestro directorio de trabajo. El lanzar esta orden no modifica ningún commit.Su utilidad es ver como estaba el código en estados anteriores. Hay que indicar --detach ya que sobre commit no se pueden añadir más commits yaque ya están añadidos ya que es un commit que está a mitad del arbol de git.

git switch --detach 2308b63



Si ahora lanzamos el comando git status se mostrará lo siguiente

HEAD desacoplada en 2308b63
nada para hacer commit, el árbol de trabajo está limpio

El significado de HEAD desacoplada o HEAD detached es que ahí no podemos trabajar, no pudiendo hacer nuevos commits desde ahí aunque si que podríamos hacer una nueva rama.

git switch master

Configuración

.gitkeep

Por defecto Git no sube las carpetas vacías, por lo que si queremos que las suba hay que añadir algún fichero. Por convención se suele crear un fichero llamado .gitkeep y al ya haber algún fichero, git subirá esa carpeta.

.gitignore

El fichero .gitignore permite indicar que carpetas no se deben subir a git. El fichero debe estar en el raíz del proyecto de git.

/node_modules

Almacenando contraseñas

Normalmente trabajamos siempre en nuestro ordenador y no queremos todas las veces volver a poner la contraseña. En ese caso se puede decir a git que la almacene y no nos la vuelva a pedir:


git config --global credential.helper cache


git config --global credential.helper store

Stash

Hay veces que queremos guardar temporalmente los cambios para después volver a ellos, por ejemplo si queremos cambiar de rama.

git contiene una orden para hacer eso que es git stash.

git stash push

git contiene una orden para hacer eso:

git stash push --all

Y si luego queremos recuperar los cambios se hace con:

git stash pop

Log

El comando git log permite ver el histórico de commits

git --no-pager log --pretty=oneline



git --no-pager log --pretty=tformat:"%h %cn %cd %s" --date=format:"%d/%m/%Y %H:%M:%S"



Campos a mostrar

Formato de Fechas

Mensajes de commit

Los mensajes de commit deben seguir el siguiente formato:

type(#issue):titulos

Explicación (opcional)

Siendo

Vamos ahora unos ejemplos:

fix(#45):Falla si la fecha está vacía



feat(#456):Mostrar el listado de los pacientes

El listado se ha hecho en HTML en vez de generar un PDF.



Mas información:

Ejercicios

Para todos los ejercicios de este tema, se usarán los comandos de Git siempre que sea posible y los mensajes de los commits deberán seguir el formato explicado en clase.

Ejercicio 1

Siempre antes de cada commit deberás lanzar el comando git status para ver el estado de los ficheros.

Ejercicio 2

En este ejercicio vamos a tener 2 carpetas que estarán "apuntando" al mismo repositorio de Git. Las carpetas las vamos a llamar "A" y "B".

Ejercicio 3

Ejercicio 4

Crea un nuevo proyecto de NodeJS y haz lo siguiente:

Modifica el proyecto de Git de forma que no se suba la carpeta node_moules y si que se suba la carpeta dist