Git 2020 2021
Git 2020 2021
Git y GitHub
Sistemas de Control de Versiones
https://ndpsoftware.com/git-cheatsheet.html
José Luis González Sánchez. https://github.com/joseluisgs - https://twitter.com/joseluisgonsan 23
Guías de supervivencia
git clone <url-repositorio> crea una copia local del repositorio ubicado en la dirección <url-
repositorio>.
A partir de que se hace la copia, los dos repositorios, el original y la copia, son independientes,
es decir, cualquier cambio en uno de ellos no se verá re ejado en el otro.
Repite con VS Code y GitKraken indicando los pasos que has seguido
git status.
Muestra el estado de los cambios en el repositorio desde la última versión guardada. En
particular, muestra los cheros con cambios en el directorio de trabajo que no se han añadido a la
zona de intercambio temporal y los cheros en la zona de intercambio temporal que no se han
añadido al repositorio.
git add <fichero> añade/actualiza los cambios en el chero <fichero> del directorio de trabajo
a la zona de intercambio temporal.
git add <carpeta> añade/actualiza los cambios en todos los cheros de la carpeta <carpeta>
del directorio de trabajo a la zona de intercambio temporal.
git add . añade/actualiza todos los cambios de todos losaún en la zona de intercambio temporal.
git restore <file>. Elimina los cambios realizados en el fichero en tu directorio de trabajo
git restore --staged <file>. Elimina los cambios realizados en el fichero de la zona de
almacenamiento
OJO: Nos puede servir para recuperar ficheros eliminados por error
git commit -m "mensaje" confirma todos los cambios de la zona de intercambio temporal
añadiéndolos al repositorio y creando una nueva versión del proyecto. "mensaje" es un breve
mensaje describiendo los cambios realizados que se asociará a la nueva versión del proyecto.
git commit --amend -m "mensaje" cambia el mensaje del último commit por el nuevo mensaje
"mensaje".
git show muestra el usuario, el día, la hora y el mensaje del último commit, así como las
diferencias con el anterior.
git show <commit> muestra el usuario, el día, la hora y el mensaje del commit indicado, así
como las diferencias con el anterior.
git show HEAD~X muestra el commit X anterior al último.
git annotate <fichero> o git blame <fichero> muestra el contenido de un fihero anotando
cada línea con información del commit en el que se introdujo. Cada línea de la salida contiene
los 8 primeros dígitos del código hash del commit correspondiente al cambio, el autor de los
cambio, la fecha, el número de línea del chero y el contenido de la línea.
git diff muestra las diferencias entre el directorio de trabajo y la zona de intercambio temporal.
git diff --cached muestra las diferencias entre la zona de intercambio temporal y el último
commit.
git diff HEAD muestra la diferencia entre el directorio de trabajo y el último commit.
git reset <fichero> elimina los cambios del fichero <fichero> de la zona de intercambio
temporal, pero preserva los cambios en el directorio de trabajo.
Para eliminar por completo los cambios de un fichero que han sido guardados en la zona de
intercambio temporal hay que aplicar este comando y después git checkout HEAD --
<fichero>.
git reset --hard <commit> elimina todos los cambios desde el commit <commit> y actualiza el
HEAD este commit.
¡Ojo! Usar con cuidado este comando pues los cambios posteriores al commit indicado se
pierden por completo.
Suele usarse para eliminar todos los cambios en el directorio de trabajo desde el último commit
mediante el comando git reset --hard HEAD.
git reset <commit> actualiza el HEAD al commit <commit>, es decir, elimina todos los
commits posteriores a este commit, pero no elimina los cambios del directorio de trabajo.
Este comando es un poco más complicado. En realidad, hace un par de cosas diferentes
dependiendo de cómo se invoca. Modifica el índice (el llamado "área de preparación"). O bien,
los cambios a los que está comprometido un encabezado de rama están apuntando actualmente
Este comando puede alterar el historial existente (cambiando la confirmación que hace
referencia una rama).
git revert <file> Este comando crea una nueva confirmación que deshace los cambios de una
confirmación anterior. Este comando agrega un nuevo historial al proyecto (no modifica el
historial existente).
Git tiene la posibilidad de etiquetar puntos específicos del historial como importantes. Esta
funcionalidad se usa típicamente para marcar versiones de lanzamiento (v1.0, por ejemplo).
git tag
git tag -a v1.4 -m 'my version 1.4', crea una etiqueta antoada
git show v1.4, muestra una etiqueta
Esto significa que, por ejemplo, en lugar de teclear git commit, solo necesitas teclear git ci. A medida que uses Git,
probablemente también utilizarás otros comandos con frecuencia; no dudes en crear nuevos alias para ellos.
Esta técnica también puede resultar útil para crear comandos que en tu opinión deberían existir. Por ejemplo, para corregir
el problema de usabilidad que encontraste al quitar del área de preparación un archivo, puedes añadir tu propio alias a Git:
git config --global alias.unstage 'reset HEAD --'
Esto hace que los dos comandos siguientes sean equivalentes:
git unstage fileA
git reset HEAD fileA
Esto parece un poco más claro. También es frecuente añadir un comando last, de este modo:
git config --global alias.last 'log -1 HEAD'
Cada uno de estos comandos tiene su propia documentación detallada. Para obtener más información sobre
un comando concreto de los que hemos mencionado aquí, visita los enlaces correspondientes.
https://ndpsoftware.com/git-cheatsheet.html
José Luis González Sánchez. https://github.com/joseluisgs - https://twitter.com/joseluisgonsan 49
Ejercicio
Sobre tu repositorio de clase
Creo un nuevo fichero llamado otro.html y añade el nombre del instuto.
Añadelo a tu zona de intercambio.
Bórralo con la consola o desde el explorador
Recupéralo.
Cambiale el nombre a otro2.html
Confirma los cambios en el repositorio
Modifica los dos ficheros ya añade el nombre del módulo que estas cursando a ellos.
Confirma esos cambios en el repositorio
a tu fichero git.html elimina la primera línea línea, a tu fichero otro.htm añçadele tu dirección de email
Visualiza las diferencias
Confirma los cambios el el repositorio
Repite con VS Code y GitKraken
https://ndpsoftware.com/git-cheatsheet.html
José Luis González Sánchez. https://github.com/joseluisgs - https://twitter.com/joseluisgonsan 52
Añadir un repositorio remoto
git remote add <repositorio-remoto> <url> crea un enlace con el nombre <repositorio-
remoto> a un repositorio remoto ubicado en la dirección <url>.
Cuando se añade un repositorio remoto a un repositorio, Git seguirá también los cambios del
repositorio remoto de manera que se pueden descargar los cambios del repositorio remoto al
local y se pueden subir loscambios del repositorio local al remoto.
git remote muestra un listado con todos los enlaces a repositorios remotos definidos en un
repositorio local.
git remote -v muestra además las direcciones url para cada repositorio remoto.
git pull <remoto> <rama> descarga los cambios de la rama <rama> del repositorio remoto
<remoto> y los integra en la última versión del repositorio local, es decir, en el HEAD.
git fetch <remoto> descarga los cambios del repositorio remoto <remoto> pero no los integra
en la última versión del repositorio local.
git push <remoto> <rama> sube al repositorio remoto <remoto> los cambios de la rama
<rama> en el repositorio local.
git remote remove <name> donde name es el nombre del repositorio remoto
• Desde Git 2.4 se ha añadido la opción push.followTags para activar la opción de sincronizar las
tags por defecto. Sincronizaría todas:
• git config --global push.followTags true
A veces queremos tirar para atrás el último commit que hemos hecho porque hemos añadido más archivos
de la cuenta, queremos hacer commit de otra cosa o, simplemente, porque ahora no tocaba. Si todavía no
has hecho push de tus cambios tienes dos formas de hacer esto que dependerá de si quieres, o no, mantener
los cambios del commit.
https://ndpsoftware.com/git-cheatsheet.html
José Luis González Sánchez. https://github.com/joseluisgs - https://twitter.com/joseluisgonsan 67
Trabajando con ramas
Aquí empieza una de las partes más potentes que tiene
Git y es el uso de ramas para el trabajo compartido y o
colaborativo.
Inicialmente cualquier repositorio tiene una única rama
llamada master donde se van sucediendo todos los
commits de manera lineal.
Una de las característica más útiles de Git es que
permite la creación de ramas para trabajar en distintas
versiones de un proyecto a la vez. Es muy importante
que al comenzar un proyecto creemos una rama, con el
objetivo de dejar la rama principal lo más estable posible.
Al crear una nueva rama siempre se clona la rama en la
que estamos actualmente.
Esto es muy útil si, por ejemplo, se quieren añadir
nuevas funcionalidades al proyecto sin que interfieran
con lo desarrollado hasta ahora. Cuando se termina el
desarrollo de las nuevas funcionalidades las ramas se
pueden fusionar para incorporar lo cambios al proyecto
principal.
De esta manera siempre podemos asegurar que nuestro
proyecto está en perfectas condiciones.
José Luis González Sánchez. https://github.com/joseluisgs - https://twitter.com/joseluisgonsan 68
Trabajando con ramas
Por cada commit Git guarda un HEAD independiente por rama, pudiendo volver a cualquier
momento histórico de una rama, teniendo control para funsionar, restaurar, etc.
Es importante tener en cuenta que se puede generar una maraña en el flujo de trabajo, por lo
que es conveniente ser ordenado y seguir unos patrones de trabajo común dentro del equipo.
git branch muestra las ramas activas de un repositorio indicando con * la rama activa en ese
momento.
git log --graph --oneline muestra la historia del repositorio en forma de grafo (--graph)
incluyendo todas las ramas (--all).
git checkout <rama> actualiza los cheros del directorio de trabajo a la última versión del
repositorio correspondiente a la rama <rama>, y la activa, es decir, HEAD pasa a apuntar al
último commit de esta rama.
git checkout -b <rama> crea una nueva rama con el nombre <rama> y la activa, es decir,
HEAD pasa a apuntar al último commit de esta rama. Este comando es equivalente aplicar los
comandos git branch <rama> y después y después git checkout <rama>.
Saltar entre ramas cambia archivos en tu
directorio de trabajo.
Es importante destacar que cuando saltas a una
rama en Git, los archivos de tu directorio de
trabajo cambian. Si saltas a una rama antigua, tu
directorio de trabajo retrocederá para verse
como lo hacía la última vez que confirmaste un
cambio en dicha rama. Si Git no puede hacer el
cambio limpiamente, no te dejará saltar.
José Luis González Sánchez. https://github.com/joseluisgs - https://twitter.com/joseluisgonsan 72
Eliminar ramas
git branch -d <rama> elimina la rama de nombre <rama> siempre y cuando haya sido
fusionada previamente.
git branch -D <rama> elimina la rama de nombre <rama> incluso si no ha sido fusionada. Si
la rama no ha sido fusionada previamente se perderán todos los cambios de esa rama.
OJO, desde la rama activa nos traemos los cambios de la rama que indiquemos y es esa
la que desaparece. ¡CUIDADO! que podeis perder una rama que no queríais, por
ejemplo master. Comprbar siempre la rama activa con git branch
git merge <rama> integra los cambios de la rama <rama> en la rama actual a la que apunta
HEAD.
Es decir, imaginemos que queremos fusionar los cambios de la raba testing en master.
Nos vamos a master: git checkout master, esto nos hace que el HEAD activo sea el de master,
git merge testing, con esto fusionamos los cambios
Donde nos dice que la versión en HEAD (la rama master, la que habías activado antes de lanzar
el comando de fusión) contiene lo indicado en la parte superior del bloque (todo lo que está
encima de =======) y que la versión en test contiene el resto, lo indicado en la parte inferior
del bloque.
Si deseas usar una herramienta distinta de la escogida por defecto, puedes escogerla entre la
lista de herramientas soportadas mostradas al principio ("merge tool candidates") tecleando el
nombre de dicha herramienta.
git rebase <rama-1> <rama-2> replica los cambios de la rama <rama-2> en la rama <rama-
1> partiendo del ancestro común de ambas ramas. El resultado es el mismo que la fusión de las
dos ramas pero la bifurcación de la <rama-2> desaparece ya que sus commits pasan a estar en
la <rama-1>.
Podemos usarlo:
Colaboración en equipo. Incoprar funcionalidad que se ha confirmado en una rama en otra.
Corrección de errores. Si detectamos un error en unuestra rama principal que ha sido solucionado en
otra rama, podemos incorporarlo.
Recuperar confirmaciones perdidas. Que existan en otra rama. Pero hay que tener cuidado
Es muy importante que adquieras una visión abstrancta de las ramas en tu cabeza, si
no usa un entorno gráfico
Nombre: release-*
Estas ramas se utilizan para preparar el siguiente código en producción. En estas ramas se hacen los últimos ajustes y se corrigen los
últimos bugs antes de pasar el código a producción incorporándolo a la rama master.
Pero debemos entender que es solo una filosofía de trabajo. Además, como herramienta, todo se puede
hacer con tus comandos de git como siempre. Tu equipo puede adoptar esta u otras similares o variaciones
de la misma. En definitiva, si trabajas con Git intenta que tu trabajo siga unas directrices parecidas a estas:
1. Se crea una rama de desarrollo a partir de la maestra.
2. Una rama de publicación se crea a partir de la de desarrollo.
3. Las ramas de función se crean a partir de la de desarrollo.
4. Cuando una función está completa, se fusiona en la rama de desarrollo.
5. Cuando la rama de publicación está lista, se fusiona en la de desarrollo y la maestra.
6. Si se detecta una incidencia en la maestra, se crea una rama de corrección a partir de la maestra.
7. Una vez que la corrección está completa, se fusiona tanto con la de desarrollo como con la maestra.
https://ndpsoftware.com/git-cheatsheet.html
José Luis González Sánchez. https://github.com/joseluisgs - https://twitter.com/joseluisgonsan 101
Referencias
Git. Sitio web de Git.
GitHub. Sitio web de GitHub.
Pro Git. Libro oficial de Git.
Ry's Git Tutorial. Tutorial de Git
gratuito.
Gitcheats. Página de ayuda sobre los
comandos de Git.
Comandos usuales de Git
Aprende Git. Página web para
dominar Git.
Tutoriales Altassian. Pagina web
sobre uso de Git y distintos tutoriales
GitFlow. Página sobre Gitflow