Original article: Learn the Basics of Git in Under 10 Minutes

Sí, el título es un clickbait. No hay forma de que puedas comprender los conceptos básicos de la tecnología git en solo 10 minutos. Pero puedes acercarte bastante en unos 25 minutos. Y ese es el propósito de este artículo.

Si deseas comenzar a aprender sobre la tecnología Git, has venido al lugar correcto. Esta es una guía completa para principiantes de Git. Hay muchos clientes para Git. La tecnología es la misma sin importar el cliente. Pero en esta guía usaremos GitHub para entender Git.

¡Empecemos!

¿Qué es el control de versiones?

El control de versiones es un sistema que registra los cambios en un archivo o conjunto de archivos a lo largo del tiempo para que pueda recuperar versiones específicas más adelante. Es decir que, idealmente; podemos colocar cualquier archivo en la computadora en el control de versiones.

En teoría esto está bien... ¿Pero por qué habríamos de hacer eso?

Este es el por qué:

Un Sistema de control de versiones (VCS en inglés) nos permite revertir los archivos a un estado anterior, revertir todo el proyecto a un estado anterior, revisar los cambios realizados a lo largo del tiempo, ver quién modificó por última vez algo que podría estar causando un problema, quién introdujo un problema y cuando, y más. El uso de un VCS también significa que si por descuido arruinamos las cosas o perdemos nuestros archivos, generalmente podemos recuperarlos fácilmente. Y a veces solo quieres saber “quién escribió esta porquería”. ¿y tener acceso a esa información vale la pena?.

Entonces, ¿qué es Git?

Git es un sistema de control de versiones para rastrear cambios en archivos de computadora y coordinar el trabajo en esos archivos entre varias personas. Git es un sistema de control de versiones distribuido. Git no depende necesariamente de un servidor central para almacenar todas las versiones de los archivos de un proyecto. En cambio, cada usuario “clona” una copia de un repositorio (una colección de archivos) y tiene el historial completo del proyecto en su propio disco duro. Este clon tiene todos los metadatos del original, mientras que el original en sí se almacena en un servidor autohospedado o en un servicio de alojamiento de terceros como GitHub.

Git te ayuda a realizar un seguimiento de los cambios que realizas en tu código. Es básicamente la pestaña de historial para tu editor de código (¿sin modo de incógnito?). Si en algún momento durante la codificación te encuentras con un error fatal y no sabes qué lo está causando, siempre puedes volver al estado estable. Por lo tanto, es muy útil para la depuración. O simplemente puede ver qué cambios realizó en su código a lo largo del tiempo.

image
Una versión simple del historial de un archivo.

En el ejemplo anterior, las tres "tarjetas" representan diferentes versiones del mismo archivo. Podemos seleccionar qué versión del archivo queremos usar en cualquier momento. Entonces puedo saltar de un lado a otro a cualquier versión del archivo en el continuo de tiempo de git.

Git también te ayuda a sincronizar código entre varias personas. Así que imagina que tú y tu amigo están colaborando en un proyecto. Ambos están trabajando en los mismos archivos de proyecto. Git toma esos cambios que tú y su amigo hicieron de forma independiente y los fusiona en un solo repositorio "maestro" (Master). Entonces, al usar Git, puedes asegurarse de que ambos estén trabajando en la versión más reciente del repositorio. Por lo tanto, no tienes que preocuparte por enviar tus archivos por correo y trabajar con una cantidad ridícula de copias del archivo original. ¿Y colaborar a larga distancia se vuelve tan fácil como HTML?.

Flujo de trabajo Git:

Antes de comenzar a trabajar con los comandos de Git, es necesario que comprendas lo que representa.

¿Qué es un Repositorio?

Un repositorio, también conocido como repositorio, no es más que una colección de código fuente.

Hay cuatro elementos fundamentales en el flujo de trabajo de Git.

1.Directorio de trabajo.

2.Área de ensayo.

3.Repositorio local.

4.Repositorio remoto.

image-1
Diagrama de un flujo de trabajo Git simple

Si consideras un archivo en su Directorio de trabajo, puedes estar en tres estados posibles.

  1. Puede ser escenificado. Lo que significa que los archivos con los cambios actualizados están marcados para ser confirmados en el repositorio local pero aún no confirmados.
  2. Se puede modificar. Lo que significa que los archivos con los cambios actualizados aún no están almacenados en el repositorio local.
  3. Se puede consolidar (commit). Lo que significa que los cambios que realizó en su archivo se almacenan de forma segura en el repositorio local.
  • git add es un comando que se usa para agregar un archivo que está en el directorio de trabajo al área de preparación.
  • git commit es un comando que se usa para agregar todos los archivos que están almacenados en el repositorio local.
  • git push es un comando que se usa para agregar todos los archivos comprometidos en el repositorio local al repositorio remoto. Entonces, en el repositorio remoto, todos los archivos y cambios serán visibles para cualquier persona con acceso al repositorio remoto.
  • git fetch es un comando que se usa para obtener archivos del repositorio remoto al repositorio local, pero no al directorio de trabajo.
  • git merge es un comando que se usa para obtener los archivos del repositorio local en el directorio de trabajo.
  • git pull Este comando se usa para obtener archivos del repositorio remoto directamente en el directorio de trabajo. es equivalente a un git fetch y un git merge .

Ahora que sabemos qué es Git y sus terminologías básicas, veamos cómo podemos colocar un archivo en git. Lo haremos de la manera correcta y de la manera difícil. Sin ninguna aplicación GUI.

Supongo que ya tienes un archivo que deseas colocar bajo el control de versiones. Si no, cree una carpeta de muestra llamada 'MuskCult' y coloques algunos archivos de código de muestra en ella.

Paso 0: Crea una cuenta de GitHub

Si aún no tienes una cuenta, puedes crear una aquí.

Paso 1: Asegúrate de tener installado Git en tu equipo

Si estás en una Mac, enciende la terminal e ingresa el siguiente comando:

$ git --version

Esto te pedirá que abras un instalador si aún no tienes git. Así que configúralo usando el instalador. Si ya tienes git, solo te mostrará qué versión de git tienes instalada.

Si estás usando Linux(deb), escribe lo siguiente en la terminal:

$ sudo apt install git-all

Si estás en Windows:

winget install --id Git.Git -e --source winget

Paso 2: Dile a Git quien eres

Preséntate. En serio, menciona tu nombre de usuario y dirección de correo electrónico de Git, ya que en cada confirmación de Git se utilizará esta información para identificarte como el autor.

$ git config --global user.name "YOUR_USERNAME"

$ git config --global user.email "im_satoshi@musk.com"

$ git config --global --list # To check the info you just provided
1*JbyUdhLMEdglRxQk6PH7Vg

Paso 3: Genera/comprueba tu equipo en busca de claves SSH existentes. (Opcional)

¿Porque preguntas? Con el protocolo SSH, puede conectarse y autenticarse en servidores y servicios remotos. Con las claves SSH, puede conectarse a GitHub sin proporcionar su nombre de usuario o contraseña en cada visita.

Sigue este link para aprender más acerca de SSH.
Visita aquí para verificar si tienes una clave SSH existente.
Ve aquí para generar una clave SSH.
Ve aquí para añadir la clave SSH a tu cuenta de GitHub.
Finalmente aquí puedes comprobar la conección.

Si configuraste SSH, cada comando de git que tiene un enlace lo reemplazará por:

Instead of : https://github.com/username/reponame

You use    : git@github.com:username/reponame.git

           Note : You can use both ways alternatively

Usaré el protocolo SSH en este tutorial.

Paso 4: Hagamos Git

Crear un nuevo repositorio en GitHub. Sigue este link.
Ahora, ubica la carpeta que deseas colocar debajo de git en su terminal.

$ cd Desktop/MuskCult

Inicia Git:

Y para colocar la carpeta debajo de git, ingresa:

$ touch README.md    # To create a README file for the repository
$ git init           # Initiates an empty git repository
1*Q_DUXRghgFQb9F47mUB6LQ

Cómo editar el archivo README.md para proporcionar información acerca del repositorio.

Agrega archivos al área de preparación para la confirmación:

Ahora, para agregar los archivos al repositorio de git el commit:

$ git add .  
# Adds all the files in the local repository and stages them for commit

OR if you want to add a specific file

$ git add README.md 
# To add a specific file

Antes del commit, veamos qué archivos se preparan:

$ git status # Lists all new or modified files to be committed
image-2

Confirma los cambios que realizaste en tu Git Repo:
Ahora para confirmar los archivos que agregó a su repositorio de git:

$ git commit -m "First commit"
# The message in the " " is given so that the other users can read the message and see what changes you made
1*LoUwFy29RkgCS7hCajd_3g

Anula la confirmación de los cambios que acaba de realizar en su Git Repo:

Ahora supongamos que que acabamos de cometer algún error en el código o colocamos un archivo no deseado dentro del repositorio. Este archivo no deseado puede desorganizar los archivos que acabamos de agregar, por lo tanto usamos:

$ git reset HEAD~1
# Remove the most recent commit
# Commit again!
1*rxOX_U-ZRmGfhgIhNWlDIQ

Añadiendo un origen remoto y un Git Push:

Ahora cada vez que tú hagas cambios en los archivos y los guardes, no será automáticamente actualizado en GitHub. Todos los cambios que hicimos en el archivo se actualizan en el repositorio local. Ahora para actualizar los cambios en el repositorio maestro:

$ git remote add origin remote_repository_URL
# sets the new remote

El comando git remote nos permite crear, ver y eliminar conexiones a otros repositorios.

$ git remote -v
# List the remote connections you have to other repositories.

El comando git remote -v enumera las URL de las conexiones remotas que tiene con otros repositorios.

$ git push -u origin master # pushes changes to origin

Ahora, el comando git push traslada los cambios en su repositorio local hasta el repositorio remoto que especificó como origen.

1*w-nfopsKIks_JRzFe5D8xA

Y ahora, si vamos y revisamos nuestra página de repositorio en GitHub, debería verse así:

image-3

Y eso es. Acabas de agregar los archivos al repositorio que acabas de crear en GitHub.

Observa los cambios que realizaste en tu archivo:

Una vez que empieces a hacer cambios en tus archivos y los guardes, el archivo no coincidirá con la última versión que se comprometió con git. Para ver los cambios que acabas de hacer:

Has hecho lo siguiente:

$ git diff # To show the files changes not yet staged
1*xym1QvvvWorfoyGMXv28Yg

Vuelve a la última versión comprometida con Git Repo:

Ahora puedes optar por volver a la última versión confirmada ingresando:

$ git checkout .

OR for a specific file

$ git checkout -- <filename>
1*HYgYkfo3W4MUA8CJl12rXg

Ver historial de commits:

Puedes emplear el comando git log para observar el historial de commits que has hecho en tus archivos.

$ git log
1*9w7uBJcQMxc708DBw8Sewg

Cada vez que realiza cambios que desea que se reflejen en GitHub, los siguientes son los flujos de comandos más comunes:

$ git add .
$ git status # Lists all new or modified files to be committed
$ git commit -m "Second commit"
$ git push -u origin master
1*rWBJnBdF1V8YO_mi-jEfxA

Ahora, si vamos y vemos nuestro repositorio, podemos identificar si la confirmación fue exitosa mirando el mensaje de confirmación para cada archivo.

1*QHM8m5HGavHkdzPz06UWGw

Paso 5 : Eso está muy bien... Pero, ¿cómo descargo y trabajo en otros repositorios en GitHub?

Clonando un Repo de Git:

Localiza el directorio en el que deseas clonar el repositorio. Copia el enlace del repositorio que deseas e ingresa lo siguiente:

$ git clone remote_repository_URL

Siéntete libre de seguir adelante y clonar el repositorio que creé arriba usando: https://github.com/Gothamv/MuskCult

1*6NACk8-IiBjbauM-k-aesQ

Empujar cambios al Git Repo:

Ahora puedes trabajar en los archivos que deseas y comprometerte con los cambios localmente. Si deseas enviar cambios a ese repositorio, debes agregarte como colaborador para el repositorio o bien, debes crear algo conocido como solicitud de extracción. Observa cómo hacer uno aquí y envíame una solicitud de extracción con tu archivo de código.

Colaborando:

Así que imagina que tú y tu amigo están colaborando en un proyecto. Ambos están trabajando en los mismos archivos de proyecto. Cada vez que realizas algunos cambios y los inserta en el repositorio maestro, tu amigo tiene que extraer los cambios que insertaste en el repositorio de git.

Es decir, para asegurarse de que está trabajando en la última versión del repositorio de git cada vez que comienzas a trabajar, un comando de extracción de git es el camino a seguir.
Ahora a continuación hay un ejemplo de un proyecto en el que mi amigo y yo estamos colaborando:

1*2-tl2rHsgPqiv88aI55CPw
There has just been a commit on the repo

Entonces, para asegurarme de que esos cambios se reflejen en mi copia local del repositorio:

$ git pull origin master
1*ySDKu2OEdkc26yOUp-TJJQ

Aquí hay dos comandos git más útiles:

$ git fetch
    AND
$ git merge

En los términos más simples, git fetch seguido de un git merge equivale a un git pull. Pero entonces... ¿Porqué existe?

Cuando usas git pull, Git intenta hacer tu trabajo automáticamente. Es sensible al contexto, por lo que Git fusionará cualquier confirmación extraída en la rama en la que estás trabajando actualmente. git pull fusiona automáticamente las confirmaciones sin permitirle revisarlas primero.

Cuando aplicas git fetch, Git recopila todas las confirmaciones de la rama de destino que no existen en tu rama actual y las almacena en tu repositorio local. Sin embargo, no los fusiona con su rama actual. Esto es particularmente útil si necesita mantener su repositorio actualizado, pero está trabajando en algo que podría fallar si actualiza sus archivos. Para integrar las confirmaciones en su rama maestra, usa git merge.

Un detalle más:

.gitignore

¿Qué es esto?

.gitignore le dice a git qué archivos (o patrones) debe ignorar. Por lo general, se usa para evitar enviar archivos transitorios de su directorio de trabajo que no son útiles para otros colaboradores, como productos de compilación, archivos temporales creados por IDE, etc.

1*3NFtOjfz0NvNSwba7YCmDA

Entonces, en el ejemplo anterior, el sistema usa archivos como pycache, .DS_Store para almacenar información para un acceso más rápido. Esto no es útil para otros colaboradores. Entonces podemos decirle a git que los ignore agregando un archivo .gitignore .

Usa el comando touch para crear el archivo  .gitignore :

$ touch .gitignore

Y puede agregar los siguientes patrones para decirle a git que ignore dichos archivos.

/*.cmake
/*.DS_Store
/.user
/build
etc. depending upon the files you want git to untrack

Y eso es todo por lo básico. Estén atentos a la Parte 2, que se centrará en Branch, Merge, Stash, Rebase, etc.