¿Cómo termino la fusión después de resolver mis conflictos de fusión?

282

He leído la sección Básica de ramificación y fusión del Libro de la comunidad de Git.

Así lo sigo y crear una rama: experimental.

Entonces yo:

  1. cambiar a rama experimental (git checkout experimental)
  2. hacer un montón de cambios
  3. comprometerlo (git commit -a)
  4. cambiar a rama maestra (git checkout master)
  5. hacer algunos cambios y comprometerse allí
  6. volver a experimental (git checkout experimental)
  7. cambiar maestro de fusión a experimental (maestro de fusión git)
  8. hay algunos conflictos, pero después de resolverlos, 'agregué mi archivo'

  9. Y ahora estoy atascado, no puedo volver a dominar

Cuando lo hago

 $ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

y lo hice:

$ git rebase --abort

No hay rebase en progreso?

y lo hice :

$  git add res/layout/socialhub_list_item.xml
$ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

¿Qué puedo hacer para volver a mi rama maestra?

Miguel
fuente
Después de que soluciono el conflicto, realizo la adición y luego intento realizar la confirmación con el git commit gf2n.cpp -m "Hand merge gf2n.cpp due to conflicts"resultado fatal: cannot do a partial commit during a merge.. Y, por supuesto, las "confirmaciones parciales" no parecen estar documentadas ni discutidas en ninguna parte de las páginas de manual de git. Realizar una git mergedespués de los resultados del arreglo en Please, commit your changes before you can merge.qué una herramienta culo roto ...
JWW
2
git commit con rutas explícitas se documenta en la página de manual en la DESCRIPCIÓN "como" 3. al enumerar los archivos como argumentos para el comando commit, en cuyo caso el commit ignorará los cambios organizados en el índice y, en su lugar, registrará el contenido actual de los archivos enumerados (que Git ya debe conocer); "y también bajo '- -solo "opción. Estoy bastante seguro de que el mensaje de fusión fue escrito por alguien que asumió que había leído cómo funciona el comando commit y que podía reconocer el significado de la palabra" parcial "en esa descripción, si no es así, al menos de nuevo y con más cuidado. @jww
jthill
1
Entonces, ¿por qué ese estudio de caso merece una lectura cuidadosa para la comprensión, entonces, mientras que las páginas del manual no? @jww
jthill
1
Bueno, usar git claramente requiere una mejor comprensión de lectura de la que estás preparado para adquirir. Quizás estoy aún más inseguro de que eso sea una falla en git de lo que estás seguro.
Jthill
1
Con Git 2.12 (Q1 2017), pronto simplemente hará una git merge --continue. Vea mi respuesta a continuación
VonC

Respuestas:

267

Cuando hay un conflicto durante una fusión, debe finalizar la confirmación de fusión manualmente. Parece que has hecho los dos primeros pasos, para editar los archivos que estaban en conflicto y luego ejecutarlos git addpara marcarlos como resueltos. Finalmente, necesita comprometer realmente la fusión con git commit. En ese punto, podrá cambiar de rama nuevamente.

Jimmy Cuadra
fuente
Si usa "git gui &" para realizar la confirmación, es posible que no se dé cuenta de que su estado de rama ya no se está "fusionando". Seguir con un "estado de git" es útil para garantizar que el estado de su sucursal sea correcto.
Tony Ashworth
44
Intente git commit -am "your commit message"realizar agregar y confirmar simultáneamente.
vaheeds
3
git commitfunciona. Y es mejor usarlo para obtener el mensaje de confirmación de fusión predeterminado que se completa para usted.
Evito
1
Tratar git push.
Alper
Obtuve esta situación en el siguiente escenario -> Fusioné X branch con Y branch. Luego me di cuenta de que hice algo mal en la rama Y, así que lo arreglé y luego "enmende" mis cambios en la rama Y. Debido a la modificación, git no creó una nueva confirmación. Entonces, cuando fusioné la rama X con la rama Y actualizada, dio conflicto. Por cierto, gracias por esta respuesta.
doga
157

¿Cómo termino la fusión después de resolver mis conflictos de fusión?

Con Git 2.12 (Q1 2017), tendrá el comando más natural:

git merge --continue

Ver commit c7d227d (15 dic 2016) por Jeff King ( peff) .
Ver commit 042e290 , commit c261a87 , commit 367ff69 (14 de diciembre de 2016) por Chris Packham ( cpackham) .
(Fusionada por Junio ​​C Hamano - gitster- en commit 05f6e1b , 27 dic 2016)

Consulte las notas de la versión 2.12 .

merge: agregue la --continueopción ' ' como sinónimo de ' git commit'

Enseñe ' git merge' la --continueopción que permite 'continuar' una fusión al completarla.
La forma tradicional de completar una fusión después de resolver conflictos es usar ' git commit'.
Ahora con comandos como ' git rebase' y ' git cherry-pick' tener una --continueopción ' ', agregar dicha opción a ' git merge' presenta una interfaz de usuario coherente.

VonC
fuente
Me estaba preparando para publicar un comentario sobre cómo esto se agregó recientemente en 2.12 en el primer trimestre de 2017, pero luego releí la primera línea de su respuesta. ¡No es de extrañar que no se haya encontrado la opción para mí en la versión 2.10!
cjsimon
1
Intenté git merge --continue y Git Bash no pudo reconocer eso como un comando. Pero lo que funcionó fue git commit -m "Mensaje de compromiso"
Mimi
2
@Mimi OK, pero ¿estás usando un Git 2.12 o más?
VonC
@VonC tienes razón, estoy usando una versión anterior de Git!
Mimi
23

En caso de que alguna vez te quedes atascado durante una fusión / rebase, siempre puedes

git reset --hard

para restaurar su trabajo al estado de la última confirmación. Esto perderá sus cambios del árbol de trabajo, por lo que si tuvo modificaciones locales antes de la fusión, desaparecerán después de esto, por lo que es aconsejable no iniciar una fusión cuando tenga modificaciones locales. :)

Bombe
fuente
15
advertencia obligatoria: git reset --hardlanza cambios de distancia no comprometidos
Geoffrey Hale
2
¿Por qué no simplemente git merge --abort, que no tiene riesgo de perder nada?
Alexander George
11

Cada vez que fusiona dos ramas con el comando git merge brancha branchb, hay dos posibilidades:

  1. Una rama (digamos brancha) puede ser alcanzada por la otra rama (digamos branchb) siguiendo su historial de confirmaciones. En este caso, git simplemente avanza rápidamente la cabeza para señalar la rama reciente (en este caso branchb).

    2. Pero si las dos ramas han divergido en algún punto anterior, git crea una nueva instantánea y agrega una nueva confirmación que apunta a ella. Entonces, en caso de que no haya conflicto entre las ramas que está fusionando, git crea sin problemas una nueva confirmación.

Ejecute git logpara ver la confirmación después de haber fusionado dos ramas no conflictivas.

Ahora volviendo al caso interesante cuando hay conflictos de fusión entre las ramas de fusión. Cito esto de la página https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging

Git no ha creado automáticamente una nueva confirmación de fusión. Ha pausado el proceso mientras resuelve el conflicto. Si desea ver qué archivos están sin fusionar en cualquier momento después de un conflicto de fusión, puede ejecutargit status


Entonces, en caso de que haya conflictos de fusión, debe resolver el conflicto y luego agregar los cambios que ha realizado al área de preparación utilizando git add filenamey luego confirmar los cambios utilizando el comando git commit que git detuvo debido al conflicto. Espero que esto explique su consulta. También visite el enlace de arriba para una comprensión detallada. En caso de cualquier consulta, por favor comente a continuación, estaré encantado de ayudarlo.

Sourav Prem
fuente
7

Los siguientes pasos después de resolver los conflictos manualmente son: -

  1. git add.
  2. estado de git (esto le mostrará qué comandos son necesarios para continuar con el procedimiento de fusión automática)
  3. [git comando sugiere, por ejemplo git merge --continue, git cherry-pick --continue, git rebase --continue]
Timidfriendly
fuente
16
No hay git merge --continuar
Hola Soy Edu Feliz Navidad
@HolaSoyEduFelizNavidad Esto es incorrecto. Salida de Zie Git a continuación después del conflicto: error: Failed to merge in the changes. Patch failed at 0001 ADD: _type to styleguide The copy of the patch that failed is found in: .git/rebase-apply/patch When you have resolved this problem, run "git rebase --continue". If you prefer to skip this patch, run "git rebase --skip" instead. To check out the original branch and stop rebasing, run "git rebase --abort".
Timidfriendly
55
Hay rebase --continuar, no fusionar --continuar
Hola Soy Edu Feliz Navidad
git merge --continue, que es lo que estoy tratando de hacer, da como resultado error: unknown option 'continue'. Estoy seguro de que su respuesta es incorrecta, ya que la git-mergepágina del manual no la incluye. ¿Qué versión de Git estás usando? Estoy usando git version 1.8.5.2 (Apple Git-48). También probé con MacPorts git version 2.9.3.
jww
1
Con git 2.10 para una fusión simple, el comando es simplemente antiguogit commit
Chris Charabaruk
2

Un conflicto de fusión ocurre cuando dos ramas que está intentando fusionar cambian la misma parte del mismo archivo. Puede generar una lista de conflictos con git status.

Cuando se encuentra la línea en conflicto, Git editará el contenido de los archivos afectados con indicadores visuales que marcan ambos lados del contenido en conflicto.

<<<<<<< HEAD
conflicted text from HEAD
=======
conflicted text from merging_branch
>>>>>>> merging_branch

Cuando arregle sus archivos en conflicto y esté listo para fusionar, todo lo que tiene que hacer es ejecutar git addy git commitgenerar la confirmación de fusión. Una vez que se realizó la confirmación, git pushlos cambios a la rama.

Artículo de referencia: Git merge .

Nesha Zoric
fuente
2

Después de agregar todos los archivos, el siguiente paso es un " git commit ".

"git status" sugerirá qué hacer: los archivos que aún no se han agregado se enumeran en la parte inferior, y una vez que estén listos, sugerirán una confirmación en la parte superior, donde explica el estado de fusión de la rama actual.

duende
fuente
1

Lo primero que quiero dejar en claro es que los nombres de las ramas son solo un alias para una confirmación específica. un commit es lo que funciona git, cuando tiras, presionas fusionar y así sucesivamente. Cada confirmación tiene una identificación única.

Cuando haces la fusión $ git, lo que realmente está sucediendo es que git intenta adelantar tu rama actual al commit en el que está activada la rama referenciada (en otras palabras, ambos nombres de rama apuntan al mismo commit). Este escenario es el más fácil para git para tratar, ya que no hay nuevo compromiso. Piensa en el maestro saltando sobre el lilipad en el que se relaja tu rama. Es posible establecer el indicador --no-ff, en cuyo caso git creará una nueva confirmación independientemente de si hubo algún conflicto de código.

En una situación en la que hay conflictos de código entre las dos ramas que está intentando fusionar (generalmente dos ramas cuyo historial de compromisos comparten un compromiso común en el pasado), el avance rápido no funcionará. Es posible que git pueda fusionar automáticamente los archivos, siempre que ambas ramas no hayan cambiado la misma línea en un archivo en conflicto. en este caso, git fusionará los archivos en conflicto por usted Y los confirmará automáticamente. Puede obtener una vista previa de cómo git haciendo $ git diff --cached. O puede pasar el indicador --no-commit al comando merge, que dejará los archivos modificados en su índice que necesitará agregar y confirmar. Pero puede $ git diff estos archivos para revisar qué cambiará la fusión.

El tercer escenario es cuando hay conflictos que git no puede resolver automáticamente. En este caso, deberá fusionarlos manualmente. En mi opinión, esto es más fácil de hacer con una fusión tomada, como araxis merge o p4merge (gratis). De cualquier manera, debe hacer cada archivo uno por uno. Si la fusión parece estar atascada, use $ git merge --continue, para empujarla. Git debería decirte si no puede continuar, y si es así, ¿por qué no? Si en algún momento sientes que has desarmado la fusión, puedes hacer $ git merge --abort, y cualquier fusión se deshará y podrás comenzar de nuevo. Cuando haya terminado, cada archivo que fusionó será un archivo modificado que debe agregarse y confirmarse. Puede verificar dónde están los archivos con el estado $ git. Si aún no ha confirmado los archivos combinados. Debe hacer eso para completar la fusión.

Harry Robbins
fuente
0

Puede ser tarde Sucede porque su git HEAD no está actualizado. este elogio resolvería eso git reset HEAD.

s.morteza malekabadi
fuente