¿Por qué el historial de git branch permanece cuando la twig ha sido eliminada?

He eliminado una twig en git y he confirmado que ya no existe ejecutando:

git branch -a 

Sin embargo, aún puedo ver la twig, aunque no está labelda, usando mi herramienta GUI de Git.

rama

¿Es este comportamiento estándar? Esperaba que la historia de esa twig fuera parte de la twig en la que se fusionó.

La historia de esa twig es parte de la twig en la que se fusionó. Si ejecuta el git log desde la sucursal en la que se fusionó, verá la (s) confirmación (es) en la sucursal desde la que se fusionó. Ellos son parte de la historia.

Entonces, ¿por qué sigues "viendo la twig"? Porque lo que ves allí es una serie de relaciones ancestro-descendientes, no twigs.

Una "twig" en git no es una serie de commits. Lo tratamos de esa manera, porque tiene sentido para nuestros models mentales, pero una twig es solo una label mobile. Es un nombre asignado a una confirmación específica. Cuando trabajas en la twig X y creas una nueva confirmación, git crea esa confirmación, establece su padre como la confirmación actual a la que X apunta, luego mueve la twig X para apuntar a la nueva confirmación.

Entonces, supongamos que estás en la twig principal. Branch Master actualmente está a punto de cometer 1 (usaré numbers para referirme a commits; git usa hashes, pero no hace diferencia). Haces algunos cambios, ejecuta git commit . Lo que eso significa es que git crea un nuevo commit, commit 2. El padre de commit 2 es commit 1. Luego mueve el master de tag para commit 2. Entonces si abres tu herramienta git GUI, verás que el master está en commit 2, luego una línea para comprometer 1 debajo de ella. Eso es porque 1 es la confirmación de los padres de 2.

Entonces, supongamos que crea una nueva twig. git branch new; git checkout new git branch new; git checkout new . Ahora estás parado en una twig nueva. La twig nueva se creó a partir de la que estaba en pie, por lo que también está a punto de comprometerse 2. En su herramienta de interfaz gráfica de usuario, verá que tanto maestra como nueva apuntan al compromiso 2.

Ahora haga algunos cambios, ejecute git commit . Esto crea el compromiso 3, que tiene el compromiso 2 como su padre, y mueve la label de bifurcación nueva a 3. El maestro de la label de bifurcación sigue apuntando a 2.

Ahora regrese a master, git checkout master , luego realice algunos cambios, git commit . De nuevo, nuevo compromiso (digamos 4), este también tiene 2 como su padre. En la herramienta GUI puede ver que tanto 3 como 4 tienen una línea que los conecta a 2.

Ahora, la parte que es relevante para tu pregunta. Aún en master, ejecuta git merge new . Eso se fusionará en una nueva twig. Entonces, ¿qué es una fusión en git? Una combinación es solo una confirmación que, en lugar de tener un padre comprometido, tiene dos confirmaciones principales. Cuando ejecutas git merge new lo que hace git es crear un nuevo commit 5, y establecer tanto commit 3 como 4 como sus padres (4 porque es el único que apunta a 3, porque es el único que apunta a). Entonces, si abre su herramienta GUI, verá exactamente lo que esperaría ver en este caso: maestro apuntando a 5, y dos líneas de él, uno a 4 y uno a 3, porque ambos compromisos son los padres de 5. Como no le has contado a Git lo contrario, aún ves la nueva marca de ramificación cometer 3.

Ahora, todo este historial de git que has creado es completamente independiente de las twigs, y seguirá existiendo si eliminas las twigs. Recuerde, una twig es solo una label adjunta a una confirmación. Al eliminar la twig no se elimina la confirmación, o parte de su historial, simplemente elimina la label. Entonces ahora puedes ejecutar git branch -d new , y branch new desaparecerá. Sin embargo, cometer 3, que era "en una twig nueva", todavía estará allí. El padre de Commit 3 todavía es 2, y el commit 3 todavía es uno de los padres de 5. Entonces, ¿qué ocurre si miras la herramienta GUI? Bueno, verás commit 5 marcado como maestro, luego dos líneas que salen de él, marca commits 4 y 3 como sus padres, luego líneas de 4 y 3 marcando 2 como su padre, luego una línea de 2 a 1. Entonces exactamente igual que antes de eliminar la nueva twig.

Espero que esto lo aclare.