<jupyter_start><jupyter_text>Universidad Galileo  Maestría en Data Science  Ciencia de datos en Python  Sección U  GIT Y CONTROL DE VERSIONESHenry <NAME>21001835Guatemala, 10 de febrero de 2021 GIT Y CONTROL DE VERSIONES RESUMEN  Git modela su versionado como una colección de archivo y carpetas con un nivel padre, a todo este conjunto le llama instantanea (*snapshot*), que es el árbol de nivel superior que se está rastreando.  En Git un archivo se conoce como *blob* y un directorio como *tree* (éste puede contener otros directorios dentro de sí).  Una instantanea es hijo de una o mas instantaneas, esto es así porque git no funciona de manera linear, así en cualquier momento podemos tenes una instantanea que es "hija" de la unión de otras dos instantaneas. Una instantanes se genera luego de cada **commit**.  Rama (*branch*), es como se le conoce a la creación de un nuevo *tree* donde se crea una nueva funcionalidad, separada y sin afectar la rama principal.  Una forma simple de ver el modelo de datos de git, es asumiendo que los blob, trees y commits son objetos y a cada vez que se crea uno de estos se crea con un identificador de tipo SHA1.  SHA1 (Secure Hash Algorithm), es un algoritmo de cifrado de una vía que genera cifrados en código hexadecimal de 40 caracteres de longitud. Este algoritmo fue desarrollado por la NSA (National Security Agency) de Estados Unidos.  Mediante el hash propio de cada objeto, cada uno tiene referencia a los objetos que contiene dentro de sí, si es un directorio o árbol; o a su contenido texto/bytes si es un archivo (*blob*).  Las referencias son una forma fácil de identificar y/o recordar un commit. Este es un número SHA corto, pues el original es dificil de manejar y recordar, dado que son 40 caracteres. Adicionalmente existe una referencia especial llamada HEAD, que nos indica dónde nos encontramos en el momento actual.  Un repositorio en GIT es el espacio donde se almacenan los objetos, referencias e instantaneas de un proyecto.  El stagging area es un lugar abstracto donde se encuentran los cambios que se han agregado con el comando *git add*, pero que aún no se han agregado al repositorio (con el comando *git commit*). Esto nos permite tener cambios que están "semiconfirmados", es decir, separados del área de trabajo y del área de repositorio.   COMENTARIOSGit es una herramienta poderosa para el manejo de versiones. Muchos hemos cometido el error de aprender los comandos básicos de funcionamiento, que no está mal, sin embargo, git ofrece una variedad de comandos que se convierten en herramientas para recuperar versiones, para revisión de cambios, para deshacer modificaciones, para realizar auditorias y encontrar responsables de sucesos, para automatizar tareas en repositorios remotos, etc.  Como desarrolladores, gestores o participantes de proyectos es importante conocer todo lo que git provee como herramienta y también reconocer que no es necesario, quizá, aprender tantos comandos, pues también existen varias herramientas gráficas que proveen las mismas funcionalidades. CONCLUSIONESGit es un sistema de control de versiones que nos provee la posibilidad de llevar un control sobre proyectos del tipo que sea. Tiene grandes ventajas, entre ellas la posibilidad de colaboración entre varias personas al tener un repositorio remoto. Git nació como una necesidad de un programador de nombre <NAME>, quien al verse "acorralado", porque le iban a empezar a cobrar por un servicio de seguimiento de versiones, decidió crear su propio sistema de versiones.  Es importante, no solo aprender los comandos, sino comprender cómo funcionan a nivel interno y clarificar que es lo que sucede al ejecutar cada uno de estos.  Llama la atención cómo git utiliza para identificar sus instantaneas, un código hash, en específico uno generado con el algoritmo SHA1, el cual se genera a partir del titulo/comentario del comando commit y del contenido que se agregue al repositorio, esto significa que en cada ejecución del comando commit, se genera un código hash único. Adicional al código hash principal, de 40 caracteres, se genera un código hash mas corto y manejable para la realización de ciertas acciones mediante los comandos de git.  Una particularidad importante que le da una ventaja a git es el manejo de sus áreas de trabajo:1. **working directory**: que es el área de trabajo donde estan los archivos nuevos, eliminados y modificaciones en contenido de archivos. Acá se encuentra todo aquello a lo que no se le ha aplicado el comango git add.2. **stagging area**: es el área de preparación, acá se encuentra todo lo que ya fue agregado con el comando git add, pero que aún no se ha agregado al repositorio.3. **repository**: es el área definitiva de los cambios hechos, es donde se almacenan definitivamente los cambios y una vez que se ingresan a esta area, es donde se genera el código hash que los identifica. COMANDOS**BÁSICOS*** git help : devuelve información sobre el funcionamiento de un comango* git init: crea un nuevo repositorio git y la información la guarda en el directorio .git* git status: muestra el estado de cambios del directorio* git add : agrega archivos al _staging area_* git commit: crea un nuevo commit* git log: muestra de forma simpe, un historial* git log --all --graph --decorate: muestra un historial como un DAG* git diff : muestra los cambios relativos a lo que hay en _staging area_* git diff  : muestra los cambios de un archivo entre distintas instantaneas* git checkout : actualiza el HEAD y la rama actual**RAMAS E INTEGRACIONES*** git branch: muestra las ramas del repositorio* git branch : crea una nueva rama* git checkout -b : crea una nueva rama y se situa dentro de ella* git merge : integra los cambios de la revisión indicada en la rama actual* git mergetool: provee una herramienta mas amigable para la resolución de conflictos* git rebase: obvia un conjunto de cambios en una nueva base**REMOTO*** git remote: lista las ramas remotas* git remote add  : agrega un nuevo repositorio remoto* git push  :: envia objetos y cambios al repositorio remoto y actualiza la referencia remota* git branch --set-upstream-to=/: crea un nuevo branch en el repositorio remoto y envía los objetos creados en el commit* git fetch: obtiene los objetos y referencias desde el repositorio remoto* git pull: obtiene cambios de todas las ramas e integra en la rama actual. Lo mismo que git fetch; git merge* git clone: descargar un repositorio de una ubicacion remota**DESHACER*** git commit --amend: edita el contenido o mensaje de un commit* git reset HEAD : deshace los cambios en un archivo* git checkout -- : obvia los ambios en un archivo EJEMPLOS Comando para crear un repositorio: ```git init my_first_repository``` Luego de crear cualquier tipo de archivo podemos agregarlo al stagging area: ```git add *                (para agregar todos los cambios que existan)git add  (para agregar los cambios de archivos específicos)``` Para crear una instantanea, se ejecuta el comando commit, este guardará en el repositorio todo lo agregado al stagging area: ```git commit -m "Agregar un mensaje de commit"``` Si ya tuviesemos "conectado" nuestro repositorio con un repositorio remoto, para enviar los cambios que tenemos en nuestro repositorio local ejecutamos el siguiente comando: ```git push origin:```<jupyter_code>%lsmagic
%cd<jupyter_output>C:\Users\hbarrientosg
{'fraction_non_alphanumeric': 0.03915458609944452, 'fraction_numerical': 0.003522557918981168, 'mean_word_length': 4.762685402029664, 'pattern_counts': {'":': 0, '<': 6, '<?xml version=': 0, '>': 6, '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': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '662807', 'license': 'CC0-1.0', 'n_tokens_mistral': 2174, 'n_tokens_neox': 2161, 'n_words': 1173, 'path': 'CDP_U_Tarea02_HenryBarrientos.ipynb', 'repo_name': 'hbarrientos/PythonDataScience_U', 'size': '7408'}