Git rebase: los conflictos siguen bloqueando el progreso


Tengo una rama git (llamada v4), que se hizo desde master justo ayer. Hubo un par de cambios en master, que quiero entrar en v4. Así, en v4, traté de hacer un rebase de maestro, y un archivo sigue arruinando las cosas: un archivo de texto de una línea, que contiene el número de versión. Este archivo es app/views/common/version.txt, que antes de rebase contiene este texto:

v1.4-alpha-02

Esto es lo que estoy haciendo:

> git rebase master
First, rewinding head to replay your work on top of it...
Applying: new version, new branch
error: patch failed: app/views/common/version.txt:1
error: app/views/common/version.txt: patch does not apply
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging app/views/common/version.txt
CONFLICT (content): Merge conflict in app/views/common/version.txt
Failed to merge in the changes.
Patch failed at 0001 new version, new branch

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

El version.txt ahora se ve así:

<<<<<<< HEAD:app/views/common/version.txt
v1.4-alpha-02
=======
v1.4-alpha-01
>>>>>>> new version, new branch:app/views/common/version.txt

Así que, lo ordeno y ahora se ve así:

v1.4-alpha-02

Y luego traté de continuar: al principio intento un commit: {[11]]}

> git commit -a -m "merged"
# Not currently on any branch.
nothing to commit (working directory clean)

No hubo suerte. Por lo tanto, yo estaba tratando de añadir el archivo:

git add app/views/common/version.txt

No hay respuesta. No tener noticias es una buena noticia, supongo. Por lo tanto, trato de continuar:

> git rebase --continue
Applying: new version, new branch
No changes - did you forget to use 'git add'?

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

Es en este punto, después de dar vueltas y vueltas con esto, que estoy golpeando mi cabeza del escritorio.

¿Qué está pasando aquí? ¿Qué estoy haciendo mal? ¿Alguien puede enderezarme?

EDITAR-para unutbu

Cambié el archivo como sugeriste y obtuve el mismo error:

> git rebase master
First, rewinding head to replay your work on top of it...
Applying: new version, new branch
error: patch failed: app/views/common/version.txt:1
error: app/views/common/version.txt: patch does not apply
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging app/views/common/version.txt
CONFLICT (content): Merge conflict in app/views/common/version.txt
Failed to merge in the changes.
Patch failed at 0001 new version, new branch

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".
 105
Author: Alex.K., 2010-10-27

6 answers

Me encontré con un problema similar con un rebase. Mi problema fue causado porque una de mis confirmaciones solo cambió un archivo, y al resolver, descarté el cambio introducido en esta confirmación. Pude resolver mi problema omitiendo la confirmación correspondiente (git rebase --skip).

Puede reproducir este problema en un repositorio de pruebas. Primero crea el repositorio.

$ mkdir failing-merge
$ cd failing-merge
$ git init
Initialized empty Git repository in $HOME/failing-merge/.git/

Luego confirme el contenido original de version.txt en master.

$ echo v1.4-alpha-02 > version.txt
$ git add version.txt
$ git commit -m initial
[master (root-commit) 2eef0a5] initial
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 version.txt

Crear la rama v4 y cambiar la contenido de version.txt.

$ git checkout -b v4
Switched to a new branch 'v4'
$ echo v1.4-alpha-03 > version.txt
$ git add version.txt
$ git commit -m v4
[v4 1ef8c9b] v4
 1 files changed, 1 insertions(+), 1 deletions(-)

Vuelva a master y cambie el contenido de version.txt para que haya un conflit durante el rebase.

$ git checkout master
Switched to branch 'master'
$ echo v1.4-alpha-04 > version.txt
$ git add version.txt
$ git commit -m master
[master 7313eb3] master
 1 files changed, 1 insertions(+), 1 deletions(-)

Vuelva a la rama v4 e intente rebase. Falla con un conflit en version.txt como estaba previsto.

$ git checkout v4
Switched to branch 'v4'
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: v4
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging version.txt
CONFLICT (content): Merge conflict in version.txt
Recorded preimage for 'version.txt'
Failed to merge in the changes.
Patch failed at 0001 v4

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".
$ cat version.txt
<<<<<<< HEAD
v1.4-alpha-04
=======
v1.4-alpha-03
>>>>>>> v4

Resolvemos el conflicto seleccionando el contenido master de version.txt. Añadimos el archivo y tratamos de continuar nuestra rebase.

$ echo v1.4-alpha-04 > version.txt
$ git add version.txt
$ git rebase --continue 
Applying: v4
No changes - did you forget to use 'git add'?
If there is nothing left to stage, chances are that something else
already introduced the same changes; you might want to skip this patch.

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

¡Falla ! Vamos a ver qué cambios git creo que hay en nuestra repositorio.

$ git status
# Not currently on any branch.
nothing to commit (working directory clean)

Ah ah, no hay cambio. Si lee en detalle el mensaje de error anterior, git nos informó de esto y recomendó usar git rebase --skip. Nos dijo: "Si no queda nada por hacer, lo más probable es que algo más ya haya introducido los mismos cambios; es posible que desee omitir este parche."Así que simplemente nos saltamos el commit y el rebase tiene éxito.

$ git rebase --skip
HEAD is now at 7313eb3 master

Palabra de precaución : Tenga en cuenta que git rebase --skip eliminará completamente el commit que git intentó para rebase. En nuestro caso, esto debería estar bien ya que git se queja de que esto es una confirmación vacía. Si cree que ha perdido los cambios una vez que se ha completado la rebase, puede usar git reflog para obtener el id de confirmación de su repositorio antes de la rebase, y usar git reset --hard para recuperar su depósito en ese estado (esta es otra operación destructiva).

 93
Author: Sylvain Defresne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-07 18:49:54

Citando de aquí: http://wholemeal.co.nz/node/9

¿Eh?!? No, no me olvidé de usar git add, lo hice ... como ... 2 segundos ¡hace!

Resulta que porque no hay cambio desde el parche git sospecha algo ha ido mal. Git espera un parche que se han aplicado, pero el el archivo se ha mantenido sin cambios.

El mensaje de error no es muy intuitiva, pero contiene la respuesta. Sólo tenemos que decirle a rebase saltar este parche. Tampoco lo es. necesario para fijar los marcadores de conflicto en el archivo. Terminarás con el versión del archivo de la rama en la que se encuentra cambio de base.

$ git rebase --skip
 18
Author: Bijou Trouvaille,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-31 10:35:11

Cambia app/views/common/version.txt a

v1.4-alpha-01

En este punto de la rebase, recuerde que está resolviendo conflictos de fusión para mostrar la progresión de la rama no maestra.

Por lo tanto, en el rebase de

      A---B---C topic
     /
D---E---F---G master

A

              A*--B*--C* topic
             /
D---E---F---G master

El conflicto que está resolviendo está en cómo crear un* en la rama topic.

Así que después de hacer git rebase --abort, los comandos deben ser

git checkout topic
git rebase master
< make edits to resolve conflicts >
git add .
git rebase --continue
 6
Author: unutbu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-29 12:50:20

Aquí hay algunas ideas:

 4
Author: Adam Monsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-31 13:38:29

Ese mensaje de error es el resultado de su git commit -a -m "merged". Si solo arregla el archivo, luego ejecuta git add <file> y git rebase --continue, debería funcionar bien. git rebase --continue está tratando de hacer un commit, pero encontrando que no hay cambios pendientes para commit (porque ya los has commiteado).

 4
Author: twalberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-05-22 15:18:24

El comportamiento que estás viendo no es lo que esperaría de un típico rebase con solo este conflicto. Considere usar una rama separada para hacer este rebase (especialmente si ya ha enviado las confirmaciones de forma remota que está haciendo un reenvío rápido). Además, git mergetool puede ser útil para resolver conflictos y recordar emitir un git add.

En este ejemplo mínimo, la rebase funciona como se espera. ¿Puede proporcionar un ejemplo que muestre el comportamiento que está viendo?

#!/bin/bash

cd /tmp
mkdir rebasetest
cd rebasetest
git init
echo 'v1.0' > version.txt
git add version.txt
git commit -m 'initial commit'
git checkout -b v4
echo 'v1.4-alpha-01' > version.txt
git add version.txt
git commit -m 'created v4'
git checkout master
git merge v4
echo 'v1.4-alpha-01-rc1' > version.txt
git add version.txt
git commit -m 'upped version on master to v1.4-alpha-01-rc1'
git checkout v4
echo 'v1.4-alpha-02' > version.txt
git add version.txt
git commit -m 'starting work on alpha-02'

git rebase master
echo 'v1.4-alpha-02' > version.txt
git add version.txt
git rebase --continue
 3
Author: Ben Taitelbaum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-27 13:25:30