En Git, las ramas son solo punteros (referencias) para los commits en un gráfico acíclico dirigido (DAG) de commits. Esto significa que al eliminar una rama solo se eliminan las referencias a las confirmaciones, lo que puede hacer que algunas confirmaciones en el DAG sean inalcanzables, por lo tanto invisibles. Pero todas las confirmaciones que se encontraban en una rama eliminada aún estarían en el repositorio, al menos hasta que se eliminen las confirmaciones inalcanzables (por ejemplo, usando git gc
).
Tenga en cuenta que git branch -d
se negaría a eliminar una rama si no puede estar seguro de que eliminarla no dejaría confirmaciones inalcanzables. Debe usar el más fuerte git branch -D
para forzar la eliminación de una rama si puede dejar confirmaciones inalcanzables.
Tenga en cuenta también que las confirmaciones inalcanzables, si están presentes, son solo aquellas confirmaciones entre el último consejo de una rama eliminada y una confirmación que se fusionó con otra rama existente, cualquier confirmación etiquetada o el punto de ramificación; lo que sea más tarde Por ejemplo en la siguiente situación:
---- O ---- * ---- * ---- / M ---- * <- maestro <- CABEZA
\ /
\ --. ---- .-- / - x --- y <- rama eliminada
solo las confirmaciones 'x' e 'y' serían inaccesibles después de eliminar la rama.
Si operó en una sucursal eliminada dentro del gc.reflogExpire
período predeterminado de 90 días, tendría la última sugerencia de una sucursal eliminada registrada en HEAD reflog (ver git reflog show HEAD
, o git log --oneline --walk-reflogs HEAD
). Debería poder usar HEAD reflog para recuperar el puntero eliminado. Tenga en cuenta también que, en este caso, las confirmaciones inalcanzables en solo una rama eliminada estarían protegidas de la poda (eliminación) dentro del gc.reflogExpireUnreachable
período, que por defecto es de 30 días.
Si no puede encontrar la punta de una rama recién eliminada en el registro de HEAD, puede intentar usar git fsck
para encontrar "commit inalcanzable <sha1>" y examinarlos (a través de git show <sha1>
o git log <sha1>
) para encontrar la punta de la rama eliminada.
Independientemente de cómo encuentre la punta de una rama eliminada, puede deshacer la eliminación o, más bien, volver a crear una rama recién eliminada utilizando
git branch <deleted-branch> <found-sha1-id>
Sin embargo, tenga en cuenta que se perdería el registro de una rama.
También hay un script git-resurrect.sh en el contrib/
que ayuda a encontrar rastros de una punta de rama con un nombre de pila y resucitarlo (recuperarlo).