conflicto de fusión de git rebase

91

Bifurqué un repositorio de github y trabajé en mi repositorio de github.
Hice solicitudes de extracción y se completó.

Después de eso, el upstream tuvo más confirmaciones, así que ahora quiero cambiar la base, supongo que eso es lo que tengo que hacer.
Pero tengo estos conflictos de fusión:

First, rewinding head to replay your work on top of it...
Applying: Issue 135 homepage refresh
Using index info to reconstruct a base tree...
<stdin>:17: trailing whitespace.
      %h4 
warning: 1 line adds whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging app/views/layouts/application.html.haml
CONFLICT (content): Merge conflict in app/views/layouts/application.html.haml
Auto-merging app/views/home/index.html.haml
CONFLICT (content): Merge conflict in app/views/home/index.html.haml
Auto-merging app/views/home/_group_projects.html.haml
CONFLICT (content): Merge conflict in app/views/home/_group_projects.html.haml
Failed to merge in the changes.
Patch failed at 0001 Issue 135 homepage refresh

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To check out the original branch and stop rebasing run "git rebase --abort".

No sé cómo solucionarlos, por favor ayuda.

pahnin
fuente
Eche un vistazo a mi respuesta en esta publicación: stackoverflow.com/questions/48307297/…
Abhishek

Respuestas:

121

Rebasar puede ser un verdadero dolor de cabeza. Tienes que resolver los conflictos de fusión y continuar reajustando. Por ejemplo, puede utilizar la herramienta de combinación (que difiere según su configuración)

git mergetool

Luego agrega tus cambios y continúa

git rebase --continue

Buena suerte

iltempo
fuente
2
sí, el rebase es un dolor de cabeza, ¿puedo usar git pull upstream master?
pahnin
2
Sí, puedes intentarlo. La diferencia es que sus confirmaciones no se colocan encima de las del flujo ascendente en ese momento. Potencialmente, hay menos conflictos de fusión.
iltempo
7
@iitempo No necesitas hacer un compromiso. Solo un git add es suficiente para permitir que continúe el rebase.
enigmaticFysicist
45

Cuando tiene un conflicto durante el rebase, tiene tres opciones:

  • Puede ejecutar git rebase --abortpara deshacer completamente el rebase. Git lo devolverá al estado de su rama como estaba antes de que se llamara a git rebase.

  • Puede ejecutar git rebase --skippara omitir completamente la confirmación. Eso significa que no se incluirá ninguno de los cambios introducidos por la confirmación problemática. Es muy raro que elija esta opción.

  • Puedes arreglar el conflicto como dijo iltempo. Cuando haya terminado, deberá llamar git rebase --continue. Mi mergetool es kdiff3 pero hay muchas más que puede utilizar para resolver conflictos. Solo necesita configurar su herramienta de combinación en la configuración de git para que se pueda invocar cuando llame a git mergetool https://git-scm.com/docs/git-mergetool

Si nada de lo anterior le funciona, salga a caminar y vuelva a intentarlo :)

Uga Buga
fuente
2
Sí, pero ¿cómo solucionar el conflicto? esa es la pregunta
Qué
@KansaiRobot Una opción para realizar la corrección manual: abra el archivo en conflicto en un editor de texto y busque<<<<<
spinup
16

Si tiene muchos compromisos para reajustar, y alguna parte de ellos está dando conflictos, eso realmente duele. Pero puedo sugerir un enfoque menos conocido sobre cómo "aplastar todos los conflictos".

Primero, verifique la rama temporal y comience la combinación estándar

git checkout -b temp
git merge origin/master

Tendrás que resolver los conflictos, pero solo una vez y solo los reales. Luego, configure todos los archivos y termine de fusionar.

git commit -m "Merge branch 'origin/master' into 'temp'"

Luego regrese a su rama (que sea alfa ) y comience a rebase, pero con la resolución automática de cualquier conflicto.

git checkout alpha
git rebase origin/master -X theirs

Se ha modificado la base de la rama, pero es probable que el proyecto esté en un estado no válido. Está bien, tenemos un paso final. Solo necesitamos restaurar el estado del proyecto, por lo que será exacto como en la rama 'temp'. Técnicamente, solo necesitamos copiar su árbol (estado de carpeta) mediante el comando de bajo nivel git commit-tree . Además, la fusión en la rama actual acaba de crear la confirmación.

git merge --ff $(git commit-tree temp^{tree} -m "Fix after rebase" -p HEAD)

Y eliminar rama temporal

git branch -D temp

Eso es todo. Hicimos un rebase mediante fusión oculta.

También escribí un guión, para que se pueda hacer en forma de diálogo, lo puedes encontrar aquí .

baur
fuente
13

Nota: con Git 2.14.x / 2.15 (Q3 2017), el git rebasemensaje en caso de conflictos será más claro.

Consulte la confirmación 5fdacc1 (16 de julio de 2017) de William Duclot ( williamdclt) .
(Combinado por Junio ​​C Hamano - gitster- en el compromiso 076eeec , 11 de agosto de 2017)

rebase: hacer que el mensaje de resolución sea más claro para los usuarios sin experiencia

Antes de:

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"

Después:

Resolve all conflicts manually, 
mark them as resolved with git add/rm <conflicted_files>
then run "git rebase --continue".

You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".')

La interfaz de usuario de git se puede mejorar dirigiendo los mensajes de error a aquellos a quienes ayudan: usuarios de git casuales y sin experiencia.
Con este propósito, es útil asegurarse de que los términos utilizados en esos mensajes puedan ser entendidos por este segmento de usuarios y que los guíen para resolver el problema.

En particular, no aplicar un parche durante una git rebase es un problema común que puede ser muy desestabilizador para el usuario sin experiencia.
Es importante guiarlos hacia la resolución del conflicto (que es un proceso de 3 pasos, por lo tanto complejo) y asegurarles que pueden escapar de una situación que no pueden manejar " --abort".
Este compromiso responde a esos dos puntos detallando el proceso de resolución y evitando git linguo críptico.

VonC
fuente
1
¡Agradable! La página de ayuda dice que resuelva el conflicto confirmando el cambio, ¡pero no! ¡Aquí tenemos que omitir el compromiso y simplemente continuar la fusión en su lugar! (página de ayuda: help.github.com/articles/… )
Jerther