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".
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).
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
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
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:
- Antes de comenzar la rebase, asegúrese de no estar en medio de una rebase o am. Do:
rm -rf .git/rebase-apply
- Un poco mencionaste que no entendía: "y luego intento continuar: al principio intento un commit:"... ¿por qué comprometerse? En medio de un rebase creo que solo deberías "git add" después de ordenar o "git rm" para lanzar cambios o confirme la eliminación de un archivo. Tal vez metido algo?
- intente combinar en lugar de rebase
- prueba algunas de las ideas de Ethan Rowe
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).
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
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