Skip to main content

La confirmación existe en GitHub pero no en mi clon local

Algunas veces una confirmación estará visible en GitHub, pero no existirá en tu clon local del repositorio.

Cuando usas git show para ver una confirmación específica en la línea de comandos, es posible que recibas un error fatal.

Por ejemplo, puede recibir un error bad object localmente:

$ git show 1095ff3d0153115e75b7bca2c09e5136845b5592
> fatal: bad object 1095ff3d0153115e75b7bca2c09e5136845b5592

Sin embargo, cuando ves la confirmación en GitHub.com, podrás verla sin problemas:

github.com/ACCOUNT/REPOSITORY/commit/1095ff3d0153115e75b7bca2c09e5136845b5592

Existen varias explicaciones posibles:

  • El repositorio local está desactualizado.
  • La rama que contiene el commit fue eliminada, por lo que ya no se hace referencia al commit.
  • Alguien realizó un empuje forzado sobre la confirmación.

El repositorio local está desactualizado

Es posible que tu repositorio local aún no tenga el commit. Para obtener información del repositorio remoto al clon local, use git fetch:

git fetch REMOTE

Esto copia de manera segura la información del repositorio remoto a su clon local sin realizar cambios en los archivos que ha descargado. Puede usar git fetch upstream para obtener información de un repositorio que haya bifurcado, o bien git fetch origin para obtener información de un repositorio que solo ha clonado.

Sugerencia

Para más información, lea sobre cómo administrar elementos remotos y capturar datos en el libro Pro Git.

La rama que contenía la confirmación fue eliminada

Si un colaborador del repositorio ha eliminado la rama que contiene el commit o ha realizado una inserción forzada en la rama, es posible que el commit que falta haya quedado huérfano (es decir, no es accesible desde ninguna referencia) y, por tanto, no se podrá obtener en el clon local.

Afortunadamente, si un colaborador tiene un clon local del repositorio con la confirmación que falta, puede volver a insertarla en GitHub. Tendrá que asegurarse de que a la confirmación le haga referencia una rama local y que, después, se inserte como una rama nueva en GitHub.

Supongamos que el usuario todavía tiene una rama local (llámala B) que contiene el commit. Esto podría realizar el seguimiento de la rama que se ha insertado a la fuerza o se ha eliminado, y que simplemente todavía no han actualizado. Para conservar la confirmación, pueden insertar esa rama local en una rama nueva (por ejemplo, recover-B) en GitHub. En este ejemplo, supongamos que tienen un repositorio remoto denominado upstream a través del cual tienen acceso de inserción a github.com/ACCOUNT/REPOSITORY.

La otra persona corre:

$ git branch recover-B B
# Create a new local branch referencing the commit
$ git push upstream B:recover-B
# Push local B to new upstream branch, creating new reference to commit

Ahora puedes ejecutar:

$ git fetch upstream recover-B
# Fetch commit into your local repository.

Evitar empujes forzados

Evita los empujes forzados a un repositorio a menos que sea absolutamente necesario. Esto es especialmente cierto si más de una persona puede subir al repositorio. Si alguien sube información forzadamente a un repositorio, esta subida forzada podría sobrescribir confirmaciones en las que otras personas basaron su trabajo. Hacer un push forzado cambia el historial del repositorio y puede corromper los pull requests.

Información adicional

  •         ["Trabajando con Remotos" del libro _Pro Git_](https://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes)
    
  •         ["Recuperación de datos" en el libro _Pro Git_](https://git-scm.com/book/en/v2/Git-Internals-Maintenance-and-Data-Recovery)