====== Guía básica de Git y GitHub ======
===== Conceptos =====
* GIT: Aplicación para mantener un repositorio local.
* GitHub: Sistema de repositorios públicos pasado en Git.
Flujo de trabajo básico:
- Se modifican los archivos en el directorio de trabajo.
- Se trasladan las modificaciones al "stage". Comando "add".
- Se crea un "snapshot" del "stage" en un momento dado. Comando "commit".
- Se actualiza el repositorio local desde el público. Comando "pull".
- Se actualiza el repositorio público con el local. Comando "push".
Documentación completa en:
https://git-scm.com/book/es/v2
===== Comandos preliminares =====
git --version
git help
===== Configuración inicial =====
git config --global user.name "juanma"
git config --global user.email "juanma@smartastur.com"
Se puede acceder al fichero de configuración de git mediante
git config --global -e
Para establecer un editor de texto diferente a //vi//, por ejemplo, el //joe//:
git config --global core.editor "joe"
===== Iniciar un repositorio =====
Ir a la carpeta raíz del proyecto y teclear
git init
===== Comandos básicos =====
Muestra el estado del repositorio que nos informa de:
- Archivos pendientes de enviar al //stage//
- Archivos del //stage// modificados después del último //snapshot//
git status
git status -s
git status -s -b
Añade archivos del proyecto al //stage//.
git add .
git add -A
git add README.md
git add carpeta
Crea un //snapshot// del //stage//
git commit -m "Mensaje"
Añadir al //stage// y al //snapshot//
git commit -am "Mensaje"
Devolver el proyecto completo al estado del último //commit//
git checkout -- .
Sólo parcialmente
git checkout -- README.md
Historial de commits
git log
git log --oneline --decorate --all --graph
Sacar un archivo del //stage//. Su contenido no cambia en nuestra carpeta de trabajo, sólo que desaparecerá del //stage// o quedará con el contenido que tenía antes de añadirlo a él.
git reset *
git reset README.md
git reset carpeta
Crear un alias para comandos largos, por ejemplo, el //log// o el //status//
git config --global alias.lg "log --oneline --decorate --all --graph"
git lg
git config --global alias.s "status -s -b"
git s
Mostrar las diferencias entre el proyecto y el //stage//. No dice nada al respecto de que pudieran haber cambios sin //commit//.
git diff
Para ver las diferencias entre el //stage// y el //snapshot//.
git diff -staged
===== Comandos para la gestión de commits =====
Volver a un //snapshot// del pasado
git reset --hard 860c6c2
donde //860c6c2// es el identificativo del //snapshot// que se puede obtener con
git reflog
===== Ramas o branches =====
La rama principal es la //master// o //main//, y es la que se utiliza como rama de producción.
Podemos crear ramas para, por ejemplo:
- Abrir una línea de desarrollo sin afectar a la rama principal, y cuando éste termine, se integren los cambios en el proyecto.
- Abrir una línea de desarrollo sobre un //snapshot// para dar servicio a una versión antigua.
Crear una rama
git branch nueva-rama
Lista las ramas creadas
git branch
Activar una rama
git checkout nueva-rama
Diferencias entre ramas
git diff nueva-rama master
Integrar rama en //master//
git checkout master
git merge nueva-rama
Una vez integrada, conviene que sea borrada
git branch -d nueva-rama
===== Etiquetas =====
Son de utilidad para poner marcas de versión.
Poner etiqueta al //snapshot// actual o //HEAD//.
git tag -a v1.0.0 -m "Versión 1.0.0"
Poner etiqueta a un //snpashot// en particular
git tag -a v0.1.0 -m "Versión alfa" 345d7de
Mostrar información completa de la etiqueta
git show v1.0.0
===== Herramientas avanzadas =====
=== Stash ===
Salvar el directorio de trabajo y recupera el último //snapshot//.
git stash
git stash save "Comentarios"
Recuperar el //stash// al directorio de trabajo. Conviene hacerlo después de haber hecho //commit// en el directorio de trabajo, a fin de resolver conflictos.
git stash apply
git stash apply stash@{0}
Lista de //stashs//
git stash list
Borrar //stash//
git stash drop
git stash drop stash@{0}
Recupera el último //stash// y lo borra
git stash pop
Borrar el contenido del stash
git stash clear
=== Rebase ===
Mueve los commits de cierta rama, en la línea del tiempo, hasta justo después del último commit de la rama de destino.
git rebase master
Así, si volvemos a la rama //master// y hacemos un //merge//, éste se realizará necesariamente sin conflictos
git checkout master
git merge nueva-rama
===== GitHub =====
==== Iniciar un repositorio ====
Desde la web se crea el repositorio.
Para iniciar su sincronización con el directorio de trabajo:
git remote add origin git@github.com:JuanmaRoces/prueba.git
git branch -M main
git push -u origin main
De esta forma se suben todos los commits de la carpeta de trabajo al repositorio remoto en GitHub.
==== Comandos básicos ====
Para obtener los cambios del remoto al de trabajo
git pull
Para subir los cambios
git push
Para subir los //tags//
git push --tags
Para comenzar a trabajar en un repositorio remoto que no tenemos en nuestro ordenador
git clone git@github.com:JuanmaRoces/prueba.git
git clone git@github.com:JuanmaRoces/prueba.git carpeta-destino