En lugar de una introducción
Hola futuro ingeniero de software senior.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 de gestión del trabajo. Necesario para realizar un seguimiento de los cambios que se producen a lo largo del tiempo. Es decir, paso a paso vemos qué archivos han cambiado y cómo. Esto es especialmente importante cuando analizas lo que se hizo dentro de una tarea: esto hace posible retroceder. Imaginemos una situación: había un código que funcionaba, todo estaba bien en él, pero decidimos mejorar algo, modificarlo aquí, modificarlo allá. Todo estaba bien, pero esta mejora rompía la mitad de la funcionalidad e imposibilitaba el trabajo. Entonces, ¿qué sigue? Sin el Gita, uno tendría que sentarse durante horas y recordar cómo era todo originalmente. Y entonces simplemente volvemos al compromiso y eso es todo. ¿O qué pasa si hay dos desarrolladores realizando cambios en el código al mismo tiempo? Sin Git se ve así: copiaron el código del original e hicieron lo que tenían que hacer. Llega el momento y ambos quieren agregar sus cambios a la carpeta principal. ¿Y qué hacer en esta situación?... Ni siquiera me atrevo a estimar el tiempo para realizar este trabajo. No habrá ningún problema de este tipo si usas Git.Instalación de Git
Instalemos Git en tu computadora. Entiendo que cada uno tiene un sistema operativo diferente, por lo que intentaré describir varios casos.Instalación para Windows
Como de costumbre, debe descargar el archivo exe y ejecutarlo. Aquí todo es sencillo: haz clic en el primer enlace de Google , instala y listo. Para trabajar usaremos la consola bash que nos proporcionan. Para trabajar en Windows, necesita ejecutar Git Bash. Así es como se ve en el menú de inicio:![Comenzando con Git: una guía detallada para principiantes - 2](https://cdn.javarush.com/images/article/7f9c3203-5ae5-46fd-b500-42b3979c2eaf/800.jpeg)
![Comenzando con Git: una guía detallada para principiantes - 3](https://cdn.javarush.com/images/article/52ad1966-4e34-4e47-ba78-8ce1ff395d18/1024.jpeg)
Instalación para Linux
Por lo general, git ya está instalado e incluido en las distribuciones de Linux, ya que es una herramienta escrita originalmente para desarrollar el kernel de Linux. Pero hay situaciones en las que no existe. Para verificar esto, debe abrir una terminal y escribir: git --version. Si hay una respuesta clara, no es necesario instalar nada. Abra una terminal e instálela. Trabajo en Ubuntu, así que puedo decirte qué escribir: sudo apt-get install git. Y listo: ahora puedes usar Git en cualquier terminal.Instalación en MacOS
Aquí también es necesario comprobar primero si Git ya existe (ver arriba, como en Linux). Si no, la forma más sencilla es descargar la última versión. Si XCode está instalado, Git definitivamente se instalará automáticamente.configuración de git
El git tiene una configuración de usuario desde la cual se realizará el trabajo. Esto es algo razonable y necesario, porque cuando se crea una confirmación, Git toma exactamente esta información para el campo Autor. Para configurar un nombre de usuario y contraseña para todos los proyectos, debe ingresar los siguientes comandos:
git config --global user.name ”Ivan Ivanov”
git config --global user.email ivan.ivanov@gmail.com
Si es necesario cambiar el autor de un proyecto específico (para un proyecto personal, por ejemplo), puedes eliminar --global y esto funcionará:
git config user.name ”Ivan Ivanov”
git config user.email ivan.ivanov@gmail.com
Un poco de teoría...
Para permanecer en el tema, es recomendable agregar algunas palabras y acciones nuevas a su mensaje... De lo contrario, no habrá nada de qué hablar. Por supuesto, esto es jerga y una copia del inglés, por lo que agregaré significados en inglés. ¿Qué palabras y acciones?- repositorio git;
- comprometerse (comprometerse);
- rama;
- unir;
- conflictos;
- jalar;
- empujar;
- cómo ignorar algunos archivos (.gitignore).
Estados en Git
El Gita tiene varios estados que es necesario comprender y recordar:- sin seguimiento;
- modificado;
- preparado (escenificado);
- comprometido.
¿Qué significa?
Estos son los estados en los que se encuentran los archivos de nuestro código. Es decir, su camino de vida suele verse así:- Un archivo que se crea y no se agrega al repositorio no tendrá seguimiento.
- Realizamos cambios en los archivos que ya se han agregado al repositorio de Git; están en estado modificado.
- De los archivos que hemos modificado, seleccionamos solo aquellos (o todos) que necesitamos (por ejemplo, no necesitamos clases compiladas), y estas clases con cambios entran en el estado preparado.
- Se crea una confirmación a partir de los archivos preparados del estado preparado y se ingresa en el repositorio de Git. Después de esto, el estado preparado está vacío. Pero la modificación aún puede contener algo.
![Comenzando con Git: una guía detallada para principiantes - 4](https://cdn.javarush.com/images/article/6136c12e-46b4-4fda-820c-3287237c48ab/800.jpeg)
¿Qué es un compromiso?
Una confirmación es el objeto principal en el control de versiones. Contiene todos los cambios desde esa confirmación. Las confirmaciones están vinculadas entre sí como una lista enlazada individualmente. A saber: existe la primera confirmación. Cuando se crea una segunda confirmación, (la segunda) sabe que viene después de la primera. Y de esta manera puedes rastrear la información. El commit también tiene su propia información, los llamados metadatos:- un identificador de confirmación único mediante el cual puede encontrarlo;
- el nombre del autor del compromiso que lo creó;
- fecha de creación del compromiso;
- un comentario que describe lo que se hizo durante esta confirmación.
![Comenzando con Git: una guía detallada para principiantes - 5](https://cdn.javarush.com/images/article/f0a1025b-2f0c-4e65-b9bc-641db79a7704/512.jpeg)
que es una sucursal
![Comenzando con Git: una guía detallada para principiantes - 6](https://cdn.javarush.com/images/article/29945159-3a11-47a9-ae00-c762a4f5d6fb/512.jpeg)
Empezando con Git
Puedes trabajar sólo con un repositorio local o con uno remoto. Para ejecutar los comandos necesarios, solo puede utilizar el repositorio local. Almacena toda la información solo localmente en el proyecto en la carpeta .git. Si hablamos de remoto, entonces toda la información se almacena en algún lugar de un servidor remoto: solo una copia del proyecto se almacena localmente, cuyos cambios se pueden enviar (git push) al repositorio remoto. Aquí y más discutiremos cómo trabajar con git en la consola. Por supuesto, puede utilizar algunas soluciones gráficas (por ejemplo, en Intellij IDEA), pero primero debe averiguar qué comandos están sucediendo y qué significan.Trabajar con Git en un repositorio local
A continuación, te sugiero que sigas todos los pasos que hice mientras leías el artículo. Esto mejorará su comprensión y retención del material. Así que buen provecho :) Para crear un repositorio local, debes escribir:
git init
![Comenzando con Git: una guía detallada para principiantes - 7](https://cdn.javarush.com/images/article/5dbf6234-0ea6-40a8-9d37-ce14609d53b4/800.jpeg)
git status
![Comenzando con Git: una guía detallada para principiantes - 8](https://cdn.javarush.com/images/article/348071fa-ccab-4a0c-ae94-6f9f0e6fa671/800.jpeg)
- git add -A: agrega todos los archivos desde el estado preparado;
- git agregar. — agregue todos los archivos de esta carpeta y todos los internos. Esencialmente igual que el anterior;
- git add <nombre de archivo>: agrega solo un archivo específico. Aquí puedes usar expresiones regulares para agregar según algún patrón. Por ejemplo, git add *.java: esto significa que solo necesitas agregar archivos con la extensión java.
git add *.txt
Para comprobar el estado, utilizamos el comando que ya conocemos:
git status
![Comenzando con Git: una guía detallada para principiantes - 9](https://cdn.javarush.com/images/article/948c12dc-8227-48d0-8bd3-2ac9ed8be271/800.jpeg)
git commit -m “all txt files were added to the project”
![Comenzando con Git: una guía detallada para principiantes - 10](https://cdn.javarush.com/images/article/5159fcca-3b1c-4308-b1e4-854c1d480385/800.jpeg)
git log
![Comenzando con Git: una guía detallada para principiantes - 11](https://cdn.javarush.com/images/article/b869b551-e804-4ac1-b199-6f16684be943/800.jpeg)
git status
![Comenzando con Git: una guía detallada para principiantes - 12](https://cdn.javarush.com/images/article/00e768e8-6568-42d8-9d03-437c71028b50/800.jpeg)
git status
![Comenzando con Git: una guía detallada para principiantes - 13](https://cdn.javarush.com/images/article/3abb8e35-ebfd-4480-b26e-fc8f19322b36/800.jpeg)
git diff
![Comenzando con Git: una guía detallada para principiantes - 14](https://cdn.javarush.com/images/article/1f3506ae-1746-4ee9-b346-c992be73bb63/800.jpeg)
git add test_resource.txt
git commit -m “added hello word! to test_resource.txt”
Para ver todas las confirmaciones, escriba:
git log
![Comenzando con Git: una guía detallada para principiantes - 15](https://cdn.javarush.com/images/article/12d64adf-c2ae-4d62-ab36-df174fdab5b8/800.jpeg)
git add GitTest.java
git commit -m “added GitTest.java”
git status
![Comenzando con Git: una guía detallada para principiantes - 16](https://cdn.javarush.com/images/article/e5e89bbd-baa2-43cc-bace-cbb24e030c7a/800.jpeg)
Trabajando con .gitignore
Está claro que sólo queremos almacenar el código fuente y nada más en el repositorio. ¿Qué más podría ser? Como mínimo, clases y/o archivos compilados que crean entornos de desarrollo. Para que Git los ignore, es necesario crear un archivo especial. Hacemos esto: creamos un archivo en la raíz del proyecto llamado .gitignore, y en este archivo cada línea será un patrón a ignorar. En este ejemplo, git ignore se vería así:
```
*.class
target/
*.iml
.idea/
```
Miremos ahora:
- la primera línea es ignorar todos los archivos con la extensión .class;
- la segunda línea es para ignorar la carpeta de destino 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
![Comenzando con Git: una guía detallada para principiantes - 17](https://cdn.javarush.com/images/article/78f2e2ef-72df-41ed-9f16-6aeb16be9c92/800.jpeg)
![Comenzando con Git: una guía detallada para principiantes - 18](https://cdn.javarush.com/images/article/cb845a33-8843-4ee9-8842-545e11a8436b/1024.jpeg)
git add .gitignore
git commit -m “added .gitignore file”
Y ahora el momento de la verdad: tenemos una clase GitTest.class compilada en un estado sin seguimiento, que no queríamos agregar al repositorio de Git. Aquí es donde debería funcionar git ignore:
git status
![Comenzando con Git: una guía detallada para principiantes - 19](https://cdn.javarush.com/images/article/d094337b-01dc-43a6-8326-c0ba309d0df7/800.jpeg)
Trabajar con sucursales y similares.
Por supuesto, trabajar en una rama es un inconveniente para una e imposible cuando hay más de una persona en el equipo. Hay una sucursal para esto. Como dije antes, una rama es simplemente un puntero móvil a confirmaciones. En esta parte, veremos 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
![Comenzando con Git: una guía detallada para principiantes - 20](https://cdn.javarush.com/images/article/3a5ccec8-3fe1-4b6c-b19f-2e66280f4fc6/800.jpeg)
- crear una nueva rama basada en la que estamos (99% de los casos);
- cree una rama basada en una confirmación específica (1%).
Crear una rama basada en una confirmación específica
Nos basaremos en el identificador de confirmación único. Para encontrarlo escribimos:
git log
![Comenzando con Git: una guía detallada para principiantes - 21](https://cdn.javarush.com/images/article/6f312f65-a820-4faf-a218-686182020e32/800.jpeg)
git checkout -b development 6c44e53d06228f888f2f454d3cb8c1c976dd73f8
Se crea una rama que contiene solo las dos primeras confirmaciones de la rama maestra. Para probar esto, primero nos aseguraremos de habernos mudado a otra rama y veremos la cantidad de confirmaciones en ella:
git status
git log
![Comenzando con Git: una guía detallada para principiantes - 22](https://cdn.javarush.com/images/article/32e2010a-16e6-4342-a082-c5181a876dfd/800.jpeg)
git branch -a
![Comenzando con Git: una guía detallada para principiantes - 23](https://cdn.javarush.com/images/article/b0fa2136-26d5-4c09-867a-9faebdc3be8e/800.jpeg)
Crear una rama basada en la actual
La segunda forma de crear una rama es construir sobre otra. Quiero crear una rama basada en la rama maestra, por lo que primero debo cambiar a ella y el siguiente paso es crear una nueva. Miremos:- git checkout master - pasar a la rama master;
- git status: comprueba si está en el maestro.
![Comenzando con Git: una guía detallada para principiantes - 24](https://cdn.javarush.com/images/article/fc59d1e4-d887-4b07-add7-0a1ed53ede8b/800.jpeg)
git checkout -b feature/update-txt-files
![Comenzando con Git: una guía detallada para principiantes - 25](https://cdn.javarush.com/images/article/19d396fc-af1c-4d3f-8deb-2dbba09dfaf2/800.jpeg)
Resolver conflictos
Antes de que entendamos qué es un conflicto, debemos hablar sobre fusionar (fusionar) una rama con otra. Esta imagen puede mostrar el proceso cuando una rama se fusiona con otra:![Comenzando con Git: una guía detallada para principiantes - 26](https://cdn.javarush.com/images/article/5be87984-024c-43ab-be88-a3cdf3331692/512.jpeg)
![Comenzando con Git: una guía detallada para principiantes - 27](https://cdn.javarush.com/images/article/47a002ed-bea0-4be5-b60c-f9c822c5c834/800.jpeg)
git add *.txt
git commit -m “updated txt files”
git log
![Comenzando con Git: una guía detallada para principiantes - 28](https://cdn.javarush.com/images/article/99af1950-f2b6-4792-8fe7-4ad7442dd8fc/800.jpeg)
git checkout master
git merge feature/update-txt-files
git log
![Comenzando con Git: una guía detallada para principiantes - 29](https://cdn.javarush.com/images/article/96f5d6f1-3d22-4597-b85b-b8af900b2e35/800.jpeg)
git branch -D feature/update-txt-files
Hasta aquí está claro, ¿verdad? Compliquemos la situación: ahora digamos que necesitamos cambiar el archivo txt nuevamente. Pero ahora este archivo también se cambiará en el asistente. Es decir, cambiará en paralelo y Git no podrá comprender qué se debe hacer en una situación en la que queremos fusionar código nuevo en la rama maestra. ¡Ir! Creamos una nueva rama basada en master, realizamos cambios en text_resource.txt y creamos una confirmación para este asunto:
git checkout -b feature/add-header
... делаем изменения в файле
![Comenzando con Git: una guía detallada para principiantes - 30](https://cdn.javarush.com/images/article/0a9176d6-8054-4655-b90a-315e215aa56f/800.jpeg)
git add *.txt
git commit -m “added header to txt”
![Comenzando con Git: una guía detallada para principiantes - 31](https://cdn.javarush.com/images/article/2635b663-7fd8-4d22-947b-df8c50777840/800.jpeg)
git checkout master
… обновo test_resource.txt
![Comenzando con Git: una guía detallada para principiantes - 32](https://cdn.javarush.com/images/article/ac84fa61-0381-48e0-bf5c-1dcf633b779f/800.jpeg)
git add test_resource.txt
git commit -m “added master header to txt”
Y ahora el momento más interesante: necesitas fusionar los cambios de la rama característica/agregar encabezado a master. Estamos en la rama master, así que todo lo que tenemos que hacer es escribir:
git merge feature/add-header
Pero obtendremos un resultado con un conflicto en el archivo test_resource.txt: ![Comenzando con Git: una guía detallada para principiantes - 33](https://cdn.javarush.com/images/article/233f6738-b599-4f22-8552-2d39813d6dd8/800.jpeg)
![Comenzando con Git: una guía detallada para principiantes - 34](https://cdn.javarush.com/images/article/efa04c3b-e279-4f6f-8f05-c3d2318d8ff2/800.jpeg)
- entre “<<<<<<< HEAD” y “=======” son los cambios maestros que estaban en esta línea en la rama maestra.
- entre “=======” y “>>>>>>> característica/agregar-encabezado” hay cambios que estaban en la rama característica/agregar-encabezado.
![Comenzando con Git: una guía detallada para principiantes - 35](https://cdn.javarush.com/images/article/c167e2b2-1cb1-4d19-862e-80ee06a7b6b4/800.jpeg)
git status
![Comenzando con Git: una guía detallada para principiantes - 36](https://cdn.javarush.com/images/article/4416b14b-0e87-4877-b098-702624219f04/800.jpeg)
git add *.txt
![Comenzando con Git: una guía detallada para principiantes - 37](https://cdn.javarush.com/images/article/99a41e85-fb52-429a-86c3-65ad32dd54aa/800.jpeg)
git commit
![Comenzando con Git: una guía detallada para principiantes - 38](https://cdn.javarush.com/images/article/c07c9f20-993a-42ed-91d6-91fbf8f37646/800.jpeg)
Trabajar con repositorios remotos
El último paso es comprender algunos comandos más necesarios para trabajar con un repositorio remoto. Como ya dije, un repositorio remoto es un lugar donde se almacena el repositorio y desde donde puedes clonarlo. ¿Qué tipos de repositorios remotos existen? Hay toneladas de ejemplos:-
GitHub es el repositorio más grande para repositorios y desarrollo colaborativo. Ya lo he descrito en artículos anteriores.
Suscríbete a mi cuenta de Github . A menudo expongo allí mi trabajo en las áreas que estudio durante mi trabajo. -
GitLab es una herramienta de ciclo de vida de DevOps basada en web de código abierto que proporciona un sistema de gestión de repositorio de código para Git con su propia wiki, sistema de seguimiento de problemas , proceso de CI/CD y otras características.
Tras la noticia de que Microsoft compró GitHub, algunos desarrolladores duplicaron su trabajo en GitLab. -
BitBucket es un servicio web para el alojamiento de proyectos y su desarrollo conjunto, basado en el sistema de control de versiones Mercurial y Git. Hubo un tiempo en que tenía una gran ventaja sobre GitHub porque tenía repositorios privados gratuitos. El año pasado, GitHub también puso esta función a disposición de todos de forma gratuita.
-
Etcétera…
git clone https://github.com/romankh3/git-demo
Ahora hay una copia completa del proyecto localmente. Para asegurarse de que la última copia del proyecto esté ubicada localmente, debe, como dicen, volcar los datos escribiendo:
git pull
![Comenzando con Git: una guía detallada para principiantes - 39](https://cdn.javarush.com/images/article/782b84b1-e001-4849-be0b-c319133afca0/800.jpeg)
![Comenzando con Git: una guía detallada para principiantes - 40](https://cdn.javarush.com/images/article/5598fa4d-3058-4994-b17d-63c6b5710076/800.jpeg)
git add test_resource.txt
git commit -m “prepated txt for pushing”
Y ahora el comando para enviar esto al repositorio remoto:
git push
![Comenzando con Git: una guía detallada para principiantes - 41](https://cdn.javarush.com/images/article/46c49cfa-afb0-4b3a-b95f-7506a199a189/800.jpeg)
Enlaces útiles
- El documento oficial sobre Git está en ruso . Lo recomiendo como guía de referencia.
- git
GO TO FULL VERSION