Uso básico Git en Visual Studio

A raíz de mi anterior post, me gustaría tratar el uso de Git en el IDE que más utilizo como desarrollador .NET: Visual Studio. Suelo recomendar el uso de un IDE para trabajar con Git, no sin antes haber entendido los conceptos que subyacen en las acciones que realiza el IDE (comentados en mi anterior post).

Visual Studio proporciona una serie de herramientas para poder gestionar repositorios Git. No considero que sea una herramienta que proporcione todas las capacidades que ofrece Git (como podría ser GitExtensions o SourceTree, pero para un uso cotidiano de Git es más que suficiente.

Para los ejemplos, utilizaré Visual Studio 2019.

Preparando entorno

Como vimos anteriormente, existen dos formas para iniciar un repositorio:

Init - Tras crear un proyecto nuevo, tendremos la opción de añadirlo al control de versiones “Add to Source Control”. Tras seleccionar que queremos usar Git, Visual Studio generará todo lo necesario para tener el repositorio creado con la rama master por defecto.

Comando init aplicado desde visual studio
Estado final tras iniciar un repositorio

Clone - En caso de querer clonar un repositorio existente, simplemente tendremos que seleccionar la opción de “Manage Connections” y pulsar en la opción “Clone”. En el primer input, introduciremos el repositorio remoto. En el segundo input, dónde queremos crear en local el repositorio.

Clonación de un repositorio existente

Iniciando desarrollo

De nuevo, siguiendo las acciones descritas en el post anterior: Status - El estado lo tenemos siempre presente desde Visual Studio, en la barra inferior de la aplicación. De izquierda a derecha, los iconos inferiores indican: commits pendientes de realizar push, cambios pendientes que no se han llevado a un commit, repositorio actual y rama actual.

Barra inferior del Visual Studio

Branch -a - El listado de ramas la podemos obtener desde la opción “Branches”, accesible desde la “Home”.

Team Explorer - Branches

Branch [branch name] - Para crear una nueva rama, desde la vista anterior seleccionamos la opción “New Branch”. En el primer input introduciremos el nombre de la nueva rama, mientras que en el segundo input seleccionaremos la rama de la cual se va a obtener la rama. El checkbox nos indicará si queremos movernos a la nueva rama tras su creación.

Branches - formulario para crear una nueva rama

Checkout - Desde la vista de “Branches” hacemos doble click a la rama que queremos cambiar. Se marcará en negro la rama en la cual estés actualmente.

Haciendo doble click cambia a la rama dev

Actualizar rama

Stash - Accedemos desde la “Home”, en “Changes” para entrar a la gestión de los cambios en la rama. Una vez dentro, veremos la opción de “stash”. Prodecemos a apilar todo, lo que generará un elemento en la pila y no tener cambios pendientes.

Acceso a "Changes"


Apilando cambios
Cambios apilados. No quedan cambios pendientes

Fetch - Para ver los cambios que ha sufrido nuestra rama en el repositorio remoto, desde el “Team Explorer - Home” pulsamos en el botón “Sync” y nos llevará a las opciones de sincronización. Pulsamos en “Fetch” y nos traerá los commits que no tengamos en nuestro local.

Opción "Sync"
Acción "Fetch"

Pull - Una vez realizado el fetch, pulsando sobre “Pull” bajará los cambios en nuestra rama local.

Acción "Pull"

Stash pop - Teniendo el contenido anteriormente mencionado apilado, procedemos a desapilarlo con la opción “Pop”, seleccionando con el botón derecho en el elemento a desapilar. Dependiendo nuestra necesidad, elegiremos dejarlo o no en el stage. En nuestro caso, no será necesario.

Opciones para desapilar
No queda nada en la pila. Se restauran los cambios pendientes

Subir cambios

Add - Seleccionamos los ficheros que queremos insertar en el stage. Con botón derecho sobre los mismos, nos aparecerá la opción de “Stage”. Lo que quede dentro del stage serán los ficheros que se empaquetarán en el commit que se cree. El resto, quedarán fuera del commit.

Opción "Stage"
Sección "Staged Changes"

Commit - Hilando con el comando anterior, rellenando el input con el mensaje que queramos reflejar, tendremos el commit creado pulsando “Commit Staged”. Como indica el comentario, sólo se hará commit de los ficheros que estén bajo “Staged Changes”. En caso de no haber creado “Staged Changes”, se realizaría commit de todos los cambios que se hubiesen realizado en la rama.

Acción "Commit Staged"
Listado de commits pendientes de realizar push

Push - Por último, en la parte superior del listado de commits, tenemos la opción de realizar el “Push”. Esto realizará la sincronización de los cambios locales al repositorio remoto.

Acción "Push"

Finalizando desarrollo

Merge - Para realizar un merge entre dos ramas, desde la sección de “Branches” tendremos la opción de “Merge”. Una vez pulsada, nos preseleccionará la rama actual como rama destino del merge que se realice. En “Merge from branch” seleccionaremos la rama “dev”. En este caso, dado que estamos en master, el merge se hará de dev a master. Con la opción “Commit changes after merging”, en caso de no haber conflictos, se realizará un commit con el merge automático.

Acción "Merge"

Conclusiones

Los IDEs se contruyeron para ayudar en el desarrollo software, pero como programadores nuestro deber va más hayá del mero uso. Tenemos que ser conscientes y capaces de saber qué está realizando por detrás y sus consecuencias. De nuevo, en este post he tratado de resumir los comandos más usados en mi día a día, habiendo mucho más recorrido por explorar en la propia herramienta de Visual Studio. Cualquier duda o sugerencia, estoy disponible en mis redes sociales :)