<jupyter_start><jupyter_text>Sistemas de control de versionesSon herramientas utilizadas para llevar el control de los cambios que se realicen en el código fuente de una aplicación, estos sistemas conservan un historial de los cambios realizados a traves del tiempo de todos los ficheros que se le indicaron para tener el control.Los sistemas de control de versiones nos ayudan a responder automaticamente la siguiente información:- ¿Quién creó este archivo?- ¿Quién ha modificado este fichero y cuando?- ¿Quién edito esta línea?- ¿Qué información tenía el archivo **xxxxx.py** el día *24/08/2005*?Algunos sistemas de control de versiones populares son Git, SVN y Mercurial. Para esta investigación nos centraremos en **Git**.  Modelo de datos utilizado por GitLa principal diferencia entre Git y otros sistemas de control de versiones es su forma de manejar los datos. Normalmente un **VCS** almacena la información como una lista de cambios en cada archivo a través del tiempo.  Copias instantáneas**Git** maneja sus datos como un conjunto de copias instantáneas. Cada que vez que se confirma un cambio, básicamente **Git** toma una *fotografía* del aspecto de todos los archivos que se tengan en ese momento como un sistema de archivos miniatura. Pero sería ineficiente si para cada cambio se almacenara una copia total del proyecto aún cuando no se hayan hecho cambios en todos los ficheres, para hacer esto eficiente **git** no almacena los archivos que no se han modificado sino mas bien un enlace al archivo anterior idéntico que ya tenga almacenado.Una de las principales ventajas de **Git** es que maneja un registro de todos los cambios realizados en una copia local y son pocas las cosas que no se pueden realizar localmente. Integridad de los datosTodas las acciones realizadas en **Git** son verificadas por una suma de comprobación (checksum) antes de ser almacenado, a partir de ese momento se identifica ese cambio mediante el valor de dicha suma. El algoritmo utilizado por Git para generar el *checksum* se conoce como *SHA-1* y se trata de una cadena de 40 caracteres hexadecimales y se calcula utilizando la información contenida en los archivos. Almacenar SI, Eliminar NOCuando se realizan acciones en **Git** por lo general todas estas sólo añaden información a la base de datos. Como en cualquier sistema de control de versiones se puede perder información que no ha sido confirmada. Pero después de almacenar una copia instantánea es muy díficil perder algo de información. ¿Qué es un repositorio?Es un conjunto de datos que contiene todas las referencias asociadas a cada acción realizada en  **Git** bajo su modelo de datos. Flujo de Trabajo en Git Inicializar un repositorio Hay varias formas de realizar esta acción.* Crear un repositorio localmente con el comando> git **init** *repo_name** Clonar un repositorio existente con el comando> git **clone** *url_remoto/repo_name.git* Area de preparaciónSe preparan los archivos de los que se quieren confirmar los cambios, esto se realiza moviendolos hacía el area de preparación (Staged). Primero se verifica el estado en el que nos encontramos utilizando el siguiente comando<jupyter_code>!git status<jupyter_output>On branch master
Your branch is up to date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	modified:   resumen_control_de_versiones.ipynb

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   resumen_control_de_versiones.ipynb<jupyter_text>El resultado del comando nos dice que archivos tuvieron cambios y aún no estan en el area de preparación. Agregamos los archivos al area de preparación utilizando el siguiente comando:<jupyter_code>!git add .<jupyter_output>warning: LF will be replaced by CRLF in resumen_control_de_versiones.ipynb.
The file will have its original line endings in your working directory<jupyter_text>ConfirmaciónSe confirman los cambios y se crea una copia instantánea de todo el repositorio. Se agrega un mensaje que puede incluir los cambios que se realizaron.<jupyter_code>!git commit -m "Modificaciones al cuaderno interactivo, se agregan ejemplos de uso de comandos en git"<jupyter_output>[master cb93fe6] Modificaciones al cuaderno interactivo, se agregan ejemplos de uso de comandos en git
 1 file changed, 97 insertions(+), 2 deletions(-)<jupyter_text>Modificando repositorio remotoPor último se envían los cambios realizados a nuestro repositorio remoto alojado en *Github* para que siempre tengamos la versión actualizada.<jupyter_code>!git push<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.04488138491130583, 'fraction_numerical': 0.0038469758495405003, 'mean_word_length': 5.248331108144193, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 19, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '4', 'dir': 'jupyter-structured-clean-dedup', 'id': '381960', 'license': 'MIT', 'n_tokens_mistral': 1426, 'n_tokens_neox': 1393, 'n_words': 677, 'path': 'resumen_control_de_versiones.ipynb', 'repo_name': 'jfpIE16/vcs_basics', 'size': '4679'}