Git · 07

Problemas comunes

Pegá en el buscador una parte del mensaje de error. Cada caso explica qué significa, por qué pasa y cómo se arregla. Los mensajes de Git están en inglés: acá van tal cual aparecen.

Antes de buscar

Tres comandos que aclaran casi cualquier situación, y no modifican nada:

git status
En qué rama estás, qué cambió y, muchas veces, qué comando sugiere Git para seguir (leé las líneas entre paréntesis).
git log --oneline -5
Los últimos commits, para saber dónde estás parado.
git remote -v
A qué repositorio de GitHub está conectada la carpeta.
1

Al empezar

No es un repositorio

fatal: not a git repository (or any of the parent directories): .git
Qué pasa
La terminal está en una carpeta que no tiene repositorio Git (ni ella ni las de arriba tienen .git).
Solución
Entrá a la carpeta correcta con cd, o si es un proyecto nuevo, creá el repo con git init.

Git no sabe quién sos

Author identity unknown
*** Please tell me who you are.
Qué pasa
Falta configurar nombre y email, que van en cada commit.
Solución
git config --global user.name "<Tu Nombre>"
git config --global user.email "<tu-email>"

Nada para commitear

no changes added to commit (use "git add" and/or "git commit -a")
Qué pasa
Modificaste archivos pero no los preparaste. El commit solo incluye lo que pasó por git add.
Solución
git add . (o el archivo puntual) y después git commit -m "…". Si dice “nothing to commit, working tree clean”, no hay ningún cambio desde el último commit.

Se abrió una pantalla rara y no puedo salir

Qué pasa
Git abrió su editor por defecto (Vim) para que escribas un mensaje, por ejemplo al hacer un merge o un commit sin -m.
Solución
Para guardar y salir: Esc, después escribí :wq y Enter. Para no volver a verlo, configurá VS Code como editor: git config --global core.editor "code --wait".
2

Al subir (push)

Push rechazado: el remoto tiene cambios que no tenés

! [rejected]        main -> main (fetch first)
error: failed to push some refs to 'https://github.com/...'
hint: Updates were rejected because the remote contains work that you do not have locally.
Qué pasa
Alguien (o vos desde otra PC, o editando en la web de GitHub) subió commits que tu copia no tiene. Git no te deja pisarlos.
Solución
git pull
git push
Si pull marca conflictos, resolvelos (ver Ramas). No uses --force para “arreglarlo”.

Historias no relacionadas

fatal: refusing to merge unrelated histories
Qué pasa
Creaste el repo en GitHub con un README (u otro archivo) y también tenías commits locales: son dos historiales que no comparten ningún commit.
Solución
git pull origin main --allow-unrelated-histories
git push -u origin main
Para la próxima: creá el repo de GitHub vacío.

No hay nada que subir con ese nombre

error: src refspec main does not match any
Qué pasa
No existe una rama local main: todavía no hiciste ningún commit, o la rama se llama master.
Solución
Hacé al menos un commit y renombrá la rama: git branch -M main. Después git push -u origin main.

El remoto ya existe

error: remote origin already exists.
Solución
Ya está conectado. Para cambiar la dirección: git remote set-url origin <url-nueva>. Verificá con git remote -v.

GitHub bloquea el push por un secreto

remote: error: GH013: Repository rule violations found for refs/heads/main.
remote: - Push cannot contain secrets
Qué pasa
La protección de GitHub detectó una clave o token en tus commits y frenó el push (por suerte).
Solución
Sacá el secreto del archivo, movelo a .env (en el .gitignore) y corregí el commit local: si es el último, git commit --amend; si es más viejo, git reset --soft <hash-anterior> y volvé a commitear. Considerá ese secreto expuesto y regeneralo.

Archivo demasiado grande

remote: error: File video.mp4 is 150.00 MB; this exceeds GitHub's file size limit of 100.00 MB
Qué pasa
GitHub no acepta archivos de más de 100 MB, aunque ya los hayas borrado en un commit posterior (siguen en el historial).
Solución
Sacalo de los commits que todavía no subiste (git reset --soft origin/main, después git rm --cached video.mp4, agregalo al .gitignore y volvé a commitear). Para versionar archivos grandes existe Git LFS.
3

Inicio de sesión

La contraseña no funciona

remote: Support for password authentication was removed on August 13, 2021.
fatal: Authentication failed for 'https://github.com/...'
Qué pasa
GitHub no acepta la contraseña de tu cuenta desde la terminal.
Solución
Iniciá sesión con el navegador (Git Credential Manager) o usá un token personal en lugar de la contraseña. Pasos en GitHub y remotos.

No puede pedirte usuario

fatal: could not read Username for 'https://github.com': terminal prompts disabled
Qué pasa
Git necesita que inicies sesión, pero lo ejecutó un programa que no puede mostrarte la ventana de login (un script, una herramienta automática, algunos editores).
Solución
Hacé el git push una vez desde una terminal normal (PowerShell o la de VS Code): ahí aparece el login del navegador y la sesión queda guardada para las demás herramientas.

SSH sin permiso

git@github.com: Permission denied (publickey).
Qué pasa
El remoto usa SSH y GitHub no reconoce ninguna clave de tu PC.
Solución
Creá una clave y agregala a GitHub (ver SSH), o pasá a HTTPS: git remote set-url origin https://github.com/<usuario>/<repo>.git.

Sesión de otra cuenta guardada

remote: Permission to <usuario>/<repo>.git denied to <otra-cuenta>.
Qué pasa
Windows tiene guardada la sesión de otra cuenta de GitHub.
Solución
Abrí Administrador de credenciales de Windows → Credenciales de Windows → borrá la entrada git:https://github.com. En el próximo push, iniciá sesión con la cuenta correcta.
4

Ramas y merges

Conflicto al unir

CONFLICT (content): Merge conflict in app.js
Automatic merge failed; fix conflicts and then commit the result.
Qué pasa
Las dos ramas cambiaron las mismas líneas. No es un error: Git te pide que elijas.
Solución
Editá el archivo, dejá la versión correcta y borrá las marcas <<<<<<< ======= >>>>>>>; después git add app.js y git commit. Para cancelar: git merge --abort. Paso a paso en Ramas.

Detached HEAD

You are in 'detached HEAD' state.
Qué pasa
Estás mirando un commit puntual (o un tag), no una rama. Podés ver y probar, pero los commits que hagas no quedan en ninguna rama.
Solución
Para volver: git switch main. Si hiciste commits ahí y los querés conservar: git switch -c rama-nueva antes de irte.

Cambios locales en el camino

error: Your local changes to the following files would be overwritten by checkout:
        app.js
Please commit your changes or stash them before you switch branches.
Qué pasa
Tenés cambios sin commitear en archivos que la otra rama (o el pull) necesita modificar.
Solución
Commitealos, o guardalos un rato: git stash → cambiás de rama o hacés pull → git stash pop.

No encuentra la rama

fatal: invalid reference: feature-x
error: pathspec 'feature-x' did not match any file(s) known to git
Qué pasa
El nombre está mal escrito o la rama existe solo en GitHub y tu PC todavía no se enteró.
Solución
git fetch y después git switch feature-x (Git crea la rama local a partir de origin/feature-x). git branch -a lista todas.
5

Archivos

Aviso de LF y CRLF

warning: in the working copy of 'app.js', LF will be replaced by CRLF the next time Git touches it
Qué pasa
Es un aviso, no un error. Windows y Linux marcan el fin de línea distinto; con core.autocrlf=true Git convierte solo y te avisa.
Solución
No hace falta hacer nada. Si querés reglas fijas por proyecto, agregá un .gitattributes con * text=auto.

El .gitignore no ignora un archivo

Qué pasa
El .gitignore solo afecta archivos que Git todavía no sigue. Si el archivo ya estaba en un commit, se sigue rastreando.
Solución
git rm --cached .env
git commit -m "Deja de versionar .env"
El archivo queda en tu disco, pero sale del repo (en los commits viejos sigue estando).

Subí una contraseña o un secreto

Qué pasa
Borrarlo en un commit nuevo no alcanza: sigue en el historial y cualquiera con acceso al repo lo puede ver.
Solución
1) Cambiá la contraseña o regenerá la clave: es lo único que te protege de verdad. 2) Sacala del repo (git rm --cached) y agregá el archivo al .gitignore. 3) Si hace falta borrarla del historial, existen herramientas como git filter-repo, y después hay que forzar el push.

El README se ve con caracteres raros en GitHub

#   d o c k e r - c h e a t s h e e t
Qué pasa
Usaste echo "..." >> README.md en Windows PowerShell 5.1: guarda el texto en UTF-16, y GitHub espera UTF-8. Por eso aparecen espacios o caracteres raros entre las letras.
Solución
Abrí el archivo en VS Code, corregí la línea, y en la barra inferior hacé clic en la codificación → Save with Encoding → UTF-8. Para escribir archivos desde PowerShell: Set-Content -Encoding utf8 en lugar de > o >>.

No encontré ese problema. Probá con otra parte del mensaje de error.