GIT COMO NUNCA TE LO EXPLICARON: Qué es GIT y como usar un sistema de control de versiones.

The Coder Cave esp
4 Feb 202218:51

Summary

TLDRLa parábola de Git es una narrativa hipotética que ilustra cómo diseñar un sistema de control de versiones. La historia comienza con la idea de tomar 'fotos instantáneas' o snapshots del código, lo que permite volver a versiones anteriores fácilmente. A medida que se desarrolla, se introducen conceptos clave como los directorios de trabajo, snapshots con nombres identificativos y el uso de mensajes para describir cambios. La historia evoluciona para abordar la necesidad de rastrear múltiples líneas de desarrollo, lo que lleva a la creación de un historial de código en forma de árbol. Se exploran soluciones para problemas de colaboración y se destaca la importancia de la identificación única de snapshots mediante hashes SHA1. Finalmente, se introduce el directorio staging para una mejor gestión de cambios y se compara el sistema resultante con Git, destacando las herramientas adicionales que ofrece Git para gestionar situaciones complejas. Este resumen ofrece una visión general del proceso creativo y los fundamentos de un sistema de control de versiones como Git.

Takeaways

  • 💡 La idea de un sistema de control de versiones surge al necesitar un método confiable para hacer seguimiento de las versiones del software y poder volver a versiones anteriores fácilmente.
  • 📸 La metáfora de las fotos instantáneas o 'snapshots' en inglés, se utiliza para ilustrar cómo tomar 'fotos' de un estado del código en un momento dado y poder regresar a ellas cuando sea necesario.
  • 📁 Se crea un directorio llamado 'working' para trabajar en el desarrollo del software y se realizan copias completas de este directorio llamadas 'snapshots' cada vez que se completa una funcionalidad.
  • 🗒️ Se introduce un archivo especial llamado 'mensaje' dentro de cada snapshot que contiene un resumen de los cambios y la fecha de creación, facilitando la identificación y búsqueda de versiones específicas.
  • 🌟 La versión 1.0 del software se despliega y es bien recibida por los usuarios, lo que motiva a desarrollar nuevas versiones y mejoras.
  • 🔄 Se enfrenta el problema de tener que crear un snapshot que no sea una continuación directa de la última versión, lo que lleva a la idea de ramificaciones o 'branches' en el desarrollo.
  • 🌿 Al caminar en la naturaleza y observar el patrón de las ramas de un árbol, se inspira la idea de modelar el historial del código como un árbol con múltiples ramas para manejar diferentes líneas de desarrollo.
  • 🔗 Se implementa un nuevo campo en el archivo 'mensaje' de cada snapshot que indica su padre, permitiendo realizar un seguimiento de la historia completa de cada snapshot hasta la rama principal.
  • 🔄 Se crea un archivo llamado 'branch' que almacena la información de las ramas y sus últimas snapshots, facilitando la navegación entre diferentes ramas de desarrollo.
  • 👥 Se introduce la colaboración en equipo, lo que requiere adaptar el sistema de control de versiones para permitir la identificación de quién es el autor de cada snapshot y la creación de nombres únicos para evitar conflictos.
  • 🔧 Se implementa un directorio de 'staging' que actúa como un intermediario entre el directorio de trabajo y el snapshot, permitiendo una selección más precisa de qué cambios incluir en el siguiente snapshot.

Q & A

  • ¿Qué problema específico resuelve la idea del nuevo software que el usuario imagina en el script?

    -El nuevo software resuelve el problema de hacer un seguimiento confiable de todas las versiones del sistema de archivos, permitiendo volver fácilmente a una versión anterior en la que se hayan modificado o eliminado elementos.

  • ¿Cómo se llama la solución que el usuario imagina para su problema de control de versiones?

    -La solución que el usuario imagina se llama 'snapshots', que son copias instantáneas del código en puntos específicos del tiempo.

  • ¿Qué es un 'snapshot' en el contexto del script?

    -Un 'snapshot' es una copia del directorio working completo que se toma cuando se completa una funcionalidad, y que luego se nombra para su identificación futura.

  • ¿Por qué decide el usuario agregar un archivo especial llamado 'mensaje' a sus snapshots?

    -Decide agregar un archivo especial llamado 'mensaje' para incluir un resumen de los cambios contenidos en el snapshot y la fecha en la que se completaron, lo que facilita la identificación y búsqueda de cambios específicos en el pasado.

  • ¿Cómo se resuelve el problema de identificación de snapshots creciendo en número?

    -Se resuelve agregando un archivo llamado 'mensaje' que contiene información adicional como un resumen de los cambios y la fecha, y posteriormente se utiliza un hash SHA1 único para identificar cada snapshot.

  • ¿Cómo se representa la estructura del historial de código después de la implementación de la solución snapshots?

    -El historial de código se representa como un árbol, donde cada snapshot es un nodo y los padres de cada nodo son los snapshots anteriores desde los cuales se derivó.

  • ¿Qué es una 'branch' en el contexto del script?

    -Una 'branch' es una rama de desarrollo en el historial del código que permite trabajar en paralelo en diferentes funcionalidades o cambios sin afectar la rama principal.

  • ¿Cómo se resuelve el problema de la identificación de quién es el autor de cada snapshot?

    -Se resuelve agregando el nombre y el apellido del autor en el archivo 'mensaje' de cada snapshot, lo que permite identificar claramente a quién corresponde cada snapshot.

  • ¿Por qué deciden utilizar SHA1 para nombrar las snapshots?

    -Deciden utilizar SHA1 para asegurar que el nombre de cada snapshot sea único y para eliminar cualquier confusión, ya que un hash SHA1 es único para cada contenido del archivo message.

  • ¿Cómo se mejora el proceso de trabajo en equipo y combinación de cambios en el sistema de control de versiones?

    -Se mejora creando un nuevo snapshot que incluye los cambios de ambas partes y tiene dos padres, apuntando a las últimas snapshots de cada uno de los colaboradores, lo que permite combinar cambios sin problemas.

  • ¿Qué es el directorio 'staging' y cómo ayuda a organizar el proceso de creación de snapshots?

    -El directorio 'staging' es un intermediario entre el directorio de trabajo y el snapshot, donde se pueden decidir qué cambios incluirán en el siguiente snapshot, facilitando la especificación de los cambios que se quieren capturar.

  • ¿Cómo garantiza Git que es difícil perder trabajo, incluso cuando se elimina una rama?

    -Git garantiza que el trabajo no se pierde al eliminar una rama porque simplemente se elimina el puntero hacia el commit, pero las snapshots o commits siguen existiendo en el objeto del directorio; se puede recuperar utilizando el SHA1 del commit.

Outlines

00:00

🌱 Introducción al Control de Versiones

Este párrafo introduce la idea de un sistema de control de versiones, ilustrando el concepto con la analogía de tomar fotos instantáneas (snapshots) de un proyecto en desarrollo. Describe cómo, al principio, el proceso es lineal y cómo el desarrollador decide tomar 'fotos' de su código en momentos clave para poder regresar a versiones anteriores si es necesario. Se destaca la importancia de tener un registro confiable de las versiones del software y cómo esto puede ser útil para el desarrollo y la depuración.

05:01

🔄 Desarrollo y Problemas del Control de Versiones

El párrafo 2 aborda los desafíos que surgen al manejar múltiples versiones de un software en desarrollo. Se describe cómo, después de la entrega de una versión, los usuarios informan de bugs que necesitan ser solucionados rápidamente. Esto lleva al desarrollador a enfrentarse a la necesidad de crear una nueva versión (snapshot) que no sea una continuación directa de la última versión, lo que complica el seguimiento de las mismas. La historia utiliza la analogía de un árbol para explicar cómo manejar múltiples ramas de desarrollo y cómo el historial de código puede ser visualizado como tal.

10:03

🤝 Colaboración y Desarrollo en Equipo

Este segmento explora cómo el control de versiones puede ser una herramienta valiosa para el trabajo en equipo. Se presenta la situación hipotética de un colaborador que, después de recibir una copia del historial de snapshots y ramas, viaja y trabaja en una rama separada. Se discuten los problemas que surgen cuando dos desarrolladores trabajan en la misma rama sin conexión y cómo se resuelven mediante la creación de nombres de snapshots únicos y la actualización del historial de manera colaborativa.

15:05

🔍 Refinando el Proceso de Control de Versiones

El cuarto párrafo profundiza en la mejora del proceso de control de versiones. Se destaca la necesidad de un directorio de 'stage' que actúe como un intermediario entre el directorio de trabajo y los snapshots finales. Esto permite al desarrollador decidir qué cambios incluirán en la siguiente versión. Además, se introduce el concepto de 'merge' para combinar cambios de diferentes ramas y se compara el sistema descrito con Git, destacando las herramientas adicionales que ofrece Git para manejar situaciones complejas.

Mindmap

Keywords

💡Control de versiones

El control de versiones es un sistema que permite a los desarrolladores hacer un seguimiento de los cambios realizados en un proyecto a lo largo del tiempo. En el video, se describe cómo sería diseñar un sistema de control de versiones desde cero, usando la metáfora de tomar 'fotos instantáneas' (snapshots) del código en diferentes momentos.

💡Snapshot

Un snapshot es una instantánea o copia de un directorio o proyecto en un momento dado. En el contexto del video, los snapshots son puntos de guardado del código que permiten al desarrollador volver a una versión anterior en caso de necesitarlo.

💡Branch

Una branch es una línea de desarrollo separada dentro del mismo proyecto. Se utiliza para trabajar en características específicas o corregir bugs sin afectar el código principal. En el video, se menciona la creación de nuevas branches para diferentes propósitos, como corregir errores o agregar nuevas funcionalidades.

💡Merge

El merge es el proceso de combinar cambios de diferentes branches en una sola. Es una parte crucial del control de versiones cuando se trabaja en equipo. En el video, se discute cómo se realiza el merge para integrar los cambios de diferentes desarrolladores en una única versión.

💡SHA1

SHA1 es un algoritmo de hash que convierte el contenido de un archivo en una cadena única de caracteres hexadecimales. En el video, se utiliza SHA1 para generar nombres únicos para los snapshots, garantizando que cada uno sea identificable y no haya confusiones.

💡Working Directory

El working directory, o directorio de trabajo, es el área donde los desarrolladores hacen cambios en los archivos antes de que estos cambios se guarden en un snapshot. En el video, se destaca la importancia de este espacio para evitar cambios no deseados en los snapshots finales.

💡Staging Area

El staging area, o área de preparación, es un espacio intermedio entre el working directory y el snapshot donde los desarrolladores deciden qué cambios incluirán en el siguiente snapshot. Se menciona en el video como una forma de evitar accidentes y tener un mayor control sobre los cambios a guardar.

💡Commit

Un commit es una confirmación de los cambios en el control de versiones, generalmente asociada con un snapshot. En git, un commit es una instantánea de todos los cambios que se han preparado para ser guardados. En el video, los snapshots se comparan con los commits en git.

💡Master Branch

La master branch es la rama principal de un proyecto donde se encuentra el código estable y listo para ser desplegado. En el video, se nombra la rama principal como 'master' y se describe cómo otras ramas se desprenden de ella para diferentes propósitos.

💡Push

Push es una acción en el control de versiones que envía los cambios de una branch local a un repositorio remoto. Aunque no se menciona directamente en el video, el concepto está implícito cuando se habla de compartir snapshots o trabajar en equipo.

💡Pull

Pull es una acción que se realiza para traer los cambios de un repositorio remoto a una branch local. En el video, aunque no se utiliza el término, la idea subyacente está presente cuando se discute sobre cómo los desarrolladores pueden sincronizar sus cambios.

Highlights

Imagina una computadora con solo un editor de texto y un sistema de archivos, donde se necesita un sistema de control de versiones.

La idea de usar 'snapshots' o fotos instantáneas del código para rastrear versiones.

Cada snapshot se identifica con un nombre y un archivo especial llamado 'mensaje' que incluye un resumen de los cambios y la fecha.

La creación de un directorio 'snapshot 99' que se convierte en la primera versión desplegada (release versión 1.0).

El desafío de rastrear snapshots cuando el desarrollo no es lineal y se necesitan múltiples líneas de desarrollo.

La inspiración de la estructura de un árbol para manejar múltiples ramas en el historial de desarrollo del código.

La adición de un nuevo campo en el archivo 'mensaje' de cada snapshot que indica su padre, permitiendo un seguimiento lineal.

El uso de nombres representativos en lugar de números secuenciales para las ramas de desarrollo.

La creación del archivo 'branch' en la raíz del directorio para almacenar la información de las ramas y sus últimos snapshots.

La colaboración en equipo y el problema de nombres de snapshots duplicados cuando trabajan varios desarrolladores.

La solución de incluir el autor del snapshot en el archivo 'mensaje' y el uso de un hash SHA1 único para nombrar snapshots.

La representación gráfica del historial de código como un árbol con 'master' como la rama principal y otras ramas derivadas.

La creación de una nueva 'branch' llamada 'más' para desarrollar nuevas funcionalidades.

El concepto de 'staging' o área de preparación para decidir qué cambios incluirán en el siguiente snapshot.

La necesidad de un proceso de 'merge' para combinar cambios de diferentes ramas o desarrolladores.

La eficiencia del sistema de control de versiones construido, comparado con Git, y su capacidad para manejar herramientas de línea de comandos.

La seguridad de los datos en Git, donde incluso al eliminar una rama, los datos de los commits siguen estando almacenados y pueden ser recuperados.

Transcripts

play00:00

[Música]

play00:04

imagina que tienes una computadora que

play00:07

tiene solamente un editor de texto y un

play00:09

sistema de archivos

play00:11

ahora imagina que has tenido una idea

play00:14

que resuelve un problema específico y

play00:16

has decidido escribir un nuevo software

play00:18

utilizando el sistema que tienes en tu

play00:20

computadora sabes que este nuevo

play00:22

software tendrá un tamaño considerable

play00:25

por lo que necesitas una manera

play00:27

confiable de hacer un seguimiento de

play00:29

todas las versiones del sistema de forma

play00:31

tal que puedas volver fácilmente a una

play00:34

versión anterior en la cual has

play00:35

modificado o eliminado algo

play00:38

en otras palabras necesitas un sistema

play00:41

de control de versiones o en inglés

play00:43

versión control system imagina por un

play00:46

segundo que esto todavía no existe y te

play00:48

decides a intentarlo

play00:50

lo que sigue es la parábola de git o la

play00:53

historia hipotética de cómo diseñar y

play00:55

'las este sistema de control de

play00:57

versiones qué decisiones deberías tomar

play00:59

y por qué las tomaría esta parábola te

play01:02

ayudará a entender git de una manera

play01:04

orgánica sin entrar para nada en los

play01:07

comandos ni en los recursos prácticos

play01:09

inicialmente desarrollada por tom pérez

play01:12

tom werner que ahora adaptada por mí

play01:14

para ustedes en este curso la parábola

play01:17

de git forma parte de mi curso de git

play01:19

que puedes encontrar en la descripción

play01:21

de este vídeo

play01:23

tu amigo alfred trabaja como fotógrafo

play01:26

en una casa de fotografía y se dedica a

play01:28

sacar las famosas fotos de estudio en

play01:30

donde las familias van a un estudio de

play01:32

fotografía en determinados eventos

play01:33

especiales y todos juntos posan delante

play01:36

de una pantalla verde que luego se

play01:38

transformará en un bosque una playa o

play01:40

cualquier otro fondo al frente cuenta la

play01:42

historia de una mujer que trae a su hija

play01:44

todos los años en el mismo día para

play01:47

hacerle un portarretrato y ya trae todas

play01:50

las fotos de todos los años pasados dice

play01:52

alfred porque le gusta recordar cómo era

play01:54

su hija en cada etapa de la vida

play01:57

cada foto instantánea realmente le

play01:59

dejara viajar en el tiempo hacia esos

play02:01

recuerdos almacenados

play02:02

las palabras de alfred suenan perfectas

play02:06

para resolver el dilema de tu sistema de

play02:08

control de versiones fotos instantáneas

play02:10

o snapshots en inglés como si fueran los

play02:13

puntos de guardado de un videojuego son

play02:15

todo lo que te interesa cuando necesitas

play02:17

interactuar con tu sistema de control de

play02:19

versiones entonces piensas qué pasaría

play02:22

si pudiera tomar fotos instantáneas

play02:24

snapshots de tu código en cualquier

play02:27

momento y luego fueras capaz de leer y

play02:30

volver a esas fotos instantáneas siempre

play02:32

que lo necesites probablemente esa sería

play02:35

la solución perfecta a tu problema así

play02:38

que te decides implementarla así que

play02:40

empiezas tu proyecto en un nuevo

play02:42

directorio llamado working mientras

play02:45

escribes el código de tu nueva

play02:46

aplicación intentas ir despacio y

play02:48

escribir una funcionalidad a la vez

play02:50

cuando completan la primera

play02:52

funcionalidad te aseguras de que has

play02:54

guardado los cambios en todos los

play02:56

archivos y ese es una copia del

play02:58

directorio working completo

play03:00

a esta copia le pones un nombre que lo

play03:02

identifique snapshot 0 una vez que la

play03:06

copia ha finalizado te aseguras de no

play03:08

cambiar nunca más los archivos dentro de

play03:10

este nuevo directorio ya con la copia

play03:12

lista procede es a seguir trabajando en

play03:14

tu aplicación y agrega el próximo set de

play03:16

cambios hasta que completas una nueva

play03:18

funcionalidad entonces haces lo mismo

play03:21

copias el directorio working completo en

play03:24

un nuevo directorio que esta vez

play03:26

llamarás snapshot 1

play03:28

de ahora en más repite este mismo

play03:31

proceso para cada funcionalidad que va

play03:33

agregando creas una copia del directorio

play03:35

y le pones un nombre que luego puedes

play03:37

identificar fácilmente pero a medida que

play03:40

vas agregando más y más snapshots te das

play03:42

cuenta de que sólo con el nombre no es

play03:44

suficiente para identificarlas así que

play03:46

decides agregar un archivo especial en

play03:49

tus snapshots y las llamas mesas o

play03:52

mensaje este mensaje contiene un resumen

play03:54

de los cambios contenidos en este

play03:57

snapshot además de la fecha en la que

play03:59

los completaste al agregar este nuevo

play04:01

archivo llamado mensaje se vuelve mucho

play04:03

más sencillo encontrar un cambio

play04:05

específico que hiciste en el pasado en

play04:07

caso de que necesites volver a una

play04:09

versión anterior del código porque de un

play04:11

simple vistazo puedes leer el resumen de

play04:13

los cambios y la fecha en la que los

play04:15

completaste

play04:17

luego de un tiempo trabajando en el

play04:18

proyecto y creando snapshots comienza a

play04:20

aparecer una potencia el release después

play04:24

de muchas horas de código creas el

play04:25

directorio snapshot 99 que se convertirá

play04:28

luego en la primera versión a ser

play04:30

desplegada release versión 1.0 empaque

play04:34

estás de esta versión y de liberes al

play04:36

público para que empiecen a usarlo a los

play04:38

usuarios la primera versión de tu

play04:40

aplicación es tan bien aceptada por los

play04:42

usuarios que en el entusiasmo se sientas

play04:44

escribir más código para que las

play04:46

próximas versiones sean todavía más

play04:48

exitosas hasta ahora tu sistema de

play04:50

control de versiones ha funcionado bien

play04:52

puedes acceder fácilmente a versiones

play04:54

anteriores de tu código y además sabes

play04:56

exactamente qué hay en cada snapshot

play04:58

pero no mucho tiempo después de haber

play05:00

desplegado la release sucede lo que

play05:02

siempre sucede cuando entregas software

play05:04

tus usuarios comienzan a reportar

play05:07

algunos bugs nada grave todo se puede

play05:10

solucionar con unos cuantos fixes pero

play05:12

aquí te enfrentas a un dilema desde la

play05:14

release has creado 10 snapshots pero aún

play05:17

no has terminado de probarlas en

play05:18

profundidad por lo cual no puedes

play05:20

entregarla a los usuarios lo lógico

play05:22

sería arreglar los bugs directamente

play05:25

sobre el snapshot 99 que es la versión

play05:27

que tienen los usuarios así que decides

play05:30

hacer eso aplicar los cambios sobre

play05:32

snapshot 99 para esto copias snapshot 99

play05:36

a tu directorio de trabajo y sobre esa

play05:39

versión aplican los cambios que

play05:40

rápidamente solucionan los problemas que

play05:43

experimentaban los usuarios aquí es en

play05:45

donde el problema se vuelve aparente tu

play05:47

sistema de control de cambios funciona

play05:49

muy bien cuando el desarrollo es lineal

play05:51

porque puedes ir hacia adelante y hacia

play05:53

atrás entonces snapshots sin problemas

play05:55

pero ahora por primera vez necesitas

play05:58

crear un snapshot que no desciende

play05:59

directamente de tu última snapshot

play06:01

creada si llamas a tu nuevo snapshot 110

play06:05

entonces estaría rompiendo el proceso

play06:07

porque snapshot 110 no incluye los

play06:10

últimos 10 cambios que agregaste y

play06:13

además no desciende directamente

play06:14

snapshot 109 evidentemente necesitas un

play06:18

sistema un poco más eficiente para

play06:21

recargar energías y pensar en

play06:22

profundidad en este nuevo problema

play06:24

decides dejar la computadora y salir un

play06:26

poco a la naturaleza porque está

play06:28

comprobado que te ayuda a conectarte con

play06:30

tu versión más creativa una caminata por

play06:33

la montaña rápidamente te desconecta de

play06:35

tu preocupación y te quedas mirando un

play06:37

árbol gigante del costado del camino

play06:39

está bien adentrado el otoño por lo que

play06:42

el árbol no tiene casi hojas y deja al

play06:44

descubierto un complejo entramado de

play06:46

ramas que te hipnotiza en un largo rato

play06:48

te detienes en una de las miles de ramas

play06:51

y casi como un juego te propones a

play06:53

seguir la traza de la rama desde el

play06:55

extremo más alejado del tronco en donde

play06:58

luego crecerán las hojas por todo su

play07:00

camino de vuelta al tronco entonces

play07:02

descubres que lo que en principio

play07:03

parecía complicado ahora resulta muy

play07:06

sencillo y natural la rama por más

play07:09

complejo que su patrón sea sigue una

play07:11

línea clara y directa hasta el tronco es

play07:14

ahí cuando entiendes que esta es la idea

play07:16

perfecta este patrón de ramas soporta

play07:20

gran complejidad pero a la vez permite

play07:22

que el camino de vuelta al tronco sea

play07:24

sencillo por lo que es perfecto para

play07:27

hacer un seguimiento de múltiples líneas

play07:29

de desarrollo tal cual el que necesitas

play07:32

si miras la historia de tu código como

play07:34

un árbol resolver el problema del

play07:36

ancestro de cada snapshot se vuelve

play07:38

trivial todo lo que necesitas hacer es

play07:40

agregar un nuevo campo en el archivo

play07:43

mensaje de cada snapshot indicando cuál

play07:45

es su padre agregar este puntero te

play07:48

permite realizar un seguimiento simple y

play07:50

efectivo de la historia completa de cada

play07:53

una de tus snapshots todo el camino

play07:55

hasta el tronco o la rama principal por

play07:58

lo cual el historial de tu código ahora

play08:00

es un árbol y en lugar de tener una

play08:03

única snapshot como la última snapshot

play08:05

ahora tienes dos una por cada branch

play08:08

cuando el sistema de control de

play08:09

versiones era lineal el sistema de

play08:12

numeración secuencial que usabas tenía

play08:14

sentido porque rápidamente podías

play08:16

identificar cuál era la última versión

play08:18

de tu código pero esa habilidad ahora

play08:20

está perdida así que comienzas a nombrar

play08:23

más con nombres representativos

play08:27

crear nuevas ramas de desarrollo se ha

play08:29

vuelto tan sencillo que de pronto

play08:31

sientes la necesidad de hacerlo todo el

play08:33

tiempo así que creas ramas o en inglés

play08:35

branch es para todo para arreglar un bar

play08:39

para hacer experimentos que quizás nunca

play08:40

salgan a la luz para nuevas

play08:42

funcionalidades que quieres agregar a la

play08:44

aplicación etcétera pero con esto

play08:46

aparece un nuevo problema cada vez que

play08:48

creas un snapshot debes recordar que

play08:51

este snapshot es la última en su propia

play08:53

rama sin esta información ir moviéndote

play08:56

entre ramas se vuelve un proceso

play08:58

complicado porque no solo tienes que

play08:59

recordar el nombre de la rama y lo que

play09:01

contiene sino que también tienes que

play09:03

recordar cuál es su última estancia

play09:05

entonces te decides a crear un nuevo

play09:07

archivo en la raíz de tu directorio por

play09:10

fuera de todas tus snapshots y llamas a

play09:12

este archivo branch es en este archivo

play09:15

branch es almacenar una lista con los

play09:18

pares nombre de la branch y último

play09:20

snapshot porque esta es la menor

play09:22

cantidad de información necesaria para

play09:24

identificar una branch

play09:26

si necesitas conocer la lista de

play09:28

snapshots que componen una branch sabes

play09:30

que puedes hacerlo fácilmente porque

play09:32

cada snapshot tiene puntero acceso

play09:35

snapshot predecesora con este agregado

play09:37

ahora para moverte entre ramas solo

play09:40

tienes que buscar el nombre de la rama a

play09:41

la que quieres acceder y allí mismo

play09:43

encontrarás su último snapshot claro que

play09:47

esto significa que cada vez que crees

play09:49

una nueva snapshot dentro de una rama

play09:50

tienes que actualizar el nombre de la

play09:52

última estación un pequeño precio que

play09:55

pagar por un gran beneficio pero como

play09:58

bien sabes el desarrollo de software es

play10:00

un trabajo cooperativo trabajar en

play10:02

soledad pronto se vuelve aburrido y

play10:05

piensas en invitar a alguien a trabajar

play10:06

en tu proyecto por suerte su amiga show

play10:09

tiene un setup padecido el tuyo y tiene

play10:12

ganas de ayudarte a construir esta

play10:13

aplicación además le entusiasma probar

play10:16

tu nuevo sistema de control de versiones

play10:17

y gracias a que has creado este sistema

play10:20

de versiones puedes enviar a xavi una

play10:22

copia completa de todo el historial de

play10:24

snapshots y ramas de tu aplicación tener

play10:27

a xavi en tu equipo es genial pero ella

play10:30

tiene el hábito de salir de viaje

play10:31

seguido a lugares que no tienen mucho

play10:33

acceso a internet

play10:35

así que en cuanto tiene el historial de

play10:37

snapshots en su computadora toma un

play10:39

vuelo directo a la patagonia y no sabrás

play10:42

nada de ella por un par de semanas en

play10:44

estas semanas en las que su vista de

play10:46

viaje los dos escriben mucho código cada

play10:49

uno en su entorno y cuando ella

play10:50

finalmente vuelve descubres que hay una

play10:53

falla crítica en tu sistema de control

play10:55

de versiones porque los dos utilizan el

play10:57

mismo sistema de números para nombrar

play10:59

snapshots los dos ahora tienen

play11:01

directorios llamados 113 y 114

play11:05

solo que estos directorios son

play11:07

obviamente distintos entre sí además ni

play11:10

siquiera tienes una manera de

play11:12

identificar quién es el autor de cada

play11:13

snapshot pero como todo en la industria

play11:16

del software el proceso es interactivo

play11:18

así que te sientas con sobisch y los dos

play11:20

juntos piensan en una posible solución

play11:22

para estos problemas

play11:23

primero que nada hay que hacer un

play11:26

pequeño ajuste en el archivo mensaje y

play11:28

agregar ahora el autor del snapshot en

play11:31

la forma nombre y medio además de la

play11:34

información que ya almacenamos antes

play11:36

con ese cambio en el archivo mensaje

play11:38

ahora al menos podemos identificar con

play11:41

claridad a quién corresponde cada

play11:43

snapshot el segundo cambio que necesitas

play11:45

hacer es alrededor del nombre de las

play11:47

estampas ya no pueden ser nombradas

play11:50

utilizando números secuenciales sino que

play11:52

debes asegurarte de que el nombre de

play11:54

cada snapshot es único para eliminar

play11:57

toda confusión para esto decides crear

play11:59

un hash a partir del contenido del

play12:01

archivo message un hash te garantiza que

play12:04

será único para cada snapshot porque

play12:06

nunca tendrás dos snapshots con la misma

play12:09

fecha autor samari y parent snapshot

play12:12

para asegurarte de que el hash se cree

play12:14

exitosamente ambos concuerdan en

play12:16

utilizar sha1 que es un algoritmo que

play12:20

toma el contenido de un archivo y a

play12:22

partir de ese contenido produce una

play12:24

cadena de 40 caracteres hexadecimal es

play12:27

tanto tú como zoey actualizan su

play12:30

historial con esta técnica y ahora en

play12:32

lugar de tener dos directorios llamados

play12:34

113 y 114 tienen dos directorios con dos

play12:38

nombres completamente distintos

play12:40

ahora que los nombres de las snapshots

play12:43

han sido actualizados se vuelve más

play12:45

sencillo para ti traer las snapshots de

play12:47

show y ubicarlas junto a tus propios

play12:49

snapshots y porque cada snapshot

play12:52

especifica su par en el historial del

play12:54

código de tu aplicación sigue siendo un

play12:56

árbol solo que el árbol ahora también

play12:58

incluye snapshots de show

play13:01

en resumen ahora cada snapshot es

play13:04

identificada gracias a un hash sha1

play13:07

único y además incluye un puntero a su

play13:10

parent snapshot que también se

play13:12

identifica con un sha1 estos snapshots

play13:15

pueden ser creadas y trasladadas de

play13:17

computadora a computadora sin perder en

play13:20

absoluto su identidad oa quién

play13:22

pertenecen dentro del historial del

play13:24

árbol de la aplicación incluso snapshots

play13:26

pueden ser compartidas o también pueden

play13:28

ser privadas es decir que se haya

play13:30

escrito una funcionalidad experimental

play13:32

que no está seguro de querer mostrar a

play13:34

otros todavía simplemente no le hagas

play13:37

disponible y nadie más que tú podrá

play13:38

verla

play13:39

antes de seguir adelante vamos a cambiar

play13:42

la representación del árbol por una más

play13:44

conveniente ahora cada snapshot es un

play13:47

punto del árbol y cada rama se

play13:49

representa como un conjunto de puntos a

play13:52

la rama principal la llamaremos master y

play13:54

a partir de ella se desprenden las otras

play13:56

ramas trabajar con show es genial así

play14:00

que creas una nueva branch llamada más

play14:02

para agregar una nueva funcionalidad a

play14:05

tu aplicación y le pides a xavi que te

play14:07

ayude a trabajar en esa rama show y se

play14:10

va de viaje a un lugar tan remoto que se

play14:12

queda sin conexión a internet durante

play14:14

todo el viaje y se ve obligada a

play14:16

trabajar en la nueva rama más

play14:18

completamente offline al mismo tiempo

play14:21

mientras hoy no está tú también realizas

play14:24

cambios en la rama más porque quieres

play14:26

agregar ciertas funciones genéricas que

play14:28

crees que pueden ser importantes en el

play14:30

futuro una vez que se ha vuelto de viaje

play14:33

te muestra los cambios que ya he hecho y

play14:35

se presenta una de las preguntas más

play14:37

comunes a la hora de trabajar en equipo

play14:40

cómo combinar los cambios que hizo xabi

play14:42

con los que hiciste tú aquí es en donde

play14:44

descubres que tu sistema de control de

play14:47

versiones necesita algún tipo de proceso

play14:49

para realizar un merge o para combinar

play14:53

ramas la estructura de árbol que has

play14:55

diseñado para tu sistema de control de

play14:57

versiones lo hace fácil sólo tienes que

play15:00

crear una nueva snapshot que incluye las

play15:02

modificaciones necesarias para integrar

play15:04

los cambios de xavi con los tuyos

play15:06

propios

play15:07

este snapshot será algo especial por

play15:09

primera vez tendrás dos padres es decir

play15:12

que en su archivo message apuntará a dos

play15:14

snapshots en lugar de a una por un lado

play15:17

apuntará a la última de los snapshots en

play15:20

las que tú trabajaste y por el otro a la

play15:22

última vez snapshots en la que soy

play15:24

trabajo en la rama más ahora esta nueva

play15:27

snapshot que combina los cambios se ha

play15:29

convertido en la snap show más reciente

play15:31

de la rama más y has definido un proceso

play15:33

que te permite trabajar en equipo

play15:35

offline y luego combinar los cambios sin

play15:38

problemas

play15:40

el próximo lugar en donde descubres que

play15:42

todavía hay espacio para mejorar el

play15:44

proceso es en tu directorio de trabajo

play15:46

también conocido como working director y

play15:49

por mucho que tratas de que todas las

play15:51

modificaciones que haces a una

play15:53

funcionalidad estén 100% relacionadas

play15:56

con esta funcionalidad muchas veces te

play15:58

pasa que terminas haciendo otros cambios

play16:00

en lugares no directamente relacionados

play16:02

con esa funcionalidad y que tienen que

play16:04

ver más con otra entonces te das cuenta

play16:07

de que tu working director y ahora

play16:09

contiene lo que realmente deberían ser

play16:11

dos snapshots separadas en lugar de una

play16:14

aquí es en donde surge el concepto de

play16:16

staying de director y este directorio

play16:20

funciona como un paso intermedio entre

play16:22

tu directorio de trabajo y tu snapshot

play16:25

ahora cada vez que terminas de crear

play16:27

editar o eliminar un archivo puedes

play16:30

decidir si quieres que ese cambio forme

play16:32

parte de tu siguiente snapshot o no

play16:34

cuando si quieres que forme parte de tu

play16:36

próxima snapshot simplemente lo copias

play16:39

al directorio de stage y si no quieres

play16:41

que forme parte lo dejas en el

play16:43

directorio de trabajo

play16:45

esta nueva separación hace fácil

play16:47

especificar que está incluido y que no

play16:50

está incluido en la próxima snapshot ya

play16:52

no tienes que preocuparte por

play16:53

potenciales accidentes que terminen en

play16:55

tu snapshot porque ahora debes

play16:57

manualmente elegir qué cosas formarán

play16:59

parte de esa es nacho tu próxima

play17:02

snapshot será entonces creada a partir

play17:04

del directorio staging el sistema de

play17:07

control de versiones que has construido

play17:08

hasta aquí se parece mucho a git la gran

play17:11

diferencia es que git proporciona una

play17:13

gran variedad de herramientas de línea

play17:14

de comandos para manejar situaciones

play17:16

como las que hemos visto además de

play17:18

muchas otras lo que hasta aquí hemos

play17:20

llamado snapshot en git se conoce por el

play17:23

término commit a medida que estudia hits

play17:26

a lo largo de este curso ten presente

play17:28

todo lo que hemos visto en esta parábola

play17:29

de git y te recomiendo que vuelvas a

play17:31

verla siempre que algún concepto no

play17:33

quede claro una última cosa antes de

play17:36

terminar recuerda que es muy difícil

play17:38

casi imposible perder nada de tu trabajo

play17:41

con git incluso cuando eliminas una rama

play17:43

lo que realmente sucede es que el

play17:45

puntero hacia este comité se elimina

play17:48

todas las snapshots están todavía en los

play17:50

objetos del directorio sólo necesitarás

play17:53

encontrar el sha1 del comit a lo largo

play17:58

del curso te voy a mostrar herramientas

play17:59

para resolver esta y muchas otras

play18:02

situaciones que te encontrarás

play18:03

trabajando con mid si este vídeo te

play18:06

gustó te invito que le dejes un like así

play18:08

llega a muchas más personas en general

play18:10

los programadores y las programadoras

play18:12

conocen git conocen los comandos y saben

play18:15

manejarse con los procedimientos básicos

play18:17

del control de versiones pero no

play18:19

entienden qué pasa de fondo y cuáles son

play18:21

los fundamentos de un sistema de control

play18:23

de versiones como git para ver contenido

play18:26

como éste y muchas otras cosas más te

play18:28

invito a que te suscribas al canal si

play18:29

todavía no lo hiciste déjame en

play18:31

comentarios qué te pareció este vídeo y

play18:33

que otra cosa quieres ver en este canal

play18:35

muchísimas gracias y nos vemos la

play18:38

próxima

play18:39

[Música]

Rate This

5.0 / 5 (0 votes)

Связанные теги
Control de versionesGitDesarrollo de softwareSistemas de archivosFotografía instantáneaSnapshotsBranchesHash SHA1ColaboraciónCódigoSolución de problemasProgramación
Вам нужно краткое изложение на английском?