diff --git a/public/data/academy/2-git/2-git-branch/readme.mdx b/public/data/academy/2-git/2-git-branch/readme.mdx new file mode 100644 index 0000000..0a39a65 --- /dev/null +++ b/public/data/academy/2-git/2-git-branch/readme.mdx @@ -0,0 +1,468 @@ +--- +title: 'Git branch' +publishedAt: '2021-06-27' +author: 'Tomas' +summary: '' +youtubeURL: '' +--- + +import { themes, Image } from 'mdx-deck' + + +# Clase 2: `git branch` + +### Tabla de contenidos + +1. ¿Qué son las ramas? (Branches) + +1. Branching + +1. Merging + +1. Merge con conflictos 😱 + +--- + +## ¿Qué son las ramas? (Branches) + +¡Nos permiten hacer cambios en el proyecto, sin modificar los archivos existentes! + +También facilitan el trabajo en grupo, cada persona puede hacer su tarea en una rama separada. 🔀 + +Lo fácil que es cambiar entre ramas, hace que git sea tan popular. 🤩 + +--- +### Punteros + +Para git una rama es una etiqueta que "apunta" a un commit. + +Por esto es super fácil crear, mover y eliminar ramas en git. Solo se actualiza el puntero! + + + +> ### HEAD +> #### Es un puntero especial. Es donde estamos parados, la versión del repositorio que estamos viendo! + +--- + +## Branching + +`git branch` es el comando para gestionar las ramas de git. + +Por defecto lista las ramas del repositorio local: + +``` +* main +``` +y marca con `*` la rama en la que estamos + +> ##### se sale del log apretando `q` + +--- + +### Crear una rama + +`git branch ` + +Vamos a crear una rama llamada `testing`: + +``` +git branch testing +``` + +Ahora `git branch` muestra lo siguiente: + +``` +* main + testing +``` + +--- + +### Cambiar de rama + +`git checkout ` es para moverse de una rama a otra. + +Vamos a la rama recién creada `testing`: + +``` +$ git checkout testing +Switched to branch 'testing' +``` +El puntero `HEAD` se movió commit apuntado por la rama `testing`. + +Ahora `git branch` muestra lo siguiente: + +``` + main +* testing +``` + +Estamos en la rama `testing` 🧪 + +--- + +### Cambios en testing + +Los nuevos _commits_ van a quedar en la rama `testing`. + +Modificamos algunos archivos para crear un nuevo _commit_: + +1. Modificar +1. `git add .` +1. `git commit -m "test commit"` + +Nuestro repositorio quedó así: + + +Podemos ver algo similar con `git log --graph`. + +--- + +### Cambios en master + +Hay que moverse a master: +``` +$ git checkout master +Switched to branch 'master' +``` + +1. Modificar +1. `git add .` +1. `git commit -m "test commit"` + +Podemos ver cómo está el repo con `git log --graph -all`. + +Algo así: + + +Las ramas divergieron, ya no comparten la misma historia! + +--- + +## Merging + +Las ramas pueden fusionarse para combinar su historia de _commits_. + +Cuando una tarea está lista, esa rama se fusiona con la rama base o principal. + +### Basic merging + +Crear una nueva rama partiendo de `master` + +``` +$ git checkout -b hotfix +Switched to a new branch 'hotfix' +``` + +`git checkout -b ` es un atajo para crear una rama y movernos a ella automáticamente. + +Hacemos cambios y creemos un commit en `hotfix`. + +1. Modificar +1. `git add .` +1. `git commit -m "C3"` + +Nos queda algo asi: + + +--- + +### Fast foward + +Para _mergear_ o fusionar los cambios de la rama `hotfix` **en** `master` hay que moverse a `master` con `git checkout master`. + +Luego usamos `git merge ` para actualizar la rama en la que estamos con los cambios de ``. + +Mergeamos `hotfix` en `master`: +``` +$ git merge hotfix +Updating 5309e6d..76fa2dc +Fast-forward + README.md | 1 + + 1 file changed, 1 insertion(+) + create mode 100644 README.md +``` + +**Fast-forward:** significa que `master` está en la historia de `hotfix` y solo fue necesario adelantar el puntero de `master` a su nueva posición. + + + + +--- + +### Merge commit + +Un _merge commit_, es un _commit_ especial que tiene 2 ancestros en vez de 1. + +Se crea cuando se fusionan 2 ramas que divergieron. + + + +Para lograr una historia parecida a la de la imagen, hacemos los siguientes pasos: +1. Crear rama `iss53` con `git branch iss53` +1. Moverse a esa rama con `git checkout iss53` +1. Crear un archivo, por ejemplo `LICENCE` +1. Prepararlo y crear un commit: `git add LICENCE && git commit -m "C4"` +1. Vamos a `master` con `git checkout master` +1. Hacemos cambios y creamos un commit `git add . && git commit -m "C5"` + +Por último, hacemos el _merge commit_ pasándole un mensaje con `-m`: +``` +$ git merge iss53 -m "C6" +Merge made by the 'recursive' strategy. + LICENCE | 1 + + 1 file changed, 1 insertion(+) + create mode 100644 LICENCE +``` + +`git log --graph` nos muestra la historia, señalando en el gráfico cada _commit_ con un `*`: + +``` +* commit 2252345f8e40c3a67df81395746acfeb9daee22b (HEAD -> master) +|\ Merge: b3b435f 9ac1dbf +| | Author: tomasdisk +| | Date: Thu Jul 8 01:34:35 2021 -0300 +| | +| | C6 +| | +| * commit 9ac1dbfad0bd809d52834dcb8178ed167dd7e2d6 (iss53) +| | Author: tomasdisk +| | Date: Thu Jul 8 01:32:08 2021 -0300 +| | +| | C4 +| | +* | commit b3b435f70e84cf459128028a277d5e852029a1e0 +|/ Author: tomasdisk +| Date: Thu Jul 8 01:33:13 2021 -0300 +| +| C5 +| +* commit 76fa2dcd740e1667d507476d2addd42e76b328bc (hotfix) +| Author: tomasdisk +| Date: Thu Jul 8 01:06:11 2021 -0300 +| +| C3 +``` + + +--- + +## Merge conflicts 😱 + +Cuando queremos fusionar 2 ramas que hicieron cambios en un mismo archivo puede haber conflictos. + +Estos suceden porque git no sabe cómo mezclar el contenido de los dos archivos. + +Queda en nosotros solucionar los conflictos y terminar el merge. + +--- + +### Conflictos + +Para recrear esta situación, supongamos que en la rama `master` también habíamos creado un archivo `LICENCE`. + +Al querer hacer `git merge iss53 -m "C6"` el merge falla, porque las 2 ramas tienen cambios en el mismo archivo: +``` +$ git merge iss53 -m "C6" +CONFLICT (add/add): Merge conflict in LICENCE +Auto-merging LICENCE +Automatic merge failed; fix conflicts and then commit the result. +``` + +Nos dice que hubo un **conflicto** de merge en el archivo `LICENCE`. + +--- + +### Solucionar conflictos + +Con `git status` podemos ver como esta el repositorio: +``` +$ git status +On branch master +You have unmerged paths. + (fix conflicts and run "git commit") + (use "git merge --abort" to abort the merge) + +Unmerged paths: + (use "git add ..." to mark resolution) + both added: LICENCE + +no changes added to commit (use "git add" and/or "git commit -a") +``` + +Dice que hay _paths sin mergear_. + +Si abrimos el archivo `LICENCE` vamos a ver algo así: + +``` +<<<<<<< HEAD +# Hola mi +======= +# Hola mi repoo +>>>>>>> iss53 + +``` + +VS Code nos lo muestra así: + + + +Hay 3 marcadores en el texto. Fueron agregados por git para delimitar el conflicto! + +* `<<<<<<< HEAD`: es donde arranca el conflicto +* `=======`: separa los cambios de la rama actual (`HEAD`) de los cambios que viene de la rama que estamos queriendo mergear (`iss53`) +* `>>>>>>> iss53`: en donde termina el conflicto + +#### Nuestra tarea es: + +1. Editar el archivo `LICENCE` y decidir con qué cambios quedarse. Las opciones son: + * Nos quedamos con los cambios de `HEAD` + * Nos quedamos con los cambios que vienen desde la rama `iss53` + * Elegimos algo de ambas ramas +1. Eliminar los marcadores para que git sepa que no hay más conflicto +1. Preparar el archivo +1. Hacer el commit + +--- + +Editamos `LICENCE` y borramos los marcadores: + + +Preparamos los archivos con `git add LICENCE`. + +Luego vemos como esta el repo: + +``` +$ git status +On branch master +All conflicts fixed but you are still merging. + (use "git commit" to conclude merge) + +Changes to be committed: + modified: LICENCE +``` + +Git ya sabe que todos los conflictos fueron solucionados, pero nos dice que el merge todavía está activo. + +Para terminar el merge hay que hacer el commit usando: + +``` +git commit -m "C6" +``` + +De esta forma se creó el _merge commit_ con los conflictos solucionados! 🎉 + +--- + +### Eliminar una rama + +Para borrar una rama usamos `git branch -d `. + +Si queremos borrar la rama `hotfix`: +``` +$ git branch -d hotfix +Deleted branch hotfix (was e6ca539). +``` + +Si la rama tiene commits sin mergear, la eliminación falla: +``` +$ git branch -d hotfix +error: The branch 'hotfix' is not fully merged. +If you are sure you want to delete it, run 'git branch -D hotfix'. +``` + +Git nos dice que la rama no está completamente mergeada y si queremos eliminarla de todos modos usemos el flag `-D` en vez de `-d`. + +--- + +### Ejercicios + +#### 1. Primeras ramas + +- Crear varias ramas +- Moverse de una a otra +- Crear commits en distintas ramas +- Ver el gráfico de commits con `git log` + +#### 2. Merge + +- Fusionar distintas ramas en `master` +- Crear un conflicto y solucionarlo! + +--- + +### Resumen + +Todos los comandos usados en la clase ✨ + +Listar ramas +``` +git branch +``` + +Crear rama +``` +git branch +``` + +Moverse a otra rama +``` +git checkout +``` + +Crear una rama y moverse a ella +``` +git checkout -b +``` + +Merge: combinar la historia de `` con la rama actual dándole un mensaje para el commit +``` +git merge -m "mensaje del merge commit" +``` + +Ver la historia del repositorio como un gráfico +``` +git log --graph +``` + +Eliminar una rama +``` +git branch -d +``` + + +--- + +### Bibliografía + +### 1. [Pro Git, Capitulo 3: Ramificaciones en Git](https://git-scm.com/book/es/v2/Ramificaciones-en-Git-%C2%BFQu%C3%A9-es-una-rama%3F) + + +
+
+
diff --git a/public/data/academy/2-git/readme.mdx b/public/data/academy/2-git/readme.mdx index f7513a4..afe9904 100644 --- a/public/data/academy/2-git/readme.mdx +++ b/public/data/academy/2-git/readme.mdx @@ -16,14 +16,29 @@ summary: 'Módulo de git, donde aprenderemos a usar git en la terminal para vers Hay que aprender a usar la aterradora consola. Veremos cómo publicar y guardar nuestros proyectos en la nube para accederlos y descargarlos donde queramos, que otros puedan verlos y por último poder ver y usar repositorios de otros. - -## Próximamente, domingo 27 de Junio + ## 2. `git branch` - -### Crearemos ramas y vamos a trabajar en distintas versiones o tareas del proyecto - + +### Crear y gestionar ramas, para luego fusionar sus cambios! + + Vamos a trabajar en distintas versiones o tareas del proyecto. + + Cada tarea puede tener su propia rama para mezclar, así podemos trabajar en varias cosas a la vez. + + Cuando una tarea está lista, su rama se puede fusionar con otra para juntar los cambios! + + +## Próximamente, jueves 8 de Julio +## 2. `git remote` + +### ¿Cómo trabajar con un repositorio remoto? + Esto nos permite trabajar en grupo en el mismo repositorio. Porque si programar solo está bueno, ¡programar en equipo está mejor! Aprenderemos a colaborar entre varias personas en un mismo repositorio y así sacarle el máximo potencial a Git. + +
+
+
diff --git a/public/images/2-git/2-git-branch/advance-master.png b/public/images/2-git/2-git-branch/advance-master.png new file mode 100644 index 0000000..c3a7ebe Binary files /dev/null and b/public/images/2-git/2-git-branch/advance-master.png differ diff --git a/public/images/2-git/2-git-branch/advance-testing.png b/public/images/2-git/2-git-branch/advance-testing.png new file mode 100644 index 0000000..312e65e Binary files /dev/null and b/public/images/2-git/2-git-branch/advance-testing.png differ diff --git a/public/images/2-git/2-git-branch/basic-branching-2.png b/public/images/2-git/2-git-branch/basic-branching-2.png new file mode 100644 index 0000000..a04469c Binary files /dev/null and b/public/images/2-git/2-git-branch/basic-branching-2.png differ diff --git a/public/images/2-git/2-git-branch/basic-branching-3.png b/public/images/2-git/2-git-branch/basic-branching-3.png new file mode 100644 index 0000000..53b6fa8 Binary files /dev/null and b/public/images/2-git/2-git-branch/basic-branching-3.png differ diff --git a/public/images/2-git/2-git-branch/basic-branching-4.png b/public/images/2-git/2-git-branch/basic-branching-4.png new file mode 100644 index 0000000..ab8f222 Binary files /dev/null and b/public/images/2-git/2-git-branch/basic-branching-4.png differ diff --git a/public/images/2-git/2-git-branch/basic-branching-5.png b/public/images/2-git/2-git-branch/basic-branching-5.png new file mode 100644 index 0000000..947133f Binary files /dev/null and b/public/images/2-git/2-git-branch/basic-branching-5.png differ diff --git a/public/images/2-git/2-git-branch/basic-merging-2.png b/public/images/2-git/2-git-branch/basic-merging-2.png new file mode 100644 index 0000000..a243826 Binary files /dev/null and b/public/images/2-git/2-git-branch/basic-merging-2.png differ diff --git a/public/images/2-git/2-git-branch/conflicts-solution.png b/public/images/2-git/2-git-branch/conflicts-solution.png new file mode 100644 index 0000000..dfeeb92 Binary files /dev/null and b/public/images/2-git/2-git-branch/conflicts-solution.png differ diff --git a/public/images/2-git/2-git-branch/conflicts.png b/public/images/2-git/2-git-branch/conflicts.png new file mode 100644 index 0000000..84b72d8 Binary files /dev/null and b/public/images/2-git/2-git-branch/conflicts.png differ