En lugar de una introducción
¡Hola! Hoy vamos a hablar sobre un sistema de control de versiones, a saber, Git.
Conceptos básicos de Git
Git es un sistema de control de versiones distribuido para nuestro código. ¿Por qué lo necesitamos? Los equipos distribuidos necesitan algún tipo de sistema para administrar su trabajo. Es necesario para realizar un seguimiento de los cambios que se producen a lo largo del tiempo. Es decir, necesitamos poder ver paso a paso qué archivos han cambiado y cómo. Esto es especialmente importante cuando investiga qué cambió en el contexto de una sola tarea, lo que hace posible revertir los cambios.Instalando Git
Instalemos Java en su computadora.Instalación en Windows
Como de costumbre, debe descargar y ejecutar un archivo exe. Aquí todo es simple: haga clic en el primer enlace de Google , realice la instalación y listo. Para ello, utilizaremos la consola bash que nos proporciona Windows. En Windows, debe ejecutar Git Bash. Así es como se ve en el menú Inicio:

Instalación en Linux
Por lo general, Git es parte de las distribuciones de Linux y ya está instalado, ya que es una herramienta que se escribió originalmente para el desarrollo del kernel de Linux. Pero hay situaciones en las que no lo es. Para verificar, debe abrir una terminal y escribir: git --version. Si obtiene una respuesta inteligible, entonces no es necesario instalar nada. Abra una terminal e instale Git en Ubuntu . Estoy trabajando en Ubuntu, así que puedo decirte qué escribir para él: sudo apt-get install git.Instalación en macOS
Aquí también, primero debe verificar si Git ya está allí. Si no lo tiene, la forma más fácil de obtenerlo es descargar la última versión aquí . Si Xcode está instalado, Git definitivamente se instalará automáticamente.Configuración de Git
Git tiene configuraciones de usuario para el usuario que enviará el trabajo. Esto tiene sentido y es necesario, porque Git toma esta información para el campo Autor cuando se crea una confirmación. Configure un nombre de usuario y una contraseña para todos sus proyectos ejecutando los siguientes comandos:
git config --global user.name "Ivan Ivanov"
git config --global user.email ivan.ivanov@gmail.com
Si necesita cambiar el autor de un proyecto específico, puede eliminar "--global". Esto nos dará lo siguiente:
git config user.name "Ivan Ivanov"
git config user.email ivan.ivanov@gmail.com
Un poco de teoría...
Para profundizar en el tema, debemos presentarle algunas palabras y acciones nuevas...- repositorio git
- comprometerse
- rama
- unir
- conflictos
- jalar
- empujar
- cómo ignorar algunos archivos (.gitignore)
Estados en Git
Git tiene varias estatuas que deben entenderse y recordarse:- sin seguimiento
- modificado
- escenificado
- comprometido
¿Cómo debes entender esto?
Estos son los estados que se aplican a los archivos que contienen nuestro código:- Un archivo que se crea pero aún no se agrega al repositorio tiene el estado "sin seguimiento".
- Cuando realizamos cambios en archivos que ya se han agregado al repositorio de Git, su estado es "modificado".
- Entre los archivos que hemos cambiado, seleccionamos los que necesitamos, y estas clases se cambian al estado "por etapas".
- Se crea una confirmación a partir de archivos preparados en el estado provisional y va al repositorio de Git. Después de eso, no hay archivos con el estado "preparado". Pero todavía puede haber archivos cuyo estado sea "modificado".

¿Qué es un compromiso?
Una confirmación es el evento principal cuando se trata de control de versiones. Contiene todos los cambios realizados desde que comenzó la confirmación. Las confirmaciones están vinculadas entre sí como una lista vinculada individualmente. Más específicamente: hay un primer compromiso. Cuando se crea la segunda confirmación, sabe lo que viene después de la primera. Y de esta manera, la información puede ser rastreada. Un compromiso también tiene su propia información, los llamados metadatos:- el identificador único del compromiso, que se puede usar para encontrarlo
- el nombre del autor de la confirmación, quien la creó
- la fecha en que se creó la confirmación
- un comentario que describe lo que se hizo durante la confirmación

¿Qué es una sucursal?
Una rama es un puntero a algún compromiso. Debido a que una confirmación sabe qué confirmación la precede, cuando una rama apunta a una confirmación, todas las confirmaciones anteriores también se aplican a ella. En consecuencia, podríamos decir que puedes tener tantas ramas como quieras apuntando al mismo compromiso. El trabajo ocurre en ramas, por lo que cuando se crea una nueva confirmación, la rama mueve su puntero a la confirmación más reciente.Comenzando con Git
Puede trabajar solo con un repositorio local y también con uno remoto. Para practicar los comandos requeridos, puede limitarse al repositorio local. Solo almacena toda la información del proyecto localmente en la carpeta .git. Si estamos hablando del repositorio remoto, toda la información se almacena en algún lugar del servidor remoto: solo se almacena localmente una copia del proyecto. Los cambios realizados en su copia local se pueden enviar (git push) al repositorio remoto. En nuestra discusión aquí y más abajo, estamos hablando de trabajar con Git en la consola. Por supuesto, puede usar algún tipo de solución basada en GUI (por ejemplo, IntelliJ IDEA), pero primero debe averiguar qué comandos se están ejecutando y qué significan.Trabajar con Git en un repositorio local
A continuación, le sugiero que siga y realice todos los pasos que hice mientras leía el artículo. Esto mejorará su comprensión y dominio del material. Bueno, ¡buen provecho! :) Para crear un repositorio local, debe escribir:
git init

git status

- git add -A: agrega todos los archivos al estado "preparado"
- agrega git — agregar todos los archivos de esta carpeta y todas las subcarpetas. Esencialmente, esto es lo mismo que el anterior.
- git add <nombre de archivo>: agrega un archivo específico. Aquí puede usar expresiones regulares para agregar archivos de acuerdo con algún patrón. Por ejemplo, git add *.java: esto significa que solo desea agregar archivos con la extensión java.
git add *.txt
Para verificar el estado, usamos el comando que ya conocemos:
git status

git commit -m "all txt files were added to the project"

git log

git status

git status

git diff

git add test_resource.txt
git commit -m "added hello word! to test_resource.txt"
Para ver todas las confirmaciones, escribe:
git log

git add GitTest.java
git commit -m "added GitTest.java"
git status

Trabajando con .gitignore
Claramente, solo queremos mantener el código fuente solo, y nada más, en el repositorio. Entonces, ¿qué más podría haber? Como mínimo, clases compiladas y/o archivos generados por entornos de desarrollo. Para decirle a Git que los ignore, necesitamos crear un archivo especial. Haga esto: cree un archivo llamado .gitignore en la raíz del proyecto. Cada línea en este archivo representa un patrón para ignorar. En este ejemplo, el archivo .gitignore se verá así:
```
*.class
target/
*.iml
.idea/
```
Vamos a ver:
- La primera línea es ignorar todos los archivos con la extensión .class
- La segunda línea es ignorar la carpeta "objetivo" y todo lo que contiene
- La tercera línea es ignorar todos los archivos con la extensión .iml
- La cuarta línea es ignorar la carpeta .idea
git status


git add .gitignore
git commit -m "added .gitignore file"
Y ahora el momento de la verdad: tenemos una clase compilada GitTest.class que está "sin seguimiento", que no queríamos agregar al repositorio de Git. Ahora deberíamos ver los efectos del archivo .gitignore:
git status

Trabajando con ramas y tal
Naturalmente, trabajar en una sola rama es un inconveniente para los desarrolladores solitarios y es imposible cuando hay más de una persona en un equipo. Por eso tenemos sucursales. Como dije antes, una rama es solo un puntero móvil para confirmaciones. En esta parte, exploraremos cómo trabajar en diferentes ramas: cómo fusionar cambios de una rama a otra, qué conflictos pueden surgir y mucho más. Para ver una lista de todas las sucursales en el repositorio y comprender en cuál se encuentra, debe escribir:
git branch -a

- crear una nueva sucursal basada en la que estamos (99% de los casos)
- crear una rama basada en una confirmación específica (1% de los casos)
Vamos a crear una rama basada en una confirmación específica
Confiaremos en el identificador único de la confirmación. Para encontrarlo, escribimos:
git log

git checkout -b development 6c44e53d06228f888f2f454d3cb8c1c976dd73f8
Se crea una rama con solo las dos primeras confirmaciones de la rama principal. Para verificar esto, primero nos aseguramos de cambiar a una rama diferente y observamos la cantidad de confirmaciones allí:
git status
git log

git branch -a

Vamos a crear una rama basada en la actual
La segunda forma de crear una rama es crearla a partir de otra. Quiero crear una rama basada en la rama maestra. Primero, necesito cambiarlo, y el siguiente paso es crear uno nuevo. Vamos a ver:- git checkout master: cambie a la rama maestra
- estado de git: verifica que realmente estamos en la rama principal

git checkout -b feature/update-txt-files

La resolución de conflictos
Antes de explorar qué es un conflicto, debemos hablar sobre fusionar una rama con otra. Esta imagen muestra el proceso de fusionar una rama con otra:

git add *.txt
git commit -m "updated txt files"
git log

git checkout master
git merge feature/update-txt-files
git log

git branch -D feature/update-txt-files
Todo está claro hasta ahora, ¿sí? Compliquemos la situación: ahora digamos que necesita cambiar el archivo txt nuevamente. Pero ahora este archivo también se cambiará en la rama maestra. En otras palabras, cambiará en paralelo. Git no podrá averiguar qué hacer cuando queramos fusionar nuestro nuevo código en la rama maestra. ¡Vamos! Crearemos una nueva rama basada en el maestro, haremos cambios en text_resource.txt y crearemos una confirmación para este trabajo:
git checkout -b feature/add-header
... we make changes to the file

git add *.txt
git commit -m "added header to txt"

git checkout master
… we updated test_resource.txt

git add test_resource.txt
git commit -m "added master header to txt"
Y ahora el punto más interesante: necesitamos fusionar los cambios de la rama característica/agregar encabezado a maestro. Estamos en la rama maestra, por lo que solo necesitamos escribir:
git merge feature/add-header
Pero el resultado será un conflicto en el archivo test_resource.txt: 

- Los cambios que estaban en esta línea en la rama maestra se encuentran entre "<<<<<<< HEAD" y "=======".
- Los cambios que estaban en la rama característica/agregar encabezado se encuentran entre "=======" y ">>>>>>> característica/agregar encabezado".

git status

git add *.txt

git commit

Trabajando con repositorios remotos
El último paso es descubrir algunos comandos más que se necesitan para trabajar con el repositorio remoto. Como dije, un repositorio remoto es un lugar donde se almacena el repositorio y desde el cual puedes clonarlo. ¿Qué tipo de repositorios remotos existen? Ejemplos:-
GitHub es la mayor plataforma de almacenamiento para repositorios y desarrollo colaborativo. Ya lo he descrito en artículos anteriores.
Sígueme en GitHub . A menudo muestro mi trabajo allí en aquellas áreas que estoy estudiando para trabajar. -
GitLab es una herramienta basada en web para el ciclo de vida de DevOps con código abierto . Es un sistema basado en Git para administrar repositorios de código con su propio wiki, sistema de seguimiento de errores , canalización de CI/CD y otras funciones.
Tras la noticia de que Microsoft compró GitHub, algunos desarrolladores duplicaron sus proyectos en GitLab. -
BitBucket es un servicio web para alojamiento de proyectos y desarrollo colaborativo basado en los sistemas de control de versiones Mercurial y Git. Hubo un tiempo en que tenía una gran ventaja sobre GitHub, ya que ofrecía repositorios privados gratuitos. El año pasado, GitHub también presentó esta capacidad para todos de forma gratuita.
-
Etcétera…
git clone https://github.com/romankh3/git-demo
Ahora hay una copia local completa del proyecto. Para asegurarse de que la copia local del proyecto sea la más reciente, debe extraer el proyecto escribiendo:
git pull


git add test_resource.txt
git commit -m "prepared txt for pushing"
El comando para enviar esto al repositorio remoto es:
git push

Enlace útil
- Documentación oficial de Git . Lo recomiendo como referencia.
GO TO FULL VERSION