¿Eliminar una rama en git la elimina del historial?

Resuelto Ken Liu asked hace 14 años • 3 respuestas

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?

Ken Liu avatar Apr 10 '10 22:04 Ken Liu
Aceptado

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.

CB Bailey avatar Apr 10 '2010 15:04 CB Bailey

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 -dse 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 -Dpara 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.reflogExpireperíodo predeterminado de 90 días, el último aviso de una rama eliminada se registrará en HEAD reflog (consulte git reflog show HEADo 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.reflogExpireUnreachableperí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 fsckpara 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).

Jakub Narębski avatar Apr 11 '2010 13:04 Jakub Narębski

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.

Johanned Nicolai avatar Jan 07 '2013 17:01 Johanned Nicolai