Codemaker Git y GitHub

Git y GitHub Tema 3

Avanzado: ramas y conflictos

Con lo de los temas anteriores tienes de sobra para tu proyecto. Esto es para cuando quieras ir un paso más allá, o trabajes en equipo: aquí solo se cuenta por encima.

Ramas#

Una rama es una línea de trabajo aparte. La principal se llama main. Si quieres probar algo sin arriesgar lo que ya funciona (una pantalla nueva, un cambio grande…), creas una rama, trabajas en ella, y cuando está listo la juntas con main.

Una rama sale de main, recibe sus propios commits y vuelve a unirse a main con git merge

ComandoQué hace
git branchLista las ramas, y marca con * en la que estás
git switch -c nueva-pantallaCrea la rama nueva-pantalla y se cambia a ella
git switch mainVuelve a la rama main
git merge nueva-pantallaJunta los cambios de nueva-pantalla con la rama en la que estás
git push origin nueva-pantallaSube la rama a GitHub

El orden habitual:

Terminal
git switch -c nueva-pantalla      # crear la rama
# ... trabajar, add y commit las veces que haga falta ...
git switch main                   # volver a main
git merge nueva-pantalla          # juntar
git push origin main

Pull requests#

En un equipo, en vez de hacer el merge directamente, se sube la rama a GitHub y se abre una pull request (PR): una petición para juntarla con main. Así el resto del equipo puede revisar los cambios y comentarlos antes de aceptarlos. Se hace desde la web de GitHub, con el botón Compare & pull request que aparece al subir una rama.

Conflictos#

Un conflicto aparece cuando dos personas (o tú desde dos ordenadores) cambiáis las mismas líneas del mismo archivo, y Git no sabe con cuál quedarse. Al hacer pull (o merge), avisa así:

Salida
Auto-merging notas.txt
CONFLICT (content): Merge conflict in notas.txt
Automatic merge failed; fix conflicts and then commit the result.

Y en el archivo marca las dos versiones:

Salida
linea 1
<<<<<<< HEAD
linea desde el aula
=======
linea desde casa
>>>>>>> ab6908c75b721a54fe27ea1d8264d7af9ec43694
MarcaQué hay
Entre <<<<<<< HEAD y =======Tu versión
Entre ======= y >>>>>>>La que llega de GitHub (o de la otra rama)

Para resolverlo:

  1. Deja el archivo como tiene que quedar: con una versión, con la otra o con las dos. Borra las tres líneas de marcas. VS Code te ayuda con los botones Aceptar cambio actual, Aceptar cambio entrante o Aceptar ambos cambios.
  2. Guarda el archivo.
  3. git add ., git commit -m "Resuelve el conflicto de notas.txt" y git push origin main.

Para evitarlos: pull antes de empezar, commits pequeños, y en equipo, que cada uno trabaje en archivos distintos.

Fork#

Un fork es una copia de un repositorio de otra persona en tu cuenta de GitHub. Se usa para contribuir a proyectos de software libre: haces fork, trabajas en tu copia y propones el cambio al original con una pull request.

Errores frecuentes#

Mensaje o síntomaQué significaCómo se arregla
CONFLICT (content): Merge conflict in …Dos versiones distintas de las mismas líneasResuélvelo como se explica arriba
You have unmerged paths en git statusHay un conflicto a medio resolverTermina de arreglar los archivos marcados y haz add y commit. Para abandonar y volver a como estabas: git merge --abort
El programa no compila después de un mergeSe han quedado marcas <<<<<<< en algún archivoBúscalas y bórralas
Tus cambios «han desaparecido»Estás en otra ramaMira en cuál estás con git branch y vuelve con git switch