Fusionar ramas y resolver conflictos


Tu rama de funcionalidad está terminada. El conmutador funciona, has confirmado los cambios, y ahora quieres que ese trabajo esté en main donde vive el código del resto del equipo. La mayoría de las veces traerlo es rápido y silencioso: Git compara las dos ramas, no encuentra nada que se superponga, e integra el trabajo sin pasos adicionales. A veces, sin embargo, tú y un compañero de equipo cambiaron las mismas líneas exactas en ramas diferentes, y Git no puede adivinar qué versión quieres mantener. Esa situación aparece en casi todos los proyectos con más de una persona confirmando en él. Es una parte normal y cotidiana de ramificar, y significa que Git encontró dos ideas sobre las mismas líneas y quiere tu decisión sobre cuál gana.
Traer una rama de vuelta con git merge
Digamos que construiste el conmutador de Fahrenheit en su propia rama, add-fahrenheit-toggle, y main no ha avanzado desde que te ramificaste. Cambia a main y ejecuta git merge con el nombre de la rama que quieres traer:
$ git switch main
$ git merge add-fahrenheit-toggle
Updating 4f2a891..8c3d1a0
Fast-forward
src/index.js | 12 +++++++++---
1 file changed, 9 insertions(+), 3 deletions(-)git merge <branch> siempre fusiona la rama nombrada en la rama en la que estés parado, así que cambiar a main primero es importante. La rama en la que estés parado es la que recibe la fusión. Después de esto, main tiene todos los commits de add-fahrenheit-toggle. La rama de funcionalidad en sí no se toca: puedes seguir trabajando en ella o eliminarla ahora que su trabajo también vive en main.
git merge branch-name trae los commits de esa rama a la rama en la que estés parado, así que cambia a main primero. La mayoría de las fusiones suceden silenciosamente en el trasfondo y sigues adelante con tu día. Nada sobre la rama de funcionalidad en sí cambia; puedes seguir usándola o eliminarla una vez que main tenga el trabajo. Cómo se ve un conflicto de fusión
Un conflicto ocurre cuando las mismas líneas cambian en ambos lados de una fusión, y Git no tiene forma de decirte qué versión quieres. Digamos que un compañero fusionó un spinner de carga en main que cambió una función en src/index.js, y tu rama add-fahrenheit-toggle cambió la misma función para añadir el conmutador. Fusionar ahora se detiene a mitad de camino en lugar de terminar:
$ git switch main
$ git merge add-fahrenheit-toggle
Auto-merging src/index.js
CONFLICT (content): Merge conflict in src/index.js
Automatic merge failed; fix conflicts and then commit the result.Ese es un conflicto de fusión. Abre el archivo y encontrarás que Git ha marcado exactamente dónde las dos versiones no están de acuerdo:
<<<<<<< HEAD
showLoadingSpinner(true);
=======
const tempF = celsiusToFahrenheit(tempC);
>>>>>>> add-fahrenheit-toggle<<<<<<< HEAD marca el inicio de lo que está actualmente en tu rama (main, en este caso). ======= divide las dos versiones. >>>>>>> add-fahrenheit-toggle marca el final de la versión de la rama entrante. Todo entre los marcadores es el mismo puñado de líneas, escritas de dos formas diferentes.
Un conflicto significa que Git necesita tu juicio; nada está roto. Git encontró dos cambios en las mismas líneas y no tiene forma de adivinar cuál quieres, así que se detiene y te pide que decidas. Edita el archivo hasta que se lea como quieres, manteniedo cualquiera de las versiones, ambas, o algo nuevo que las combine, luego elimina las líneas de marcador en sí:
showLoadingSpinner(true);
const tempF = celsiusToFahrenheit(tempC);Una vez que el archivo se ve bien, etapifica y confirma como cualquier otro cambio:
$ git add src/index.js
$ git commitEjecutar git commit sin mensaje aquí abre tu editor con un mensaje que Git ya preparó, describiendo la fusión. Guarda y ciérralo, y la fusión está completa.
<<<<<<<, =======, y >>>>>>>, edita hasta que se lea como quieres, luego elimina esas líneas de marcador. Termina con git add y git commit. Mi primer conflicto se sintió como una emergencia; resultó ser Git haciéndome una pregunta bastante ordinaria. Volverlo a juntar
Fusionar es lo que hace que ramificar valga la pena: experimentas de manera segura en tu propia línea de historia, cubierto en Branches, luego integras ese trabajo de vuelta en main una vez que está listo, conflictos y todo. En GitHub, la misma operación generalmente sucede a través de una pull request en lugar de un git merge local en tu máquina; el capítulo pull request flow cubre proponer, revisar e integrar un cambio en un proyecto compartido. Si una fusión alguna vez llega a algún lugar que no intentabas después de que ya la hayas confirmado, undoing things cubre cómo retroceder de manera segura.

