Git¶
Enlaces¶
- Libro Pro Git en español
- Cheat Sheat
- git - la guía sencilla :exclamation:
- Git Tutorials & Training by Atlassian :exclamation:
- Detached HEAD en Git
- Github git tutorial
- La Parábola de Git @ CAPSiDE HQ
- Lleva Git al próximo nivel con Git Flow
- git-flow cheatsheet
- Github Release Stats
Comandos básicos¶
Config:
1 2 3 4 5 6 | |
Alternativamente se pueden hacer todos los cambios simultáneamente editando el fichero ~/.gitconfig. Una configuración podría ser:
1 2 3 4 5 6 7 8 9 | |
Creación repositorio (local; crea el subdirectorio .git):
1 2 | |
Add (fuente):
1 2 3 4 5 6 | |
Commit:
1 | |
Commit general de cambios:
1 | |
Status:
1 | |
Restituir ficheros borrados:
1 | |
Log:
1 | |
Log indicando los ficheros modificados:
1 2 | |
Ficheros modificados en un branch:
1 2 | |
Log indicando los commits que afectan a un fichero (fuente):
1 | |
Localizar el commit inicial de la rama branch_name surgida de master (fuente):
1 | |
Rename:
1 | |
Preparar un servidor:
1 2 3 | |
Conectar la copia de trabajo con un servidor:
1 2 | |
(origin es el nombre de la conexión; puede ser cualquier cosa, aunque si se pone otra cosa habrá que especificar el nombre al hacer push, ya que origin es el nombre de destino predeterminado)
Mostrar la lista de conexiones de la copia de trabajo con servidores:
1 | |
Desconectar la copia de trabajo con un servidor:
1 | |
(origin es el nombre de la conexión; puede ser cualquier otro)
Checkout (remoto):
1 | |
Sincronizar con el servidor remoto:
1 | |
Info (parecido a svn info):
1 | |
Crear un tag
1 2 | |
Eliminación de un tag
1 2 | |
Eliminación de último commit (fuente)
1 | |
Si el commit ya ha subido al repositorio hacer además:
1 | |
Para olvidar cambios (incluso commits) hechos en local (fuente):
1 | |
Diff's¶
Distintos tipos de diff's:
- working vs staging:
git diff - staging vs snapshot:
git diff --staged - working vs snapshot:
git diff HEAD - snapshot vs snapshot:
git diff <from_SHA1> <to_SHA1>
Ficheros modificados entre dos commits:
1 2 3 4 5 | |
Diferencias en un fichero entre dos commits:
1 | |
Muestra la versión de un fichero en un determinado commit:
1 | |
Branches¶
Creación:
1 | |
Listado de branches:
1 | |
Listado de branches locales y remotos:
1 | |
Seleccionar un branch:
1 | |
Sincronizar con el servidor remoto:
1 | |
Seleccionar trunk:
1 | |
Merge:
1 2 3 | |
Abandonar y borrar un branch local:
1 2 | |
Borrar un branch remoto. Si después de hacer lo anterior hacemos un git pull la rama local volverá a crearse, ya que seguía estando en el servidor. Esto podemos arreglarlo de la siguiente manera:
1 | |
o
1 | |
Seleccionar un branch remoto (fuente):
1 | |
Stash¶
Borrado de la lista:
1 | |
Guardar y recuperar con nombre (fuente):
1 2 3 4 5 6 7 8 9 | |
Ver los cambios que contiene un stash (fuente):
1 2 3 4 | |
Ignorar cambios de un fichero incluido en el repositorio¶
(Fuente) No se trata de la típica entrada en .gitignore dado que los ficheros allí listados se supone que ni siquiera forman parte del repositorio. Se trata de tener una versión del fichero en el repositorio pero luego no queremos actualizarlo. Para ello ejecutar:
1 | |
Para averiguar los ficheros que estamos ignorando de esta forma:
1 | |
Y si en algún momento queremos recuperar la detección de cambios en el fichero:
1 | |
Salir de estado "HEAD detached at"¶
En este estado básicamente es que HEAD deja de apuntar al final de una rama (secuencia de commits) para apuntar a un commit concreto directamente. La forma de salir es o volver a hacer checkout de cualquier branch si no se quieren conservar los cambios hechos tras recuperar ese commit, o bien crear un branch temporal para commitear esos cambios y ya luego si se desea incorporarlos a la rama de la que nos habíamos descolgado.
A continuación se describen las dos opciones:
- Si no nos importa perder los cambios
1 | |
- Si hay cambios tras hacer el checkout del commit:
1 2 3 | |
En la fuente de estas ideas se describe un procedimiento más elaborado para reapuntar el <branch> (master en el ejemplo que ponen) a este nuevo branch temporal.
Cambiar el message del último commit¶
(Fuente) Esto sirve si aún no hemos propagado el commit hacia otros repositorios remotos:
1 | |
gitbook¶
La utilidad de línea de comando para compilar los libros a epub por ejemplo se instala con npm:
1 2 | |
Una vez disponible, entraremos en el directorio del repositorio que contenga un gitbook y generaremos un epub:
1 2 3 4 | |
Borrar último commit¶
Para borrar el último commit cuando aún no lo hemos publicado (push) hacer lo siguiente (fuente):
1 | |
Con esto conseguimos que el puntero del branch apunte al commit anterior al HEAD actual. Es importante que el commit que vayamos a borrar sólo esté en nuestro repositorio. Si ya ha sido propagado a otros repositorios, será mejor deshacer los cambios mediante otro commit.
Sustituir autor de todos los commits¶
-
Crear un clon bare del repositorio
-
A partir de origen remoto (suponemos que tenemos todas las copias de trabajo en
~/git):1 2
$ cd ~/git $ git clone --bare https://github.com/user/repo.git -
A partir de origen local:
1 2
$ cd ~/git $ git clone --bare repo repo.git
-
-
Nos situamos en el directorio con el repositorio bare que se acaba de crear:
1$ cd repo.git -
Copiar y pegar en la terminal el siguiente script sustituyendo las siguientes variables por lo que corresponda:
OLD_EMAILCORRECT_NAMECORRECT_EMAIL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#!/bin/sh git filter-branch --env-filter ' OLD_EMAIL="your-old-email@example.com" CORRECT_NAME="Your Correct Name" CORRECT_EMAIL="your-correct-email@example.com" if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ] then export GIT_COMMITTER_NAME="$CORRECT_NAME" export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL" fi if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ] then export GIT_AUTHOR_NAME="$CORRECT_NAME" export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL" fi ' --tag-name-filter cat -- --branches --tags -
Pulsar Enter para ejecutar el script.
- Revisar el log de Git.
-
Sincronizar los cambios al origin:
1$ git push --force --tags origin 'refs/heads/*' -
Borrar el clon temporal:
1 2
$ cd .. $ rm -rf repo.git
Submódulos¶
Documentación: Enlace 1, Enlace 2.
Añadir submódulo (el directorio PATH que se pone al final no debe existir):
1 | |
Clonar un repositorio con submódulos:
1 2 | |
Actualizar repositorio y submódulos:
1 | |
Borrar commits en repositorio remoto¶
Es importante recordar que si los cambios ya han sido compartidos, es decir otras personas los han sincronizado, se va a romper el histórico para estas personas. Pero si el repositorio es personal, se puede hacer lo siguiente:
-
Situarnos en el commit que nos interese:
- Para borrar sólo el último:
git reset HEAD^ --hard - Para borrar varios:
git reset <hash_commit> --hard
- Para borrar sólo el último:
-
Forzar los cambios en el repositorio remoto:
git push origin -f