remota rama partir otra eliminar crear git version-control branch revision-history

partir - ¿Eliminar una rama en git lo elimina del historial?



git squash (3)

Viniendo de svn, comenzando a familiarizarse con git.

Cuando se elimina una rama 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 rama nunca se borra realmente, simplemente se elimina del árbol actual.

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


Las ramas son solo punteros para commits en git. En git cada commit 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 con el ''trunk'' especial.

Si la rama se fusionó en otra rama antes de ser eliminada, todas las confirmaciones seguirán siendo accesibles desde la otra rama 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.

Los commits se mantendrán en el repositorio y es posible recuperarlos inmediatamente después de la eliminación, pero finalmente serán recolectados.


Si le preocupan las sucursales eliminadas accidentalmente y no tiene una copia local de su repositorio, hay extensiones para los servidores Git empresariales como Gerrit que detectarán las reescrituras del historial y las eliminaciones de las sucursales, las respaldarán con una referencia especial para que puedan 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.


En Git, las ramas son solo punteros (referencias) para confirmaciones en un gráfico acíclico dirigido (DAG) de confirmaciones. Esto significa que al eliminar una rama se eliminan solo las referencias 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 repositorio, al menos hasta que se eliminen las confirmaciones inalcanzables (por ejemplo, usando git gc ).

Tenga en cuenta que git branch -d se rehusaría a eliminar una rama 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 cuenta 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 etiquetada 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 <-- deleted branch

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

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 cuenta también que, en este caso, las confirmaciones inalcanzables en una rama eliminada quedarían protegidas de la eliminación (eliminación) dentro del período gc.reflogExpireUnreachable , que de forma predeterminada es de 30 días.

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

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