tutorial stackoverflow explicado git rebase

stackoverflow - git rebase tutorial



Git: error de "No se puede ''aplastar'' sin una confirmaciĆ³n previa" al volver a redactar (4)

El rebase interactivo presenta confirmaciones en el orden inverso al que estás acostumbrado cuando usas git log . git rebase -i reproduce las confirmaciones seleccionadas en el orden exacto (de arriba hacia abajo) que se enumeran en el archivo de instrucciones de rebase guardado. Al aplastar, el compromiso seleccionado para el aplastamiento se combina con el compromiso que lo precede en la lista (editada), es decir, el compromiso de la línea anterior. En su caso, no hay confirmación previa para 56bcce7 . Tienes que hacer uno de los siguientes

  • git rebase -i HEAD~3 (si quieres aplastar 56bcce7 en 684f917 )
  • Si quiere combinar 56bcce7 con e43ceba y e43ceba no depende de 56bcce7 , simplemente 56bcce7 :

    r e43ceba Lint.py: Replace deprecated link s 56bcce7 Closes #2774

    ACTUALIZACIÓN : la respuesta de Gus a continuación sugiere una mejor manera de hacer lo mismo, sin reordenar las dos confirmaciones:

    r 56bcce7 Closes #2774 s e43ceba Lint.py: Replace deprecated link

    Esto aplastará / fusionará los dos commits en uno. Cuando la nueva versión interactiva solicite un mensaje de 56bcce7 para 56bcce7 , proporcione el mensaje de confirmación que describa la unión de 56bcce7 y e43ceba .

Tengo lo siguiente en el texto de git rebase -i HEAD~2 de git rebase -i HEAD~2 :

pick 56bcce7 Closes #2774 pick e43ceba Lint.py: Replace deprecated link # Rebase 684f917..e43ceba onto 684f917 (2 command(s)) # ...

Ahora, cuando trato de aplastar el primero ( 56bcce7 ) y elegir el segundo agregando "s" antes del primero, 56bcce7 el siguiente error:

Cannot ''squash'' without a previous commit

¿Alguien puede explicarme qué significa y cómo lo hago?

Quiero aplastar el primer commit ( 56bcce7 ) y "seleccionar y reformular" el segundo e43ceba ( e43ceba )


También ya me he encontrado con este problema en este momento, eso es descuidado. Puede resolver el problema de la siguiente manera: cuando intenta aplastar el primero (56bcce7) y elegir el segundo, debe agregar "s" antes de la segunda línea, pero No el primero. También puede hacer referencia al siguiente sitio web: http://backlogtool.com/git-guide/en/stepup/stepup7_5.html


Tuve este problema y la razón por la que sucedió en mi caso fue que no se pueden aplastar las confirmaciones anteriores en una nueva confirmación. Aquí hay un ejemplo que dice que tiene 3 confirmaciones:

1 pick 01mn9h78 The lastest commit 2 pick a2b6pcfr A commit before the latest 3 pick 093479uf An old commit i made a while back

Ahora si dices git rebase -i HEAD~3 y haces algo como

1 pick 01mn9h78 The lastest commit 2 s a2b6pcfr A commit before the latest 3 s 093479uf An old commit i made a while back

Esto dará como resultado el error:

error: no se puede ''aplastar'' sin una confirmación previa Puede solucionar esto con ''git rebase --edit-todo'' y luego ejecutar ''git rebase --continue''. O puede abortar el rebase con ''git rebase --abort''.

Solución:

Al aplastar los commits, debe aplastar los commits recientes a los antiguos, no al revés, por lo tanto, en el ejemplo, será algo como esto:

1 s 01mn9h78 The lastest commit 2 s a2b6pcfr A commit before the latest 3 pick 093479uf An old commit i made a while back

Esto funcionará bien, en caso de que desee todos sus mensajes de confirmación, sugeriría una reparación en lugar de squash .


Tuve un problema similar que resolví de la siguiente manera:

Este es el grupo de compromiso que quería aplastar:

1 s 01cc5a08 Removes open div 2 s a2b6eecf Restores old fonts 3 s 603479ff Cleans left out div 4 pick 5afdbc33 Update: show logo on landing page 5 s 04c1cb13 change version of dev and prod from 1 to 2 6 s bbe6a8f8 Update: show logo on landing page if they have one 7 s c0d6008a Adds check for C users

Como puede ver, quería no. 4, pero 1, 2 y 3 no tenían compromiso previo para aplastar . Por lo tanto, no se puede ''aplastar'' sin un error de confirmación anterior .

Mi solución fue usar la opción r para # r, reword = use commit, but edit the commit message

Entonces mi lista de commits se veía así:

1 r 01cc5a08 Removes open div 2 s a2b6eecf Restores old fonts 3 s 603479ff Cleans left out div 4 s 5afdbc33 Update: show logo on landing page 5 s 04c1cb13 change version of dev and prod from 1 to 2 6 s bbe6a8f8 Update: show logo on landing page if they have one 7 s c0d6008a Adds check for C users

Después de guardar, la consola interactiva me pidió que volviera a redactar la confirmación elegida.

Después de eso, mi registro de confirmación resultó en una única confirmación que resultó en un historial de confirmación más limpio.