AprendeGit
Capítulo 15 6 min de lectura 7 secciones

Errores comunes en Git y sus soluciones

Soluciones a los errores más frecuentes al usar Git.

En esta sección, he recopilado algunos errores comunes que pueden surgir en el uso de Git, ya sea por problemas a la hora de trabajar con las ramas o algún tipo de configuración incorrecta.

También, he incluido algunas posibles soluciones para cada uno de ellos, junto a una pequeña explicación para que la próxima vez que te pase no te vuelvas a preguntar por qué no funciona.

Me dice que no es un repositorio de git

Has terminado el curso y estás deseando usar Git. Ejecutas tu primer comando y…¡error! ¿Qué está pasando?

$ git status
fatal: not a git repository(or any of the parent directories)

El problema indica queestás intentando ejecutar Git en un directorio que no es un repositorio de Git. Normalmente esto ocurre por dos razones:

  1. No has ejecutado git init en el directorio. Esto es necesario si, por ejemplo, es un directorio local y no uno que has clonado de un repositorio remoto. 2. No estás en el directorio correcto. Puedes usar los comandos degitdentro de las subcarpetas de un directorio que sí haya sido iniciado como repositorio pero no puedes, por ejemplo, hacerlo un directorio superior. Asegúrate que estás en el correcto.

Hago pull y me dice que no es un repositorio

Es posible que alguna vez intentes traerte los cambios de un repositorio remoto y te diga que no es un repositorio de Git. Veamos este ejemplo:

$ git pull origi main
fatal:'origi' does not appear to be a git repository
fatal: Could notread from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Ese es el error. Es evidente que he escrito malorigiperono es tanto por escribirlo malobien, si no por asegurarnos que estamos haciendo pull de un repositorio remoto que tengamos configurado. En realidad, que se llameorigines circunstancial, ya que podríamos tener nombres de repositorios remotos distintos.

# git pull <repositorio-remoto> <rama>

$ git remote -v
repo git@github.com:tu-usuario/manual-git.git(fetch)
repo git@github.com:tu-usuario/manual-git.git(push)

# traemos cambios del repositorio remoto
$ git pull repo main

# esto fallará porque no tenemos ese repositorio
$ git pull origin main

También puedes hacerpullde un repositorio que no tienes configurado como remoto, pero entoncesdebes indicar la dirección completa:

$ git pull git@github.com:tu-usuario/manual-git.git main

¿Por qué se llama casi siempre origin? Bien, es porque es el nombre que da git automáticamente al repositorio remoto cuando ejecutas un git clone. Es como en su día conmasterpara la rama principal, pero esto es algo que puede cambiar. Por esoes importante entender el concepto y no pensar que el concepto es el nombre.

He escrito mal el último commit

No pasa nada. Si has cometido un error en el mensaje del commit anterior y todavía no has hechopushpuedes solucionarlo así:

$ git commit --amend -m "Este es el mensaje correcto"

Pero ya he hecho push. ¿Qué hago ahora?

Si ya has hecho push, sólo te queda hacer un push —force. Te aconsejo que no lo hagas porque el riesgo supera con creces el beneficio. El historial de commits no es importante que esté impoluto. No pasa nada. Es mejor volver a crear un commit con el mensaje correcto y después hacerpushcon normalidad. Si todavía sigues con ganas de hacerlo… sigue leyendo.

Si sabes que ningún compañero ha trabajado con el commit incorrecto, entonces puedes hacer:

# Arreglamos el último commit con el mensaje correcto
$ git commit --amend -m "Este es el mensaje correcto"
# Forzamos el push y sobrescribimos el historial de commits
$ git push --force origin nombre-de-la-rama

Muyimportante: Antes de hacer elpushasegúrate que la rama a la que vas a hacer pushes la correcta y que tienes todos los cambios sincronizados. De lo contrario, van a desaparecer cambios del historial.

Si no es el último commit el que quieres cambiar

¡Cuántos problemas! Si ya tu commit está hundido en el historial. ¡Déjalo tranquilo! Es que no compensa NADA teniendo en cuenta la de problemas que te puedes encontrar, especialmente si estás trabajando en código compartido.

Si todavía sigues con ganas de hacerlo… tendrás que utilizar rebase. Te recomiendo que uses elrebaseinteractivo, de forma que podrás reescribir el historial de commits y quedarte con sólo aquellos que te interesen. Para ello, ejecuta:

# Reescribimos el historial de commits

$ git rebase -i HEAD~5

Muy importante: Recuerda querebasereescribe el historial, moviendo commits. Por lo tanto, nodebeshacerrebasesihaycommitsqueyahansidocompartidos. Si no estás seguro, no lo hagas, ya que podrías dejarlo peor.

He escrito mal la rama que he creado

Con las prisas te puedes equivocar al crear el nombre de una rama. No pasa nada. Existe una forma muy sencilla de renombrarla sin necesidad de borrar y crear:

# creamos nuestra rama mal
$ git switch -c rama-nueba

# ¡AH! Mis ojos. Es con V!

$ git branch -m rama-nueba rama-nueva

Si ya habías hecho push

Si ya habías hechopushde tu rama, no pasa nada. Asegúrate que en local tienes todos los cambios, ejecuta los comandos que hemos comentado antes y ahora ejecuta.

# Eliminamos la rama que está mal
$ git push origin --delete rama-nueba
# Enviamos la rama con el nombre correcto
$ git push origin rama-nueva

He hecho un git push y me da error

Es muy común que al intentar hacer unpushde tus cambios te de un error. No pasa nada. Normalmente lo que pasa es que tu repositorio local no está sincronizado con el repositorio remoto. Por eso, no puedes enviar tus cambios ya que Git no sería capaz de saber cómo tiene que integrarlos.

Este sería el error:

# Después de hacer unos commits, decidimos enviar

$ git push origin main

To github.com:tu-usuario/manual-git.git ! [rejected] main -> main (non-fast-forward) error: failed to push some refs to’github.com:tu-usuario/manual-git.git’ hint: Updates were rejected because the tip of your current branch is b ** ehind hint: its remote counterpart. Integrate the remote changes (e.g. hint: ‘git pull …’) before pushing again. hint: See the’Note about fast-forwards’ in ‘git push —help’ for detai ** ls.

Como dice el error, la actualización ha sido rechazada ya que el punto de la rama actualestádetrásdelpuntoremoto. Es necesario integrar los cambios remotos (con git pull …) antes de volver a hacer un git push.

He hecho commits a la rama principal que debían realizarse en otra rama

A todos nos ha pasado alguna vez. Te has dejado llevar por el ansia y te has puesto a hacer commits en la rama principal como si no hubiese un mañana. Normalmente no has hecho push(si es así ya entraríamos en otro tema).

Imagina que has hecho 3 commits en la rama principal pero debían ir a una rama. Existen diferentes maneras de hacerlo, pero la más limpia y sencilla sería esta:

# Nos aseguramos que estamos en la rama principal
$ git branch
* main

# Creamos la rama que debíamos haber

$ git branch rama-con-cambios

# Así nos crea una rama con todos los commits actuales

# SIN CAMBIAR DE RAMA (seguimos en main)

$ git reset --keep HEAD~3

# Ahora podemos cambiar a la nueva rama
$ git switch rama-con-cambios

¿Y si la rama ya existía?

Si los commits que has hecho en master debían haber ido a una rama que ya existía, puedes usar git mergepara integrar los commits de la rama principal a la rama.

# Vamos a la rama que queremos que tenga los commits
$ git switch rama-con-cambios

# Hacemos merge de la rama principal
$ git merge main
This will add the additional commits to the existing branch.

# Volvemos a la rama principal
$ git switch main

# Movemos la rama principal 3 commits atrás
$ git reset --keep HEAD~3

xcrun: error: invalid active developer path

Este es un error exclusivo de macOS pero muy frecuente.

A veces, tras actualizar macOS a una nueva versión de su sistema operativo, o por actualizar otras dependencias, es posible que al intentar utilizar algún comando de Git, la terminal te devuelva un error un poco críptico que dice así:

$ git status
xcrun: error: invalid active developer path(/Library/Developer/Command
LineTools),
missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun

En realidad este error es quedeja de detectar que has aceptado los términos de uso de estas herramientasy deja de poder utilizarlas. Otra razón puede ser que las que tenías instaladas se han eliminado por el paso de actualización y tienes que reinstalarlas.

Sea como sea, para solucionarlo, lo más sencillo es que las vuelvas a instalar. De esta forma se volverán a registrar en el path correcto. Para ello, ejecuta este comando:

$ xcode-select --install

Te debería aparecer una ventana preguntando si quieres instalar las herramientas de desarrollo quexcode-selectnecesita para poder ejecutarse. Le decimos que sí.

Ventana con el mensaje que va a instalar las herramientas de desarrollo

Tras esto, comenzará una descarga y después una instalación que puede durar unos minutos. Una vez finalizado, prueba de nuevo el comando de git en tu terminal y debería funcionar correctamente.

Soluciones si sigue sin funcionarte

En este punto, es raro que todavía no te funcione pero aquí te dejo algunas soluciones más que pueden ayudarte.

  1. Reinicia el ordenador para asegurarte que se han registrado bien los cambios. 2. Si sigue sin funcionar, ejecuta en la terminalsudo xcode-select —resetpara resetear toda la configuración. 3. Si todavía no funciona, prueba a descargar e instalar manualmente lasCommand Line Tools for Xcodedesde la página deApple Developers³⁵.

¿Terminaste de leer la teoría?

Márcalo para registrar tu avance y salta al quiz.

Quiz de comprobación

3 preguntas · 70% para aprobar
  1. 1

    Git te responde `fatal: not a git repository`. ¿Qué significa?

  2. 2

    Acabas de hacer commit y te equivocaste en el mensaje. ¿Cómo lo corriges?

  3. 3

    Haces `git push` y Git lo rechaza (non-fast-forward). ¿Qué debes hacer primero?

¿Quieres practicar comandos reales? Abre la terminal simulada y experimenta sin miedo.

Abrir terminal