¿Eliminar una rama en git la elimina del historial?
Viniendo de svn, estoy empezando a familiarizarme con git.
Cuando se elimina una rama en git, ¿se elimina del historial?
En svn, puede recuperar fácilmente una rama revirtiendo la operación de eliminación (fusión inversa). Como todas las eliminaciones en svn, la rama nunca se elimina realmente, simplemente se elimina del árbol actual.
Si la rama realmente se elimina del historial en git, ¿qué sucede con los cambios que se fusionaron de esa rama? ¿Se retienen?
Las ramas son solo indicadores de confirmaciones en git. En git, cada confirmación tiene un árbol fuente completo, es una estructura muy diferente de svn donde todas las ramas y etiquetas (por convención) viven en 'carpetas' separadas del repositorio junto al 'tronco' especial.
Si la rama se fusionó con otra rama antes de eliminarla, todas las confirmaciones seguirán siendo accesibles desde la otra rama cuando se elimine la primera rama. Siguen exactamente como estaban.
Si la rama se elimina sin fusionarse con otra rama, las confirmaciones en esa rama (hasta el punto en que se bifurca de una confirmación que aún es accesible) dejarán de ser visibles.
Las confirmaciones aún se conservarán en el repositorio y es posible recuperarlas inmediatamente después de la eliminación, pero eventualmente serán recolectadas como basura.
En Git, las ramas son solo punteros (referencias) a confirmaciones en un gráfico acíclico dirigido (DAG) de confirmaciones. Esto significa que al eliminar una rama solo se eliminan las referencias a confirmaciones, lo que podría hacer que algunas confirmaciones en el DAG sean inalcanzables y, por lo tanto, invisibles. Pero todas las confirmaciones que estaban 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á confirmaciones inalcanzables. Debe utilizar el método 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 extremo de una rama eliminada y una confirmación que se fusionó con otra rama existente, cualquier confirmación etiquetada o el punto de bifurcación; lo que ocurra 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 inalcanzables después de eliminar la rama.
Si operó en una rama eliminada dentro del gc.reflogExpire
período predeterminado de 90 días, el último aviso de una rama eliminada se registrará en HEAD reflog (consulte git reflog show HEAD
o git log --oneline --walk-reflogs HEAD
). Debería poder utilizar 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 contra la poda (eliminación) dentro del gc.reflogExpireUnreachable
período, que de forma predeterminada es de 30 días.
Si no puede encontrar la punta de una rama recién eliminada en reflog para HEAD, puede intentar usar git fsck
para buscar "compromiso 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 usando
git branch <deleted-branch> <found-sha1-id>
Sin embargo, tenga en cuenta que se perderá el registro de una sucursal.
También existe el script git-resurrect.shcontrib/
que ayuda a encontrar rastros de una punta de rama con el nombre de pila y resucitarla (recuperarla).
Si le preocupan las ramas eliminadas accidentalmente y ya no tiene una copia local de su repositorio, existen extensiones para servidores Git empresariales como Gerrit que detectarán reescrituras del historial y eliminaciones de ramas, y las respaldarán bajo una referencia especial para que se puede restaurar si es necesario y no se eliminará mediante la recolección de basura. Los administradores de Gerrit aún pueden eliminar confirmaciones seleccionadas si es necesario por razones legales.