¡Hola! Les comparto aqui la lista de comandos que compilé mientras hacia el curso.
.
Tambien dejé unos extras al final, como la parte de configurar llaves SSH en local y como crear alias en Git.
.
Espero que les sirva 😃
.
1. Comandos básicos
2. Comandos para trabajar con ramas
3. Comandos para trabajar con repositorios remotos
4. Utilidades y otros comandos
5. Comandos para casos de emergencia
6. Cómo configurar llaves SSH en local
7. Cómo crear alias en Git
8. Cómo invocar manuales completos sobre los comandos
git init
Crea la carpeta .git/ para iniciar el repositorio.
.
Ojo, solo tomará en cuenta los archivos y directorios que compartan el mismo directorio que la carpeta .git/
.
Escritura:Git init
.
Ejemplo:Git init
.
git add
Agrega los archivos que indiques a continuación al area de staging.
.
Puedes indicar archivos puntuales, o incluso carpetas.
.
Escritura:
Git add + archivos
.
Ejemplo:Git add .
.
Agrega todos los archivos en el directorio actual.
.
Git commit
Crea una nueva versión en el repositorio con todos los cambios guardados en el area de staging.
.
Ojo, si no agregas un mensaje con “-m”, entonces la terminal te enviará a vim o a nano para escribir el mensaje.
.
Escritura
Git commit
.
Extensiones:
Ejemplo:Git commit -m "mi primer commit"
.
Crea un commit con el mensaje “mi primer commit”.
.Git commit -am "mi segundo commit"
.
Hace un git add para todos los archivos que hayan recibido un git add antes, y luego ejecuta el commit. (Ojo, no hace el add de archivos nuevos. Tienes que hacer el git add antes para que lo incluya).
.Git commit --amend
Envía los cambios que tengas en staging con el commit anterior. (recuerda hacer git add antes).
.
Git config
Te permite hacer configuraciones a git.
.
Puedes hacer cambios solo al repositorio local donde estes parado, o a todos los repositorios actuales y futuros con la extensión “–global”
.
Ojo, si lo usas sin extensión ni parametros, este solo mostrará una lista con las extensiones disponibles para uso.
.
Escritura
Git config + configuración
.
Extensiones
Ejemplo:Git config --global user.name "Mi nombre"
.Git config user.email "mi email"
.
git status
Muestra el estatus actual del repositorio donde estas parado en la terminal.
.
Especificamente muestra:
Escritura
Git status
.
EjemploGit status
.
Git log
Muestra el historial de commits en la rama actual, incluidos sus hash (los id de cada commit) y sus tags.
.
Ojo, se pueden aplicar filtros al log. Puedes leer el man git log para verlos.
.
Escritura
Git log + extensiones
.
Extensiones
Ejemplo 1Git log
.
Muestra el log
.
Ejemplo 2Git log --graph --oneline
.
Muestra un log simplificado con un arbol de branches a la izquierda.
.
Ejemplo 3Git log -S "cabecera"
.
Muestra los commits donde el termino “cabecera” fue relevante.
.
Git restore
Descarta los cambios recientes en los archivos que no se encuentren en el area de Staging, restaurandolos a como estaban en el último commit.
.
Escritura
Git restore + archivo
.
EjemploGit restore historia.txt
.
Git rm
Al igual que el comando rm, borra el archivo que indiques a continuación tanto del directorio local como de la base de datos de git.
.
Su nombre queda registrado en los commits, pero su información quedará borrada. Ya no podrás acceder a él ni con un checkout.
.
Ojo, no funciona sin una extensión.
.
Escritura
Git rm + extensión + archivos
.
Extensiones
EjemploGit rm --force historia.txt
.
Git diff
Compara dos versiones y los cambios que ocurrieron desde la primera hasta la segunda.
.
Ojo, git diff analizará tomando la primera versión que escribas como punto de partida. Asi que atento al orden en el que escribes las versiones (primero la mas vieja, segundo la mas nueva).
.
Ojo, puedes usar HEAD en lugar del tag para referirte al HEAD.
.
Escritura
Git diff + tag version vieja + tag versión nueva
.
EjemploGit diff 31edb48c1566f59e211f74e4d86b35a7fdf12e14 fba45774b74bf651f5f2c33e8bc6d4fd4227460d
.
Git show
Muestra, de forma muy detallada, los cambios ocurridos entre el commit actual y el commit anterior de un archivo, rama, o commit.
.
Ojo, sin no indicas parametros, entonces por defecto muestra el commit de HEAD
.
OJO, Git show se puede combinar con otros argumentos para mostrar otras cosas. Ej: git show-branch, git show-ref.
.
Escritura
Git show + archivo/branch/commit
.
EjemploGit show historia.txt
.Git show-branch
.Git show-ref --tags
.
.
Git checkout
Mueve el HEAD a un commit diferente.
.
HEAD es el nombre de la versión que actualmente puedes ver desde la consola. Por lo tanto, git checkout te permite moverte entre ramas y commits.
.
Tambien puedes revisar archivos puntuales de otras versiones. Pero recuerda que si haces esto (o borras un archivo) y luego haces un commit, entonces estarás “detached from master”.
.
OJO: Si cambias de rama pierdes todos los cambios que no hayas guardado. Esto aplica al staging area y al directorio local.
.
NO CAMBIES DE RAMA SIN ANTES HACER UN COMMIT
.
Ojo, puedes tambien recoger archivos puntuales de otras versiones si escribes el nombre del archivo luego del commitID.
.
Ojo, en ocasiones, esto te sacará del HEAD y te moverá temporalmente a una rama ficticia sin nombre para que no dañes nada importante (error: detached from HEAD)
.
Para seguir trabajando en este caso, debes hacer un git checkout HEAD para volver al HEAD, o crear una nueva rama para hacer experimentos con el archivo viejo.
.
Escritura
Git checkout + archivo/rama/commit
.
Extensiones
EjemplosGit checkout 375ac62
.Git checkout main
.git checkout 38ef0beb4828ca3dd7cd0c9fa001aea9f5c4ed38 historia.txt
.Git checkout -b hotfix
.
Git branch
Crea una nueva rama que inicie a partir del commit indicado.
.
Ojo, si no indicas un commit, entonces la nueva rama partirá por defecto de la posición actual del HEAD.
.
Ojo, si no introduces parametros, entonces el comando te mostrará la lista de ramas del repositorio.
.
Escritura
Git branch + nombre de la nueva rama + tag del commit de partida
.
Extensiones
EjemploGit branch
.Git branch development
.Git branch development 8fbb4a54e3b6098dda62ddc9e44d8ca4bd33b4e7
.
Ejemplo 2Git branch -m master main
.
Cambia el nombre de la rama “master” por “main”.
.
Ejemplo 3Git branch -D development
.
Borra la rama development
.
Ejemplo 4Git branch -r
.
lista las ramas de los repositorios remotos asociados al local.
.
Ejemplo 5Git branch -a
.
Lista todas las ramas del repositorio, incluyendo las locales y las remotas.
.
git merge
Crea un nuevo commit en la rama donde estas parado, y absorbe los datos de la rama que indiques en el comando para combinar ambas en algo nuevo.
.
Git mezcla las ramas y toma los cambios más recientes en cada archivo.
.
Ojo, como es un commit, debes dejar un mensaje al hacer el Merge. (puedes hacerlo en nano cuando introduscaz el comando, o con la extensión “-m” más el mensaje entre comillas).
.
Ojo, cuando haces un Merge, combinas el log de ambas ramas. Es decir, cuando hagas un git log podrás ver los commits de las dos ramas que combinaste.
.
Escritura
Git merge + branch secundaria a combinar
.
Extensiones
Ejemplogit merge cabecera -m "merge de master con cabecera"
.
(hecho desde master)
Git remote
Se utiliza para conectarse con repositorios remotos.
.
Si se usa sin ninguna otra información, entonces muestra una lista de los repositorios remotos a los que está conectado.
.
Ojo, llamar al repositorio remoto “origin” es un estandar de la industria. Pero puede llamarse como sea.
.
Escritura
Git remote
.
Extensiones
EjemploGit remote add origin https://github.com/mistofjoy/practiceblog.git
.Git remote add origin [email protected]:mistofjoy/practiceblog.git
.git remote set-url origin url-ssh-del-repositorio-en-github
.
git push
Permite empujar el contenido de una rama del repositorio local a un repositorio remoto.
.
Ojo, para que funcione tienes que iniciar sesión en github desde la consola luego de insertar el comando.
.
OJO: si empujas una rama que ya existe en el repositorio remoto, github te va a pedir que jales la rama antes de hacer un push (con pull o fetch). Esto es para que no dañes la versión que está en el remoto, sino para que construyas sobre ella.
.
Escritura
Git push + remote-name + branch-to-push
.
Extensiones
EjemploGit push origin master
.Git push origin --tags
.
git pull
Permite jalar a tu repositorio local el contenido de una rama de un repositorio remoto que ya hayas configurado con git remote.
.
Ojo, git pull es una combinación de git fetch y git merge. No hay problema si jalas una rama que no existe en tu repositorio local. Pero si jalas una rama que coincide con tu repositorio local, entonces el comando intentará hacer un merge entre ellas.
.
Ojo, si la rama que intentas jalar coinciden en nombre, pero no en historia (log de commmits), entonces habrá un error que impedirá ejecutar el comando.
.
Para ignorarlo, tienes que usar la extensión “–allow-unrelated-histories”
.
Ojo, tienes que hacer esto para actualizar el repositorio cada vez que ocurran cambios en el repositorio remoto que no tengas en el local.
.
Ojo, es una buena práctica hacer esto con regularidad para que tu repositorio esté al día, en especial antes de hacer un commit y un push.
.
Escritura
git pull + remote-name + branch to pull
.
Extensiones
Ejemplogit pull origin main
.Git pull origin main --allow-unrelated-histories
.
Git tag
Maneja etiquetas que podemos asignar a nuestros commits.
.
Ojo, si solo ingresas el comando git tag, podrás ver la lista de tags en tu repositorio local, y se mostrarán en todos los git log en el futuro.
.
Tambien, si ingresas git show-ref --tags, podrás ver una lista con los tags en tu repositorio local junto a la referencia al momento de crear el tag.
.
OJO, si borras un tag, la única forma de sacarlo de github es con un push especial del tipo git push origin :refs/tags/tag-name
.
Escritura
Git tag + extensión + nombre del tag + ID del commit
.
Extensiones
Ejemplo crear un tagGit tag -a v0.1 -m "resultado de las primeras clases del curso" 375ac62
.
Ejemplo borrar un tag y sacarlo de githubGit tag -d inicio
->Git push origin :refs/tags/inicio
.
gitk
Abre una interfaz de un software de git que te muestra con más detalle el arbol de commits del directorio de trabajo.
.
Ojo, para ejecutarlo desde wsl2, tienes que ejecutarlo con wslview. (es posible que debas tenerlo instalado en windows para que funcione).
.
Ejemplowslview gitk
.
Git clone
Permite clonar un repositorio remoto en un directorio local.
.
Ojo, esto solo trae la rama main al directorio local. Para traer las demás tienes que hacer un git pull de las que desees.
.
Por eso si, trae toda la historia de commits de la rama main. Y tambien trae la dirección de los remote-repos, junto a cualquier otra
.
Ojo, si el repositorio es público, puedes clonarlo sin que te pida usuario ni contraseña.
.
Ojo, Este comando crea una copia de la carpeta que contiene al repositorio remoto dentro del directorio donde se ejecutó el comando.
.
(es decir, si estoy en proyecto1/ y ejecuto el git clone para clonar un repositorio llamado hyperblog, entonces aparecerá proyecto1/hyperblog/).
.
Escritura
Git clone + URL-remote-repo
.
EjemplosGit clone [email protected]:mistofjoy/practiceblog.git
Git rebase
Pega los commits de una rama en la punta de otra rama.
.
Esto permite hacer cambios silenciosos en una rama sin que quede registro de que usaste otra rama para arreglarlos.
.
OJO, Esto reescribe la historia de commits para que parezca que una rama como bugfix partió del último commit de master, aunque no haya sido asi. Por eso es una mala práctica.
.
OJO, esto solo se usa en local.
.
Ojo, primero se debe aplicar el rebase en la rama con los cambios que deseas pegar, y luego en la rama objetivo.
.
Ojo, esto genera los siguientes problemas:
1. La historia de commits y responsables queda alterada
2. Si la rama objetivo avanza mucho antes del rebase, pueden ocurrir muchos conflictos
Escritura
Git rebase + Rama-a-borrar
.
EjemploGit rebase main
(ejecutado desde la rama experimento)
.
(luego)
.Git rebase experimento
(ejecutado desde la rama main)
.
Esto reescribe la historia de commits para que parezca que la rama “experimento” partió desde el ultimo commit que recibió “main”. Aún si esto no fue asi.
.
De hecho, si haces un git log --graph, verás que experimento nunca fue una rama diferente, sino que “main” y “experimento” siempre fueron la misma rama.
.
Si luego borras la rama “experimento” con git branch -D experimento, la rama desaparecerá de todo el registro.
.
Git stash
Guarda en una memoria de git los cambios no agregados al momento de usar el comando.
.
Esto te permite conservar los cambios, con el fin de no perderlos si necesitas consultar otra rama antes de hacer el commit.
.
Mas tarde puedes recuperar lo que guardaste en el stash para completar los cambios y luego hacer el commit.
.
Este es un comando muy usado en proyectos complejos.
.
Ojo, cuando usas git stash, todos los cambios se guardan en el stash y tu rama regresa a la última versión del HEAD.
.
Ojo, cuando reclamas los cambios con git stash pop, estos desaparecen de la memoria del stash
.
Escritura
Git stash + extensión
.
Extensiones
EjemplosGit stash
.
guarda los cambios actuales en el stash
.Git stash list
.
te muestra una lista de los cambios guardados en el stash
.Git stash pop
.
libera los cambios que estaban guardados en el stash dentro de la rama donde ejecutes el comando.
.Git stash branch english-version
.
te desplaza a la rama “english-version” (creandola si no existia), y liberando los cambios guardados en el stash.
.Git stash drop
.
Borra los cambios que tenías guardados en el stash
.
Git clean
Borra archivos nuevos que aún no estan staged o tracked.
.
Ojo, este comando no funciona si se ejecuta por si solo. Tienes que ejecutarlo con sus extensiones.
.
Ojo, este comando no toca a las carpetas ni a las cosas que hayan sido indicadas en el .gitignore.
.
Extensiones
EjemplosGit clean --dry-run
.
Muestra la lista de los que se borraría si usas el comando
.Git clean -f
.
Borra todo lo que se puede borrar con git clean.
.
Git cherry-pick
Hace un git merge con un commit antiguo de una rama diferente.
.
OJO, ESTO ES UNA MALA PRÁCTICA. Esto reconstruye la historia del repositorio y eso rompe la trazabilidad de los cambios.
.
Ojo, El merge no se guarda como un merge en el log, sino que se guarda como un commit nuevo en la rama actual. No hay forma de saber de donde vino la información que se agregó.
.
Escritura
Git cherry-pick + CommitID
.
EjemploGit cherry-pick 7d8eaef
(ejecutado desde la rama main)
.
Ejecuta un merge de “main” con el commit 7d8eaef (que pertenece a otra rama, y está tres commits detrás del HEAD de esa rama).
.
Git grep
Busca palabras o expresiones en los archivos del repositorio y los muestra en pantalla.
.
Tambien puedes usar extensiones para ver cuántas veces usaste una palabra.
.
Ojo, para terminos complejos, lo correcto es encerrar el termino entre comillas
.
Escritura
Git grep + extensión + termino a buscar
.
Extensiones
• “-n” indica las líneas donde se encuentra el término que buscar
• “-c” cuenta la cantidad de veces que la palabra se repite por documento
Ejemplo 1Git grep color
.
Muestra en pantalla los archivos que contienen “color”, junto con las líneas en su interior que contienen la palabra.
.
Ejemplo 2Git grep -n color
.
Muestra además la línea del archivo donde aparece la palabra.
.
Ejemplo 3Git grep -n color
.
Cuenta cuantas veces se repite la palabra “color” en cada archivo.
.
Ejemplo 4Git grep "Etiqueta-html"
.
Cuenta cuantas veces se usa una etiqueta en cada archivo.
.
Git shortlog
Muestra un log por cada colaborador del proyecto
.
Escritura
Git shortlog + extensión
.
Extensiones
• -sn: cuenta el número de commits que ha hecho cada colaborador
• --all: incluye todos los commits que ha realizado cada colaborador, incluyendo los que fueron borrados.
• --no-merges: ignora los merge
Ejemplo 1
Git shortlog
.
Muestra el log de commits por colaborador
.
Ejemplo 2
Git shortlog -sn --all --nor-merges
.
Muestra cuantos commits ha hecho cada colaborador (incluyendo los commits borrados, pero excluyendo los commits que son un merge).
.
Git blame
Muestra el contenido de un archivo junto con el contribuidor que modificó cada línea por última vez, y el Hash del commit donde esa línea fue modificada por última vez.
.
Escritura
Git blame + extensión + nombre del archivo
.
Extensiones
• -c: identa un poco más la información para hacerla más facil de leer.
• -L + línea de inicio +"," + Línea final: Hace un git blame de un documento, pero solo del contenido entre las líneas indicadas en la extensión.
Ejemplo1Git blame blogpost.html
.Git blame -c blogpost.html
.
Ejemplo 2Git blame css/estilos.css -L35,53
.
Hace un git blame del archivo estilos.css en la carpeta css/; pero solo evaluando el contenido entre la línea 35 y 53 del archivo.
git reflog
Muestra la historia de commits de todas las ramas en orden temporal, y con el número de HEAD de cada uno.
.
Esta se usa para identificar el estado del proyecto al que querrías regresar con un git reset
.
Ojo, esto guarda toda la historia del repositorio, incluyendo cuando haces un git reset
.
Escritura
Git reflog
.
EjemploGit reflog
.
Git reset
Desplaza el HEAD a la versión que indiques a continuación, reseteando el repositorio entero a esa versión, y eliminando todas las versiones posteriores
.
Esto resetea las branches y los commits al punto donde estaban cuando hiciste el commit que indicaste en el reset.
.
Usualmente se usa en conjunto con git reflog para identificar el HEAD al que quieres regresar.
.
OJO, ESTO ES UNA MALA PRACTICA. SOLO SE USA EN EMERGENCIAS.
.
Ojo, escribir solo git reset HEAD te permite sacar los archivos que esten actualmente en el staging area sin alterarlos en el directorio local. (es decir, te permite deshacer los git add).
.
Ojo, git reset trabaja solo en el repositorio, asi que no afecta los archivos en el directorio local. Es decir, aunque regreses a la versión 2 (desde la versión 3), tus archivos actuales seguiran siendo los de versión 3. Y aún puedes hacerles add y commit 😮 (ojo, esto no aplica si haces git reset --hard, que es lo común).
.
Esto puede ayudarte a deshacer un commit equivocado (cuando hubo un error en un archivo, o simplemente cuando te equivocaste en el mensaje que ibas a dejar).
.
Ojo, aunque el git log queda reescrito, el git reflog no se reescribe. Alli si queda guardado cuando ocurre un reset, e incluso puedes regresar a como estaba todo antes del reset si usas un hash del reflog.
.
Escritura
Git reset + extensión (si aplica) + commit/“HEAD”
.
Extensiones
Ejemplo 1git reset --soft 8fbb4a54e3b6098dda62ddc9e44d8ca4bd33b4e7
.
Resetea todo el repositorio a cuando estaba cuando ocurrió ese commit (restaurando branches y archivos disponibles aquel entonces)
.
Ojo, el directorio quedará como estaba antes de hacer el reset, asi que tienes que hacer un Checkout para regresar los archivos a la version que deseabas.
.
Ejemplo 2Git reset --hard HEAD@{4}
.
Resetea todo el repositorio y el directorio de trabajo a como estaba cuando se hizo el commit identificado como el HEAD@{4} (esta etiqueta se puede ver cuando usas el git reflog)
.
Ejemplo 3Git reset HEAD
.
Saca todos los cambios del staging area (deshace todos los git add que hayas hecho despues del último commit)
.
Primer paso: Generar tus llaves SSH. Recuerda que es muy buena idea proteger tu llave privada con una contraseña.
.ssh-keygen -t rsa -b 4096 -C "[email protected]"
.
Segundo paso: Terminar de configurar nuestro sistema.
.
En windows y Linux:
#Encender el “servidor” de llaves SSH de tu computadora:eval $(ssh-agent -s)
.
#Añadir tu llave SSH a este “servidor”ssh-add ruta-donde-guardaste-tu-llave-privada
.
En mac:
#Encender el “servidor” de llaves SSH de tu computadora:Eval "$(ssh-agent -s)
.
#Si usas una versión de OSX superior a Mac Sierra (v10.12), debes crear o modificar un archivo “config” en la carpeta de tu usuario con el siguiente contenido (ten cuidado con las mayusculas)
Host *
AddKeysToAgent yes
UseKeyChain yes
IdentityFile ruta-donde-guardaste-tu-llave-privada
#Añadir tu llave SSH al “servidor” de llaves SSH de tu computadora (en caso de error puedes ejecutar este mismo comando pero sin el argumento -kSsh-add -K ruta-donde-guardaste-tu-llave-privada
.
Notas
El protocolo de envío de datos por llaves públicas y privadas se llama ssh (secure shell).
.
Este es el protocolo que se debe usar para conectarte a servidores remotos.
.
A partir de que ambos lados tienen la llave pública del otro, ambos ordenadores pueden transferir información de forma segura a través del protocolo ssh
.
Las llaves públicas y privadas no se generan por repositorio. Se generan por persona.
.
Lo correcto es crear las llaves pública y privada en el Home de tu usuario.
.
El comando es:
.
ssh-keygen -t rsa -b 4096 -C “tu correo electronico en Github”
.
eval $(ssh-agent -s)
Ssh-add ~/.ssh/id_rsa
Git config --global alias.stats “shortlog -sn --all --nor-merges”
.
Esto crea un alias en git que hace que la palabra “stats” sea igual a “shortlog -sn --all --nor-merges”
.
Por lo tanto,
.
Git stats = Git shortlog -sn --all --nor-merges
.
Insertar el comando seguido de la extensión “–help” abre un documento html con información detallada sobre ese comando
.
Ejemplo:
.Git blame --help
Escrito y recopilado por Jhonkar Sufia @mistofjoy 29/04/2021
Vale oro.
Me acabas de salvar con este resumen. Mil gracias.
Guardado para toda la eternidad. Gracias
Gracias por esto, Jhonkar. Sobre todo en el concepto de Git cherry-pick