22  Ramas

Ramificar significa tomar un desvío de la corriente principal de desarrollo y trabajar sin cambiar la corriente principal. Permite que una o varias personas trabajen en paralelo sin sobrescribir el trabajo de los demás. Permite a alguien que trabaja solo trabajar de forma incremental en una idea experimental, sin poner en peligro el estado del producto principal.

La bifurcación en Git es muy liviana, lo que significa crear una rama y El cambio entre ramas es casi instantáneo. Esto significa que Git fomenta los flujos de trabajo que crean pequeñas ramas para la exploración o nuevas funciones, y a menudo las fusionan rápidamente.

22.1 Crear una nueva rama

Puede crear una nueva rama con git branch y luego verificar la rama con git checkout. Para distinguirlo de la corriente principal de desarrollo, presumiblemente en “principal”, lo llamaremos “rama de características”.

git branch issue-5
git checkout issue-5

También puedes usar el atajo git checkout -b issues-5 para crear y verificar la rama de una vez.

Una vez que haya cambiado a una rama, puede confirmar cambios en ella como de costumbre.

22.2 Cambiar de rama

Usas git checkout para cambiar entre ramas.

Pero, ¿qué haces si estás trabajando en una rama y necesitas cambiar? ¿Pero el trabajo en la rama actual no está completo? Una opción es Git stash, pero generalmente una mejor opción es salvaguardar el estado actual con una confirmación temporal. Aquí utilizo “WIP” como mensaje de confirmación para indicar el trabajo en progreso.

git commit --all -m "WIP"
git checkout main

Luego, cuando regreses a la rama y continúes con tu trabajo, Necesitas deshacer la confirmación temporal restableciendo tu estado. Específicamente, queremos un reinicio mixto. Este es un “directorio de trabajo seguro”, es decir, no afecta el estado de ningún archivo. Pero sí elimina el commit WIP temporal. A continuación, la referencia HEAD^ dice que se debe revertir el estado de confirmación al padre de la confirmación actual (HEAD).

git checkout issue-5
git reset HEAD^

Si esto es difícil de recordar, o revertir el estado de confirmación a un estado anterior diferente, la referencia también se puede proporcionar como el SHA de una confirmación específica, que puede ver a través de git log. Aquí es donde creo que un cliente Git gráfico puede ser invaluable, ya que generalmente puedes hacer clic derecho en la confirmación de destino y luego seleccionar el tipo de reinicio deseado (por ejemplo, suave, mixto o duro). Este es exactamente el tipo de uso de Git intermedio a avanzado que a menudo parece más accesible en un cliente gráfico.

22.3 Fusionar una rama

Una vez que haya hecho su trabajo y lo haya confirmado en la rama de funciones, puede volver a “principal” y fusionar la rama de funciones.

git checkout main
git merge issue-5

22.4 Lidiar con los conflictos

La mayoría de las veces, la fusión se realizará sin problemas. Sin embargo, si ambas ramas que está fusionando cambiaron la misma parte del mismo archivo, obtendrá un conflicto de fusión.

git merge issue-5
# Auto-merging index.html
# CONFLICT (content): Merge conflict in index.html
# Automatic merge failed; fix conflicts and then commit the result.

Lo primero que debe hacer es NO ENTRAR EN PÁNICO. Los conflictos de fusión no son el fin del mundo y la mayoría son relativamente pequeños y fáciles de resolver.

El primer paso para resolver un conflicto de fusión es determinar qué archivos están en conflicto, que puedes hacer con git status:

git status
# On branch main
# You have unmerged paths.
#   (fix conflicts and run "git commit")
# 
# Unmerged paths:
#   (use "git add <file>..." to mark resolution)
# 
#     both modified:      index.html
# 
# no changes added to commit (use "git add" and/or "git commit -a")

Entonces esto muestra que solo index.html no está fusionado y debe resolverse. Luego podemos abrir el archivo para ver qué líneas están en conflicto.

<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
 please contact us at support@github.com
</div>
>>>>>>> issue-5:index.html

En este conflicto, las líneas entre <<<<<< HEAD:index.html y ====== son el contenido de la rama en la que se encuentra actualmente. Las líneas entre ======= y >>>>>>> issues-5:index.html son de la rama de funciones que estamos fusionando.

Para resolver el conflicto, edite esta sección hasta que refleje el estado que desea en el resultado combinado. Elige una versión u otra o crea un híbrido. También elimine los marcadores de conflicto <<<<<<, ====== y >>>>>>.

<div id="footer">
please contact us at email.support@github.com
</div>

Ahora ejecute git add index.html y git commit para finalizar la fusión. CONFLICTOS RESUELTOS.

22.4.1 Abortar

Si, durante la fusión, se confunde sobre el estado de las cosas o hace una error, use git merge --abort para cancelar la fusión y volver al estado antes de ejecutar git merge. Luego puedes intentar completar la fusión nuevamente.

Bifurcación y fusión de Git Basic:

https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging