2012-01-08 25 views
8

He estado trabajando en una copia local de un git repo remoto. Creé una rama en mi copia local, llamémosla 'my_branch'. Me he comprometido algunas veces en my_branch.Git rebase una rama en el maestro falló, ¿cómo resolver?

Hace poco empujé 'my_branch' al control remoto. Sin embargo, no sabía que alguien más había agregado una versión al maestro remoto. Entonces, lo fui a buscar a mi maestro local.

Así que ... para abreviar, mi repositorio local se ve así (estoy intentando usar la convención de diagramación here).

--C0--------------C7-- (local master) 
     \ 
     --C1-C2-C3--  (local my_branch) 
      \ 
       --C4-C5-C6--  (local sandbox_branch) 

quiero que se vea como:

--C0--------------C7-- (local master) 
         \ 
         --C1'-C2'-C3'--  (local my_branch) 
          \ 
           --C4'-C5'-C6'--  (local sandbox_branch) 

Traté de rebase my_branch SOBRE maestro local pero me dio este mensaje de error (estoy usando una herramienta visual para git llamada GitX):

Rebase Failed! 
There was an error rebasing HEAD with branch 'master'. 

command: git rebase refs/heads/master 

It seems that I cannot create a rebase-apply directory, and 
I wonder if you are in the middle of patch application or another 
rebase. If that is not the case, please 
    rm -fr /my_project_directory/.git/rebase-apply 
and run me again. I am stopping in case you still have something 
valuable there. 

¿Qué estoy haciendo mal? ¿Cómo debería manejar esto? Si tuviera que hacer esto en la línea de comando, ¿cuál es el comando para llevarme al estado en el diagrama de arriba?

ACTUALIZA 1

Por cierto, no estoy en el medio de un parche u otra aplicación de rebase ... al menos no intencional. Después de descubrir que el control remoto se actualizó DESPUÉS de presionar, hice una búsqueda. ¿Podría eso haber hecho algo para que GitX piense que estoy en medio de un parche de aplicación u otra rebase?

También he actualizado el diagrama para que sea más preciso. Hay una rama fuera de my_branch. No lo incluí en la pregunta original b/c. No pensé que importaría. Estoy incluyendo si acaso ...

ACTUALIZACIÓN 2

FYI ... El árbol maestro para 'local' y 'remoto' se ve como el diagrama que dibujé, excepto que doesn' t tiene la sandbox_branch.

+0

¿Has probado 'git rebase --abort'? –

+0

"Parece que no puedo crear un directorio de aplicación de rebase, y Me pregunto si estás en medio de la aplicación de parches u otra rebase" <- ¿es este el caso? – fge

+0

@fge. Buena pregunta. Actualicé la descripción. – milesmeow

Respuesta

24

git rebase ha encontrado un directorio .git/rebase-apply y asume que puede estar en medio de una rebase. Esto hubiera sucedido si hubo un conflicto durante una rebase previa y la rebase no se terminó; es decir, no ejecutó uno de git rebase --abort, git rebase --skip o git rebase --continue (el último después de resolver el conflicto).

De todos modos, no importa cómo terminó en este estado si no cree que haya ejecutado git rebase en absoluto. Simplemente rm -fr /my_project_directory/.git/rebase-apply como sugiere la ayuda y debería poder hacer la rebase ahora.

Pero espera. Como dice que ya ha publicado su sucursal en el repositorio remoto, no debe intentar volver a establecer el maestro. De hecho, si su control remoto está configurado para denegar confirmaciones de avance rápido (lo que parece ser una mejor práctica generalmente recomendada), ni siquiera podrá enviar los cambios reestablecidos a su control remoto. En general, es una mala práctica intentar modificar una confirmación (que es lo que hace git rebase) después de haberla publicado en un control remoto.

+0

Uh oh ... ¿Qué debería hacer? Soy bastante nuevo en git. 'git rebase --abort' primero? FYI ... El árbol maestro para 'local' y para 'remoto' se parece al diagrama que dibujé, excepto que no tiene el sandbox_branch. – milesmeow

+0

Supongo que podría fusionar mis cambios en master localmente ... y luego presionar a control remoto ... ¿es el camino a seguir? – milesmeow

+0

¿Desea publicar estos cambios en el maestro remoto? En caso afirmativo, debe fusionar la rama en maestro y enviar a remoto. Si solo quiere asegurarse de que los últimos cambios de la maestra también sean parte de su sucursal, combine la maestra en su sucursal local y envíela a su control remoto. –

Cuestiones relacionadas