<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Git es un sistema de manejo de versiones distribuido creado por Linus Torvalds.  
Los sistemas de manejo de versiones permiten tener un control detallado sobre el historial de cambios de un archivo o conjunto de archivos creando instantaneas de estos conjuntos cada que se presenta un cambio. Estos sistemas de control de versiones pueden ser centralizados (ejemplo subversion) o distribuidos (ejemplo git), acorde a si existe un repositorio principal donde se maneja el historial y desde el cual todos los demas repositorios extraen las versiones requeridas, o si todo el historial se distribuye en cada repositorio.  
Para el desarrollo de esta sesión se requiere la creación de cuenta en github o bitbucket.  
Instalación
Para la instalación de git use el siguiente procedimiento.
Windows
Si usa sistema operativo windows puede descargar los binarios del cliente de git for windows y durante la instalación usar la configuración recomendada.  
Ubuntu Linux
En su sistema linux, muy probablemente encontrará el cliente de comandos para instalar desde el repositorio de su distribución.  
sudo apt install git
Si desea realizar la autenticación por medio de SSH requiere instalar los paquetes adicionales a SSH, sin embargo se recomienda la autenticación por medio de HTTP para reducir el número de pasos requeridos, y cuando se desea trabajar en equipos de uso no habitual o que siendo de uso frecuente podría ser usado por un tercero. Igualmente, al usar autenticación por HTTP es posible conectarse a pesar de los bloqueos que por seguridad establecen las politicas de muchas entidades.  
Mac
En mac, puede usar igualmente a linux la instalación por binarios disponibles en la página oficial, git.  
Alternativas
Puede usar un cliente multiplataforma y gráfico de fácil instalación como gitkraken o github desktop (este último solo para windows o mac), sin embargo para fines de este curso se exigirá el manejo directo del cliente de comandos de git.  
Uso
Una vez instalado nuestro cliente git podemos consultar sus opciones y argumentos.
Step1:  Configuración
Para una adecuada identificación de nuestros aportes en los repositorios, es necesario configurar nuestro nombre y correo en git.  
git config --global user.name "YOUR NAME"
git config --global user.email "YOUR EMAIL ADDRESS"
Creación de repositorios
Una vez creada la cuenta github, debe crear un repositorio git en ella y copiar la dirección de clonado, la cual se usa con el fin de obtener una copia del repositorio localmente.
Step2:  De esta forma crearemos una copia del repositorio git herramientas_computacionales en el directorio ./herramientas. Si no se indica el directorio, se crea un directorio nuevo en la posición actual.  
Tras el clonado, tenemos a disposición todo el directorio del repositorio, incluido el directorio .git que almacena la información del historial y repositorios (para este momento, heredada del repositorio clonado).
Step3:  Se evidencia que tras el clonado, tenemos configurados los repositorios remotos por defecto.
Step4:  En caso de ser un repositorio nuevo o desear reinicializar (aceptar nuevas plantillas o mover el directorio), debemos crear el directorio .git y agregar los elementos que teniamos en nuestro directorio. Siempre que se agreguen (o se realiza cualquier actualización de los archivos y directorios, se sugiere realizar un commit para la indicación de la acción en nuestro historial).
Step5:  Repositorios remotos
Una vez se inicializa o se clona, podemos agregar nuestro reposotorio remoto, que previamente fue creado en github o bitbucket. Si solo se desea un uso local o si es justo el repositorio clonado no será necesario.
Step6:  Tambien es posible eliminar el acceso al servidor remoto, con git remote rm.
Step7:  Objetos y referencias
A continuación, y para evitar posibles conflictos de los archivos, es recomendable iniciar con un fetch o pull para obtener los objetos y referencias del repositorio remoto (esto si creamos el repositorio con los archivos de licencia y README.md que nos invita a crear el servicio git), y hacer la unión del contenido existente en el remoto con el local justo en el local.  
git pull pruebas master
El paso anterior se evita si solo usamos el servicio para la creación del repositorio remoto vacio en lugar de poblarlo con los asistentes de archivo de licencia y archivo de descripción. Si en el paso anterior los archivos del repositorio remoto y el local poseen los mismos nombres pero son diferentes, pueden existir conflictos que deban resolverse de forma manual.  
Crearemos archivos de prueba la adición al repositorio.
Step8:  Aunque en este caso es claro que nuestros archivos no se encuentran agregados al repositorio, consultaremos por el estado de los archivos frente a su registro en el repositorio.
Step9:  Ahora agregamos al registro los archivos de nuestro repositorio local.
Step10:  Realizaremos una modificación en uno de los archivos y agregaremos directamente a este.
Step11:  Es posible indicar directamente a git la eliminación de archivos mediante
git rm archivo
o tambien al eliminar el archivo de manera directa, se incluye en git
git add -A
con el fin de actualizar el arbol de archivos y rastrear incluso los archivos eliminados. Sin embargo, es recomendable que la adición y remoción de archivos sea lo más especifica posible con el fin de tener un registro descriptivo que ayude a la adecuada solución de problemas o la descripción de cambios de una versión a otro de los códigos. Tengase en cuenta que en el caso de directorios, debe indicarse el argumento recursivo para el borrado.  
Si se desea eliminar un archivo del repositorio pero no del disco, debe eliminarse de la cache del repositorio.  
git rm --cached archivo
Posterior a esto, realizamos el commit asociado.  
Actualizar de/desde repositorios remotos
Ahora deseamos actualizar nuestro repositorio remoto con nuestro repositorio local, para lo cual debemos hacer un push con el nombre del repositorio remoto y el nombre del branch que por defecto si solo hay uno es master. Es posible configurar el push para que su acción sea la de enviar todos los branchs del repositorio pero es preferible un control más fino con el fin de reducir el trafico de datos en la red.
Step12:  Durante la ejecución del push se nos solicitará el usuario y contraseña de nuestra cuenta en el servicio git. Al usar el protocolo https por defecto tendremos 3600 segundos tras cada autenticación, o si lo preferimos podemos usar ssh y crear la llave de autenticación con el fin de tener acceso permanente en nuestro equipo privado sin requerir de la autenticación continua.  
Para la actualización de nuestro repositorio local con el repositorio remoto reaizamos una acción pull, tal cual se indico en la subsección anterior para actualizar el repositorio local con los archivos que posiblemente se crearon con el asistente del servicio git.  
Otras acciones
Se recomienda la lectura de otras acciones de git importantes, las cuales son
<ASSISTANT_TASK:>
Python Code:
%%bash
git --help
Explanation: Git es un sistema de manejo de versiones distribuido creado por Linus Torvalds.  
Los sistemas de manejo de versiones permiten tener un control detallado sobre el historial de cambios de un archivo o conjunto de archivos creando instantaneas de estos conjuntos cada que se presenta un cambio. Estos sistemas de control de versiones pueden ser centralizados (ejemplo subversion) o distribuidos (ejemplo git), acorde a si existe un repositorio principal donde se maneja el historial y desde el cual todos los demas repositorios extraen las versiones requeridas, o si todo el historial se distribuye en cada repositorio.  
Para el desarrollo de esta sesión se requiere la creación de cuenta en github o bitbucket.  
Instalación
Para la instalación de git use el siguiente procedimiento.
Windows
Si usa sistema operativo windows puede descargar los binarios del cliente de git for windows y durante la instalación usar la configuración recomendada.  
Ubuntu Linux
En su sistema linux, muy probablemente encontrará el cliente de comandos para instalar desde el repositorio de su distribución.  
sudo apt install git
Si desea realizar la autenticación por medio de SSH requiere instalar los paquetes adicionales a SSH, sin embargo se recomienda la autenticación por medio de HTTP para reducir el número de pasos requeridos, y cuando se desea trabajar en equipos de uso no habitual o que siendo de uso frecuente podría ser usado por un tercero. Igualmente, al usar autenticación por HTTP es posible conectarse a pesar de los bloqueos que por seguridad establecen las politicas de muchas entidades.  
Mac
En mac, puede usar igualmente a linux la instalación por binarios disponibles en la página oficial, git.  
Alternativas
Puede usar un cliente multiplataforma y gráfico de fácil instalación como gitkraken o github desktop (este último solo para windows o mac), sin embargo para fines de este curso se exigirá el manejo directo del cliente de comandos de git.  
Uso
Una vez instalado nuestro cliente git podemos consultar sus opciones y argumentos.
End of explanation
%%bash
git clone https://github.com/cosmoscalibur/herramientas_computacionales.git herramientas
Explanation: Configuración
Para una adecuada identificación de nuestros aportes en los repositorios, es necesario configurar nuestro nombre y correo en git.  
git config --global user.name "YOUR NAME"
git config --global user.email "YOUR EMAIL ADDRESS"
Creación de repositorios
Una vez creada la cuenta github, debe crear un repositorio git en ella y copiar la dirección de clonado, la cual se usa con el fin de obtener una copia del repositorio localmente.
End of explanation
%%bash
cd herramientas
ls -oha
Explanation: De esta forma crearemos una copia del repositorio git herramientas_computacionales en el directorio ./herramientas. Si no se indica el directorio, se crea un directorio nuevo en la posición actual.  
Tras el clonado, tenemos a disposición todo el directorio del repositorio, incluido el directorio .git que almacena la información del historial y repositorios (para este momento, heredada del repositorio clonado).
End of explanation
%%bash
cd herramientas
git remote -v
Explanation: Se evidencia que tras el clonado, tenemos configurados los repositorios remotos por defecto.
End of explanation
%%bash
cd herramientas
git init
Explanation: En caso de ser un repositorio nuevo o desear reinicializar (aceptar nuevas plantillas o mover el directorio), debemos crear el directorio .git y agregar los elementos que teniamos en nuestro directorio. Siempre que se agreguen (o se realiza cualquier actualización de los archivos y directorios, se sugiere realizar un commit para la indicación de la acción en nuestro historial).
End of explanation
%%bash
cd herramientas
git remote add pruebas https://github.com/cosmoscalibur/pruebas.git
git remote -v
Explanation: Repositorios remotos
Una vez se inicializa o se clona, podemos agregar nuestro reposotorio remoto, que previamente fue creado en github o bitbucket. Si solo se desea un uso local o si es justo el repositorio clonado no será necesario.
End of explanation
%%bash
cd herramientas
git remote rm origin
git remote -v
Explanation: Tambien es posible eliminar el acceso al servidor remoto, con git remote rm.
End of explanation
%%bash
cd herramientas
echo "linea 1" > probar_1
printf "s\n 5" > probar_2
Explanation: Objetos y referencias
A continuación, y para evitar posibles conflictos de los archivos, es recomendable iniciar con un fetch o pull para obtener los objetos y referencias del repositorio remoto (esto si creamos el repositorio con los archivos de licencia y README.md que nos invita a crear el servicio git), y hacer la unión del contenido existente en el remoto con el local justo en el local.  
git pull pruebas master
El paso anterior se evita si solo usamos el servicio para la creación del repositorio remoto vacio en lugar de poblarlo con los asistentes de archivo de licencia y archivo de descripción. Si en el paso anterior los archivos del repositorio remoto y el local poseen los mismos nombres pero son diferentes, pueden existir conflictos que deban resolverse de forma manual.  
Crearemos archivos de prueba la adición al repositorio.
End of explanation
%%bash
cd herramientas
git status
Explanation: Aunque en este caso es claro que nuestros archivos no se encuentran agregados al repositorio, consultaremos por el estado de los archivos frente a su registro en el repositorio.
End of explanation
%%bash
cd herramientas
git add . # Con la indicación "." agrega todo.
git commit -m "Agregados archivos de prueba 1 y 2."
Explanation: Ahora agregamos al registro los archivos de nuestro repositorio local.
End of explanation
%%bash
cd herramientas
echo "linea 2" >> probar_1
printf "otro\narchivo\npara probar." > probar_3
git add probar_1 probar_3
git commit -m "Actualizado prueba 1 y agregado prueba 3."
Explanation: Realizaremos una modificación en uno de los archivos y agregaremos directamente a este.
End of explanation
%%bash
cd herramientas
git push pruebas master
Explanation: Es posible indicar directamente a git la eliminación de archivos mediante
git rm archivo
o tambien al eliminar el archivo de manera directa, se incluye en git
git add -A
con el fin de actualizar el arbol de archivos y rastrear incluso los archivos eliminados. Sin embargo, es recomendable que la adición y remoción de archivos sea lo más especifica posible con el fin de tener un registro descriptivo que ayude a la adecuada solución de problemas o la descripción de cambios de una versión a otro de los códigos. Tengase en cuenta que en el caso de directorios, debe indicarse el argumento recursivo para el borrado.  
Si se desea eliminar un archivo del repositorio pero no del disco, debe eliminarse de la cache del repositorio.  
git rm --cached archivo
Posterior a esto, realizamos el commit asociado.  
Actualizar de/desde repositorios remotos
Ahora deseamos actualizar nuestro repositorio remoto con nuestro repositorio local, para lo cual debemos hacer un push con el nombre del repositorio remoto y el nombre del branch que por defecto si solo hay uno es master. Es posible configurar el push para que su acción sea la de enviar todos los branchs del repositorio pero es preferible un control más fino con el fin de reducir el trafico de datos en la red.
End of explanation
%%bash
cd herramientas
git log --oneline
%%bash
cd herramientas
git show d193ae6
%%bash
cd herramientas
echo "Actual"
ls
git checkout e4a4be5
echo "Anterior"
ls
git checkout master
%%bash
cd herramientas
echo "Actual"
cat probar_1
git checkout d193ae6 probar_1
echo "Anterior"
cat probar_1
git checkout HEAD probar_1
Explanation: Durante la ejecución del push se nos solicitará el usuario y contraseña de nuestra cuenta en el servicio git. Al usar el protocolo https por defecto tendremos 3600 segundos tras cada autenticación, o si lo preferimos podemos usar ssh y crear la llave de autenticación con el fin de tener acceso permanente en nuestro equipo privado sin requerir de la autenticación continua.  
Para la actualización de nuestro repositorio local con el repositorio remoto reaizamos una acción pull, tal cual se indico en la subsección anterior para actualizar el repositorio local con los archivos que posiblemente se crearon con el asistente del servicio git.  
Otras acciones
Se recomienda la lectura de otras acciones de git importantes, las cuales son: branch y merge para experimentar con modificaciones de un código base y su posterior unión al original, o log, show para la visualización del historial de modificaciones.
Si particularmente queremos ver el estado del repositorio en un commit especifico, usamos checkout seguido del commit. Esta acción no genera ninguna modificación del repositorio y para continuar en el último estadosolo debemos volver a nuestro estado actual realizando el checkout al master. Si deseamos conservar este estado consultado realizamos una reversión al commit dado con reverse.
Si la acción anterior se realiza sobre un archivo, los cambios deben deshacerse con checkout a HEAD seguido del archivo, de lo contrario el estado del archivo consultado estará como una modificación.
Igualmente existen acciones de interes en caso de usar los servicios git como la acción del fork que hace uso de la solicitud de pull (acciones no incluidas en git pero que pueden ser usadas con clientes basados en las API de los servicios git).
Es posible tener submodules para lo cual git ofrece la utilidad submodule para su gestión.
End of explanation
<END_TASK>