¿Eliminar una twig en git lo elimina del historial?

Viniendo de svn, comenzando a familiarizarse con git.

Cuando se elimina una twig en git, ¿se elimina del historial?

En svn, puede recuperar fácilmente una bifurcación invirtiendo la operación de eliminación (fusión inversa). Como todas las eliminaciones en svn, la twig nunca se borra realmente, simplemente se elimina del tree actual.

Si la twig se borra realmente del historial en git, ¿qué ocurre con los cambios que se fusionaron desde esa twig? ¿Están retenidos?

Las twigs son solo pointers para commits en git. En git cada commit tiene un tree fuente completo, es una estructura muy diferente de svn donde todas las twigs y tags (por convención) viven en 'carpetas' separadas del repository junto con el 'trunk' especial.

Si la twig se fusionó en otra twig antes de ser eliminada, todas las confirmaciones seguirán siendo accesibles desde la otra twig cuando se elimine la primera. Ellos permanecen exactamente como estaban.

Si la bifurcación se elimina sin fusionarse con otra bifurcación, las confirmaciones en esa bifurcación (hasta el punto en que la bifurcación de una confirmación aún accesible) dejarán de estar visibles.

Las confirmaciones se conservarán en el repository y es posible recuperarlas inmediatamente después de la eliminación, pero finalmente serán recogidas.

En Git, las twigs son solo pointers (references) para confirmaciones en un gráfico acíclico dirigido (DAG) de confirmaciones. Esto significa que al eliminar una twig se eliminan solo las references a las confirmaciones, lo que puede hacer que algunas confirmaciones en el DAG sean inalcanzables y, por lo tanto, invisibles. Pero todas las confirmaciones que estaban en una bifurcación eliminada seguirían estando en el repository, al less hasta que se eliminen las confirmaciones inalcanzables (por ejemplo, usando git gc ).

Tenga en count que git branch -d se rehusaría a eliminar una twig si no puede estar seguro de que borrarla no dejaría commit inaccesibles. Debe usar la git branch -D más fuerte git branch -D para forzar la eliminación de una bifurcación si puede dejar commits inalcanzables.

Tenga en count también que las confirmaciones inalcanzables, si están presentes, son solo aquellas confirmaciones entre el último consejo de una sucursal eliminada y una confirmación que se fusionó con otra sucursal existente, cualquier confirmación labelda o el punto de bifurcación; lo que sea más tarde. Por ejemplo en la siguiente situación:

 ---- O ---- * ---- * ---- / M ---- * <- master <- HEAD
      \ /
       \ --. ---- .-- / - x --- y <- sucursal eliminada

solo confirma que 'x' e 'y' llegarán a ser inalcanzables después de eliminar la twig.

Si operó en una sucursal eliminada dentro del período gc.reflogExpire , por defecto 90 días, tendría la última sugerencia de una sucursal eliminada registrada en el refrito HEAD (vea git reflog show HEAD , o git log --oneline --walk-reflogs HEAD ). Debería poder usar el refrito HEAD para recuperar el puntero eliminado. Tenga en count también que, en este caso, las confirmaciones inalcanzables en una twig eliminada quedarían protegidas de la eliminación (eliminación) dentro del período gc.reflogExpireUnreachable , que de forma pnetworkingeterminada es de 30 días.

Si no puede encontrar la sugerencia de una twig recién eliminada en reflog para 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 twig eliminada.

Independientemente de cómo encuentre la punta de una twig eliminada, puede deshacer la eliminación, o más bien volver a crear una twig recién eliminada usando

 git branch <deleted-branch> <found-sha1-id> 

Sin embargo, tenga en count que se perderá el reflog para una sucursal.


También hay script git-resurrect.sh en contrib/ que ayuda a encontrar rastros de una sugerencia de twig con nombre de stack y resucitarla (recuperarla).

Si le preocupan las sucursales eliminadas accidentalmente y no tiene una copy local de su repository, hay extensiones para los serveres Git empresariales como Gerrit que detectarán las reescrituras de historial y las eliminaciones de las sucursales, las respaldarán con una reference especial para que puede restaurarse si es necesario y no será eliminado por la recolección de basura. Los administradores de Gerrit aún pueden eliminar confirmaciones seleccionadas si es necesario por razones legales.