Course of git follow Fernando Herrera´s course in DevTalles
git --version # Ver la versión de git
git help # Ver comandos ayuda
git --help config # Ver comandos ayuda de config
git config list # Ver configuraciones
git config --local --list # Ver la configuración del proyecto actual (Local)
git config --local user.username "John Doope"
git config --local user.name "johndoope"
git config --local user.email "johndoope@gmail.com"
git config --global --list # Ver la configuración de tu usuario (Global)
git config --global user.name "John Doope" # Asignar nombre del usuario global
git config --global user.username "johndoope" # Asignar nombre de usuario global
git config --global user.email "johndoope@gmail.com" # Asignar email de usuario global
git config --global -e # Ver configuraciones globales
git config -e # Ver configuraciones de proyecto
git config --global --unset user.name # Eliminar una configuracion global user.name
git init # Inicializar un repositorio
git init <name> # Inicializar un repositorio con nombre
git status # Ver los archivos que tienen cambios
git status --short # Ver los archivos que tienen cambios forma corta
git add <name> # Agregar un archivo al stage
git add . # Agregar todos los archivos al stage
git checkout -- . # Reconstruir el proyecto a como estaba antes
git brach # Listar las ramas
git branch <name> # Crear nombre de rama
git branch -m <name> # Renombrar rama
git branch -m <old-name> <new-name> # Renombrar rama
git diff # Ver los cambios entre archivos
git diff <file-name> # Ver los cambios entre archivos de un archivo especifico
git diff --staged # Ver los cambios entre archivos en el stage
git diff --staged <file-name> # Ver los cambios entre archivos de un archivo especifico que esta en el stage
git diff HEAD~1 HEAD # Compara la segunda confirmación más reciente con la más reciente
git diff HEAD~1 HEAD~2 -- <file-name> # Ver los cambios entre commits de un archivo especifico
git diff HEAD <branch-name> -- <file-name> # Ver los cambios entre commits de un archivo especifico
git diff <hash> <hash> # Ver los cambios entre commits con HASH, el hash mas reciente en segundo lugar
git diff <branch-name> <branch-name> # Ver los cambios entre ramas
git diff <branch-name> <branch-name> -- <file-name> # Ver los cambios entre ramas de un archivo especifico
git commit # Hacer commit
git commit -m "Coment" # Crear un commit con mensaje
git commit -am "message" # Agregar un commit de forma abreviada (add message)
git commit --amend -m "message" # Reescribir el commit anterior o correguirlo
git reset --soft HEAD^ # Revertir el cambio anterior (ejem. ^2)
git commit --amend # Abre todo el editor para reescribir el commit
git commit --amend --date="AAAA-MM-DD HH:MM:SS" # Cambia la fecha de un commit
git reset --soft <65ed0b2> # Revertir el cambio anterior con HASH
git reset --mixed <769efb3> # Revertir el cambio anterior, no deja en el stage
git reset --hard <f710079> # Revertir el cambio anterior, destructivo
git mv destruir-mundo.md salvar-mundo.md # Renombrar archivo
git rm salvar-mundo.md # Eliminar archivo
git checkout <branch-name> # Cambiar de rama
git checkout -b <branch-name> -f # Crar rama y cambiar a rama inmediatamente
git checkout -- <file-name> # Reconstruir el archivo como estaba antes
git switch <branch-name> # Cambiar de rama
git switch -c <branch-name> # Crear rama y cambiar a rama inmediatamente
git branch -d <branch-name> # Eliminar rama
git branch -D <branch-name> # Eliminar rama forzadamente
git branch -d <branch-name> -f # Eliminar rama forzadamente
git tag <tag-name> # Crear una etiqueta
git tag # Listar las etiquetas
git tag -d <tag-name> # Eliminar una etiqueta
git tag -a <tag-name> -m "message" # Crear una etiqueta con annotate(-a)
git tag -a <tag-name> <hash> -m "message" # Crear una etiqueta a un commit con el HASH
git show <tag-name> # Ver la informacion de un tag
git show <hash> # Ver la informacion de un commit con el HASH
git stash # Guardar cambios momentaneos
git stash list # Listar los cambios momentaneos
git stash pop # Recupera el ultimo stash y lo aplica
git stash apply stash@{0} # Recupera el stash con el id y NO lo borra
git stash drop stash@{0} # Elimina la posision 0 del stash
git stash show stash@{0} # Muestra la info del stash 0
git stash save "message" # Crear un stash con un nombre
git stash list --stat # Lista los stash con mas información
git stash clear # Limpia todos los stash
git revert HEAD # Hacer rollback al commit anterior
git revert --no-edit HEAD # Hacer rollback al commit anterior sin abrir el editor
git revert -n HEAD # Hacer rollback al commit anterior sin hacer commit
git revert --staged <hash_del_commit> # Hacer rollback con el hash del commit para revertir cambios. La bandera --staged es fundamental. Indica a Git que mantenga los cambios en el stage.
git revert HEAD --no-edit <file-name> # Hacer rollback al commit anterior de un archivo especifico sin abrir el editor
git revert -m 1 <hash_del_commit_merge> # Hacer rollback en git con el hash del merge para revertir cambios. La bandera -m 1 es fundamental. Indica a Git que mantenga la línea principal (la rama en la que estabas cuando hiciste el merge).
git log -S "procesarRemision(remision.id)" # La opción -S significa "pickaxe search". Git busca todos los commits donde la cantidad de veces que aparece esa cadena cambió.
git log -2 # Ver los ultimos 2 commits (confirmaciones)
git log -2 README.md # Ver los ultimos 2 commits de un archivo especifico
git log --since="Month Day Year" --until="Month Day Year" # Ver los commits entre fechas
git log --since="2023-01-01" --until="2023-12-31" # Ver los commits entre fechas
git log --since="yesterday" --until="today" # Ver los commits entre fechas
git log --since="1 week ago" --until="today" # Ver los commits
git log --since="15 Jul 2024" # Ver los commits
git log --since="15 July 2024" # Ver los commits
git restore --staged <file-name> # Quitar un archivo del stage (Area de preparación)
git restore --staged # Quitar todos los archivos del stage
git merge <branch-name> # Hacer merge de una rama (se esta en main, <brach-name> a main)
git merge <branch-name> main # Hacer merge desde otra rama, <branch-name> a main (git marge source destination)
git merge <branch-name> --ff-only # Hacer merge de una rama (se esta en main, <brach-name> a main) forzando el fast-forward
git merge <branch-name> --no-ff # Hacer merge de una rama (se esta en main, <brach-name> a main) forzando el no fast-forward (fucion recursivo)
git merge --squash <branch-name> # Hacer merge de una rama (se esta en main, <brach-name> a main) y aplana los commits en uno solo, se debe hacer commit despues de hacer el merge
git merge -s octopus <branch-name> <branch-name2> <branch-name3> # Integrar múltiples ramas en una sola fusión (merge) utilizando la estrategia de fusión "octopus" (pulpo). Esta estrategia es útil cuando se desea combinar varias ramas en un solo commit de fusión.
git merge --abort # Abortar el merge
git rebase <branch-name> # Hacer rebase
git rebase -i HEAD~4 # Hacer rebase itereactivo 4 commits anteriores
git rebase --continue # Continuar con el rebase interactivo
git rebase --abort # La rama se volverá al estado anterior a la rebase interactiva
git rebase <branch-name> --onto <new-base-branch> <old-base-branch> # Rebase de una rama sobre otra rama base
git cherry-pick <hash> # Aplicar un commit específico de otra rama a la rama actual
git cherry-pick <hash1> <hash2> <hash3> # Aplicar varios commits específicos de otra rama a la rama actual
git cherry-pick -n <hash> # Aplicar un commit específico de otra rama a la rama actual sin hacer commit
git cherry-pick -x <hash> # Aplicar un commit específico de otra rama a la rama actual y agregar una referencia al commit original en el mensaje de commit
git cherry-pick --continue # Continuar con el cherry-pick después de resolver conflictos
git cherry-pick --abort # Abortar el cherry-pick
git bisect start # Iniciar el proceso de búsqueda binaria para encontrar un commit defectuoso
git bisect bad # Marcar el commit actual como defectuoso
git bisect good # Marcar el commit actual como bueno
git bisect reset # Finalizar el proceso de búsqueda binaria y volver al estado original
git bisect good <hash> <hash> <hash> ... # Marcar varios commits como buenos
git bisect run <command> # Ejecutar un comando en cada commit durante la búsqueda binaria
git worktree add <path> <branch-name> # Crear un nuevo árbol de trabajo (worktree) en la ruta especificada y asociarlo a la rama especificada
cd <path> # Cambiar al directorio del nuevo árbol de trabajo (worktree)
git worktree list # Listar todos los árboles de trabajo (worktrees) asociados al repositorio actual
git worktree remove <path> # Eliminar un árbol de trabajo (worktree) en la ruta especificada
git submodule add <repository-url> <path> # Agregar un submódulo al repositorio actual en la ruta especificada
git submodule status # Ver el estado de los submódulos
git submodule update --init # Inicializar y actualizar los submódulos
git submodule update --init <submodule-path> # Inicializar y actualizar un submódulo específico
git submodule update --init --remote # Inicializar y actualizar los submódulos, obteniendo la última versión de cada submódulo desde su repositorio remoto
git submodule update --remote <submodule-path> # Actualizar un submódulo específico desde su repositorio remoto
git submodule --deinit <submodule-path> # Desinicializar un submódulo específico, eliminando su directorio de trabajo y desasociándolo del repositorio principal
git rm <submodule-path> # Eliminar un submódulo del repositorio principal y eliminar su entrada del archivo .gitmodules
git init <submodule-path> # Inicializar un submódulo específico, creando su directorio de trabajo y configurando su repositorio
git filter-repo --path <submodule-path> --invert-paths # Eliminar un submódulo específico de todo el historial de commits del repositorio principal
git submodule add <new-submodule_path> <new-submodule-url> # Agregar un nuevo submódulo al repositorio principal en la ruta especificada y asociarlo a la URL del repositorio remoto
git lfs # Instalar Git Large File Storage (LFS) para manejar archivos grandes en el repositorio
git lfs install # Inicializar Git LFS en el repositorio actual
git lfs track "*.psd" # Configurar Git LFS para rastrear archivos con la extensión .psd
git lfs track "*.zip" # Configurar Git LFS para rastrear archivos con la extensión .zip
git add .gitattributes # Agregar el archivo .gitattributes generado por Git LFS al repositorio
Para eliminar parte del historial de commits en Git, puedes usar el comando git rebase -i con la opción --interactive para editar el historial de commits de manera interactiva. Luego, en el editor de texto que se abre, puedes marcar los commits que deseas eliminar con la opción drop, guardar y cerrar el editor. Finalmente, puedes forzar la actualización del historial con git push --force
git rebase -i HEAD~1 # Hacer rebase itereactivo 4 commits anteriores
git push --force # Forzar la actualización del historial
git remote add origin https://...... (git rao) # Conectar con repositorio github
git push -u origin main (git puom) # Hacer push a github
git remote add upstream https://...... (git rau) # Hacer referencia a otro repositorio Fork
git clone --depth=1 <repo> # Clonar un repositorio Git sin el historial de commits
git clone --branch <branchname> <remote-repo-url> # Clonar una rama especifica
git clone <repo> new_repo # Clonar un repositorio Git en una carpeta con nombre diferente
git push --tags # Publicar todas las etiquetas
git fetch # Actualizar las referencias con el servidor git
git checkout HASH <file-name> # Revertir el cambio con el HASH de un archivo
git checkout HEAD~1 -- <file-name> # Revertir el cambio con el HASH de un archivo y pasa al staged
git status -sb # Ver el estado de la rama
git status -short --branch # Ver el estado de la rama
git pull --all # Traer todo del repositorio
git push --all # Subir todo del repositorio
git branch --all # Ver todas las ramas del repositorio
git branch --a # Ver todas las ramas del repositorio
git push origin :<branch-name> # Eliminar la rama desde el origen
git remote prune origin # Revisa y actualiza las referencias de las ramas
git remote -v # Ver los remotos del repositorio
git remote set-url origin git@github-jonanv:jonanv/git-course.git # Cambiar la url del remoto
git remote add back-up /home/repl/datacamp # (Añadir un remoto nuevo) Añade el nombre back-up para el repositorio /home/repl/datacamp.
git reflog # Muestra todo el historial de commits
git reflog show # Muestra todo el historial de commits
git reflog show <hash> # Muestra todo el historial de commits a partir de un commit especifico
git reflog expire # Expira las entradas del reflog según la política de expiración predeterminada
git reflog --since "2 weeks ago" --until "1 week ago" # Muestra el historial de commits entre fechas
Para eliminar un archivo de todo el historial de commits en Git, puedes usar la herramienta git filter-repo. Esta herramienta permite reescribir el historial de commits y eliminar archivos específicos de manera eficiente. A continuación, se muestra cómo hacerlo:
pip install git-filter-repo
git filter-repo --path secret.txt --invert-paths
git filter-repo --path config.init --invert-paths --force
--path # Especifica la ruta del archivo o directorio que deseas filtrar. Puedes usar rutas relativas o absolutas.
--invert-paths # Indica que deseas eliminar el archivo o directorio especificado en lugar de mantenerlo. Esto significa que todos los commits que contienen ese archivo o directorio serán eliminados del historial.
git config --global alias.rebuild "checkout -- ."
co = checkout
lodag = log --oneline --decorate --all --graph
unstage = reset HEAD --
s = status
sw = switch
bsc = branch --show-current
rank = shortlog -sn --no-merges
alias = config --get-regexp ^alias\\.
b = branch
rv = remote -v
fo = fetch origin
pso = push origin
plo = pull origin
rb = checkout -- .
ss = status --short
ssb = status --short --branch
rbf = checkout --
ba = branch --all
rpo = remote prune origin
t = tag
ta = tag -a
pt = push --tags
ce = config -e
git branch -M master
git config --global init.defaultBranch main
git config --global user.signingkey <SSH_KEY_ID>
git config --global commit.gpgsign true
git log --show-signature # Verify all commits
git log --show-signature -1 # Verify last commit
🧩 PASO 1 — Ver si ya tienes llave SSH
En PowerShell o Git Bash:
ls ~/.ssh
Si ves algo como:
id_ed25519
id_ed25519.pub
👉 Ya tienes llave, salta al PASO 3
🧩 PASO 2 — Crear llave SSH (si no tienes)
ssh-keygen -t ed25519 -C "tu_email_de_github@correo.com"
Dale Enter a todo (Opcional: ponle passphrase)
🧩 PASO 3 — Subir la llave a GitHub
Copia tu llave pública:
cat ~/.ssh/id_ed25519.pub
Ve a: 👉 https://github.com/settings/keys
Haz clic en:
- New SSH Key
Y MUY IMPORTANTE:
- Title: Mi PC trabajo
- Key type: 🔽 Signing key
- Pega la llave
- Save
🧩 PASO 4 — Decirle a Git que firme con SSH
Configura esto:
git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
git config --global commit.gpgsign true
🧩 PASO 5 — Arreglar tu commit actual
Firma el commit que ya existe:
git commit --amend --no-edit -S
🧩 PASO 6 — Push
git push --force-with-lease
1️⃣ Verifica que Git quedó configurado para firmar con SSH
Corre esto:
git config --global --get gpg.format
git config --global --get user.signingkey
git config --global --get commit.gpgsign
Debe salir algo así:
ssh
C:/Users/TU_USUARIO/.ssh/id_ed25519.pub
true
1️⃣ Arranca el ssh-agent
Ejecuta esto tal cual:
eval "$(ssh-agent -s)"
Deberías ver algo como:
Agent pid 1234
2️⃣ Agrega tu llave SSH
ssh-add ~/.ssh/id_ed25519
Si te pide passphrase → ponla Si no da error → perfecto
3️⃣ Verifica que quedó cargada
ssh-add -l
Debe mostrar algo como:
256 SHA256:xxxxx id_ed25519 (ED25519)
1️⃣ Crea el archivo que Git necesita
En Git Bash:
mkdir -p ~/.config/git
touch ~/.config/git/allowed_signers
2️⃣ Mete tu llave pública ahí dentro
Primero copia tu llave:
cat ~/.ssh/id_ed25519.pub
Ahora edita el archivo:
nano ~/.config/git/allowed_signers
Pega esta línea en UNA sola línea:
<USER> <PEGA_AQUÍ_TU_LLAVE_COMPLETA>
Ejemplo real:
pruebauser ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMabc123xyz... tucorreo@dominio.com
Guarda:
- CTRL + O → Enter
- CTRL + X
3️⃣ Dile a Git que use ese archivo
git config --global gpg.ssh.allowedSignersFile ~/.config/git/allowed_signers
4️⃣ Verifica que quedó bien
git config --global --list | grep ssh
Debe salir:
gpg.format=ssh
user.signingkey=~/.ssh/id_ed25519.pub
gpg.ssh.allowedSignersFile=~/.config/git/allowed_signers
commit.gpgsign=true
Setup SSH for signing commits This guide sets up SSH commit signing globally using a dedicated signing key (separate from your auth key). Official documentation →
- Create a Dedicated Signing Key
ssh-keygen -t ed25519 -C "your-email@example.com" -f ~/.ssh/id_ed25519_signing
- Load the Key into the Agent (and Keychain)
eval "$(ssh-agent -s)"ssh-add --apple-use-keychain ~/.ssh/id_ed25519_signing
- Add the Public Key to GitHub as a Signing Key Copy your public key:
cat ~/.ssh/id_ed25519_signing.pub
Then on GitHub:
- Go to Settings → SSH and GPG keys → New SSH key
- Set Key type to Signing key
- Paste the public key
- You should then have one Authentication Key and one Signing Key in Github.
- Configure Git Globally to Sign Commits
git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519_signing
git config --global commit.gpgsign true
- Enable Local Verification (Optional but Recommended) Create an allowed signers file:
mkdir -p ~/.config/gittouch ~/.config/git/allowed_signers
Add a line to ~/.config/git/allowed_signers with your public (.pub) key as in:
echo "your-email@example.com $(cat ~/.ssh/id_ed25519_signing.pub)" >> ~/.config/git/allowed_signers
~/.config/git/allowed_signers shoudl look like
your-email@example.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI...
Point Git to it:
git config --global gpg.ssh.allowedSignersFile ~/.config/git/allowed_signers
- Verify Locally After your next commit (the first one that should be signed now), run below
git log --show-signature -1
Expected output:
Good "git" signature for your-email@example.com with ED25519 key ...
- Verify on GitHub Push a commit and confirm it shows Verified.
Common Issues
| Issue | Cause |
|---|---|
| "No signature" on GitHub | Key wasn't added as a Signing key (auth key isn't enough) |
"No signature" in git log --show-signature |
Missing allowedSignersFile or wrong contents |
| Wrong key used | Check git config --global user.signingkey |