Viniendo de svn, comenzando a familiarizarme con git.
Cuando una rama se elimina en git, ¿se elimina del historial?
En svn, puede recuperar fácilmente una rama al revertir la operación de eliminación (fusión inversa). Como todas las eliminaciones en svn, la rama nunca se elimina realmente, solo se elimina del árbol actual.
Si la rama se elimina realmente del historial en git, ¿qué sucede con los cambios que se fusionaron desde esa rama? ¿Se retienen?
fuente
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 fuertegit 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:
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 (vergit reflog show HEAD
, ogit 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 delgc.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 degit show <sha1>
ogit 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
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).fuente
git reflog show HEAD
enumeré el commit y creé una nueva rama tal como dijiste, perfecta.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 sucursales, las respaldarán bajo una referencia especial para que puedan 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.
fuente