Git
1. Introduccion a git
¿Que es git?
Es un sistema de control de versiones.
Cada versión del proyecto se conoce como "commit". En cada commit git guarda los archivos que han sido modificados. Los archivos que no han sido modificados con respecto al commit anterior no se copian, git ofrece un enlace simbólico a ellos. Este mecanismo es transparente para el usuario y asegura que no se produzcan duplicaciones innecesarias.
¿Que es un commit?
Se ha dicho que cada commit representa un estado versionado del proyecto. Técnicamente, un commit es un objeto de git. Este objeto tiene varios campos, de los cuales los que mas nos interesan por ahora son:
- id: un identificador único asignado a cada commit. Propuesta: investigar como se genera este identificador.
- commit anterior
- autor
- fecha
- mensaje
- blob con el contenido del proyecto
Branches (Ramas)
Un branch (rama) representa una linea de desarrollo del proyecto. En cada proyecto existe al menos una. La rama por defecto se llama ‘master’.
Para cada rama del proyecto existe un puntero que apunta al último commit de esta linea. Cada vez que se agrega un commit, el puntero de la rama cambia para indicar el nuevo commit.
Puntero HEAD
HEAD es un puntero que apunta al commit donde se esta trabajando actualmente. Normalmente, HEAD apunta al puntero de alguna rama, por lo que apunta indirectamente al último commit de esta rama. Es posible hacer que HEAD apunte a un commit anterior, lo que hace que nuestro espacio de trabajo muestre el contenido que el proyecto tenia en esta versión. Cuando HEAD no apunta al puntero de una rama se dice que esta en modo detached.
Creando ramas
Crear una rama implica agregar un nuevo puntero que, en principio, apunta al commit actual. En la figura se ha creado la rama ‘dev’ mientras HEAD apuntaba a la rama ‘master’. Tanto ‘master’ como ‘dev’ apuntan al mismo commit ‘asd’.
Es posible hacer que HEAD apunte a la nueva rama 'dev' de la misma forma que se lo direcciona a cualquier otro commit.
Si en esta situación se crean nuevos commits, el puntero de la rama de trabajo actual ('dev') se actualizara para apuntar siempre al ultimo commit.
Si se vuelve a la rama 'master' y se agregan mas commits, el puntero 'master' también se actualiza. En esta situación se observa que ambas ramas de desarrollo divergen.
Combinando cambios
Si se desean combinar los cambios o actualizaciones hechos en varias ramas, es posible realizar una operación merge (mezcla, unión). Esta operación trae (o aplica los cambios de) los commits de la rama indicada en la rama actual. En la figura se ha realizado la operación merge de la rama 'dev' en la rama 'master'. Los commits 'zxc' y 'jkl' se copian en la rama 'master'.