Git restablecer rebase actual

3 minutos de lectura

Avatar de usuario de Puppy
Cachorro

He estado haciendo una rebase. Trabajé para solucionar algunos conflictos, pero terminé yendo en la dirección equivocada y ahora solo quiero comenzar de nuevo a solucionar estos conflictos.

Me gustaría restablecer la base, de modo que sigo reorganizando la confirmación actual, pero la copia de trabajo se ha restablecido cuando la confirmación se marcó con conflictos en primer lugar.

¿Cómo puedo restablecer una rebase en el compromiso actual?

Avatar de usuario de Ravi Shrivastava
Ravi Shrivastava

Si estás entre tu rebase, puedes hacer

git rebase --abort

  • Eso abortaría todo el rebase, en lugar de solo rebasar este compromiso.

    – Cachorro

    8 de febrero de 2016 a las 10:18

avatar de usuario de alextercete
alextercete

Si solo desea rehacer una fusión para un archivo específico, todo lo que necesita hacer es:

git checkout -m <file>

Si desea rehacer todo el compromiso, así es como lo hago (probablemente haya una mejor manera de hacerlo):

  1. Hay un conflicto durante el rebase
  2. Me equivoco en la resolución de conflictos
  3. corro un git status que, a partir de Git 2.0.0, me da algo como esto (solo si estás haciendo un rebase interactivo):

    interactive rebase in progress; onto 14ed389
    Last command done (1 command done):
       pick db2511c Modify file
    Next command to do (1 remaining command):
       pick d1c2037 Modify file one more time
      (use "git rebase --edit-todo" to view and edit)
    You are currently rebasing branch 'other' on '14ed389'.
      (fix conflicts and then run "git rebase --continue")
      (use "git rebase --skip" to skip this patch)
      (use "git rebase --abort" to check out the original branch)
    
    Unmerged paths:
      (use "git reset HEAD <file>..." to unstage)
      (use "git add <file>..." to mark resolution)
    
            both modified:   file.txt
    
  4. Copio la línea del comando que se está ejecutando actualmente en la rebase: pick db2511c Modify file
  5. Corro git rebase --edit-todo y pegue la línea en la parte superior del archivo
  6. Corro git rebase --skip

Avatar de usuario de Pierre-Luc Carmel Biron
Pierre-Luc Carmel Biron

Primero, limpia el desorden:

git reset --hard HEAD

Luego, seleccione la confirmación que está reorganizando actualmente:

git cherry-pick -n `git rev-parse REBASE_HEAD`

Eso es. Como de costumbre, podrá continuar con la reorganización después de solucionar los conflictos.

  • Básicamente, esto te permite reiniciar la etapa de rebase actual, ¡increíble!

    – Mitchell Mc Kenna

    22 abr 2021 a las 0:30


Si hace esto a menudo (como yo 😅), puede crear un alias de git útil (basado en la elegante respuesta de Pierre)

[alias]
    # Restart the current rebase step if you accidentally messed it up
    # SEE: https://stackoverflow.com/a/53141807/625710
    restart-rebase-step = !git reset --hard HEAD && git cherry-pick -n `git rev-parse REBASE_HEAD`

Luego puede llamarlo desde la línea de comando:

git restart-rebase-step

Si ha tenido varias confirmaciones editando los mismos archivos en ambas ramas y, durante la reorganización, decidió que desea conservar algo de trabajo, no elimine todos los cambios ya realizados (git rebase --abort) entonces supongo que tendrás que buscar en el directorio .git/rebase-apply y comprobar patch expediente. Contiene todos los cambios realizados durante el rebase. Aplicaría manualmente este parche después de hacer git rebase --abort.

Avatar de usuario de Felipe CS
Felipe C.S.

Para usar la resolución elstgav sin el alias, primero reinicie:

git reset --hard HEAD

Luego obtenga el SHA1 de la rebase:

rev-parse REBASE_HEAD
b10b228e263dfa223221036fa17506445a101f0f // this is the SHA1 value

Después de eso, use el valor SHA1 con el cherry-pick dominio:

git cherry-pick -n b10b228e263dfa223221036fa17506445a101f0f

¿Ha sido útil esta solución?