Tengo lo siguiente en el texto de tareas pendientes 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 elijo el segundo agregando "s" antes del primero, aparece el siguiente error:
Cannot 'squash' without a previous commit
¿Alguien puede explicarme qué significa y cómo lo hago?
Quiero aplastar la primera confirmación ( 56bcce7
) y "seleccionar y reformular" la segunda ( e43ceba
) confirmación
Respuestas:
La rebase interactiva presenta las confirmaciones en el orden inverso al que está acostumbrado cuando usa
git log
.git rebase -i
reproduce las confirmaciones seleccionadas en el orden exacto (de arriba hacia abajo) en que aparecen en el archivo de instrucciones de rebase guardado. Al aplastar, la confirmación seleccionada para aplastar se combina con la confirmación que la precede en la lista (editada), es decir, la confirmación de la línea anterior. En su caso, no hay confirmación previa para56bcce7
. Tienes que hacer una de las siguientesgit rebase -i HEAD~3
(si quiere aplastar56bcce7
a684f917
)Si desea combinar
56bcce7
cone43ceba
, ye43ceba
no depende de56bcce7
, simplemente reordenarlos:ACTUALIZACIÓN : la respuesta de Gus a continuación sugiere una mejor manera de hacer lo mismo, sin reordenar las dos confirmaciones:
Esto aplastará / fusionará las dos confirmaciones en una. Cuando la rebase interactiva solicite un mensaje de confirmación reformulado
56bcce7
, proporcione el mensaje de confirmación que describe la unión de56bcce7
ye43ceba
.fuente
56bcce7
ale43ceba
. Entonces, ¿cómo hago el Paso 1 aquí?Tuve un problema similar que resolví de la siguiente manera:
Este es el grupo de confirmación que quería aplastar:
Como puede ver, no quería. 4, pero 1, 2 y 3 no tenían compromisos previos para jugar . Por lo tanto, no se puede 'aplastar' sin un error de confirmación previo .
Mi solución fue usar la
r
opción para# r, reword = use commit, but edit the commit message
Entonces mi lista de confirmaciones se veía así:
Después de guardar, el shell interactivo me pidió la nueva redacción de la confirmación elegida.
Después de eso, mi registro de confirmaciones resultó en una única confirmación que resultó en un historial de confirmaciones más limpio.
fuente
git rebase --edit-todo
y corregir esta respuesta y luego hacerlogit rebase --continue
Tuve este problema y la razón por la que sucedió en mi caso fue que no se pueden aplastar confirmaciones anteriores en una nueva confirmación. Aquí hay un ejemplo que dice que tiene 3 confirmaciones:
Ahora si dices
git rebase -i HEAD~3
y haces algo comoEsto resultará en el error:
Solucion:
Al aplastar las confirmaciones, debe aplastar las confirmaciones recientes con las antiguas y no al revés, por lo que en el ejemplo será algo como esto:
Esto funcionará bien, en caso de que desee todos sus mensajes de confirmación, sugeriría que se arreglen en lugar de aplastar .
fuente
Aplasta con la lógica inversa . Podrá seleccionar el mensaje de confirmación deseado en el paso posterior.
pick
la primera confirmación para la que no desea el mensaje de confirmación.squash
ofixup
las confirmaciones que desea fusionar, hasta la que tenga el mensaje de confirmación que realmente deseaba.:x
)Lint.py: Replace deprecated link
.:x
)Espero que sea más claro para alguien ✌🏽
fuente
Será mejor decir en el editor interactivo que contiene las confirmaciones, git siempre aplasta de abajo hacia arriba y uno debe dejar una entrada de "selección" en la parte superior para recibir las combinaciones desde abajo.
fuente
Solo probé este enfoque.
Esto mostraría las últimas 3 confirmaciones, lo que me daría una idea de cuál es la última confirmación y cuál fue anteriormente. Ahora dicho rebase,
Elija la última confirmación además de la que necesitamos aplastar las otras dos. El ID de confirmación que se elige como confirmación base sería como,
Para los otros dos ID de confirmación, cámbielos a,
o simplemente,
fuente
También me he encontrado con este problema en este momento, eso es simplemente un descuido. Puede resolver el problema como el siguiente: cuando intente aplastar el primero (56bcce7) y elija el segundo, debe agregar "s" antes de la segunda línea, pero no el primero. también puede consultar el siguiente sitio web: http://backlogtool.com/git-guide/en/stepup/stepup7_5.html
fuente