Supongamos que tiene un historial que contiene las tres confirmaciones A, B y C :
A-B-C
Me gustaría combinar los dos commits A y B en un commit AB :
AB-C
Lo intenté
git rebase -i A
que abre mi editor con los siguientes contenidos:
pick e97a17b B
pick asd314f C
Cambio esto a
squash e97a17b B
pick asd314f C
Entonces Git 1.6.0.4 dice:
Cannot 'squash' without a previous commit
¿Hay alguna manera o es simplemente imposible?
git
rebase
git-rebase
git-rewrite-history
cristiano
fuente
fuente
Respuestas:
Usar a
git rebase -i --root
partir de Git versión 1.7.12 .En el archivo de rebase interactivo, cambie la segunda línea de commit B a squash y deje las otras líneas en pick :
Esto combinará los dos commits A y B en un commit AB .
Encontrado en esta respuesta .
fuente
Intentaste:
Es posible comenzar así si continúa con, en
edit
lugar desquash
:entonces corre
Hecho.
fuente
git rebase --abort
comenzar de nuevo y hacerlo de la manera correcta (sin aplastar el primer commit en el editor)A
fue la confirmación inicial, pero ahora quieresB
ser la confirmación inicial. los commits de git son árboles enteros, no diffs, incluso si normalmente se describen y ven en términos del diff que introducen.Esta receta funciona incluso si hay múltiples confirmaciones entre A y B, y B y C.
fuente
git rebase --onto tmp <sha1_for_B>
En el caso de un rebase interactivo, debe hacerlo antes de A para que la lista sea:
convertirse:
Si A es la confirmación inicial, debe tener una confirmación inicial diferente antes de A. Git piensa en las diferencias, funcionará en la diferencia entre (A y B) y (B y C). Por lo tanto, la calabaza no funciona en su ejemplo.
fuente
En el caso de que tenga cientos o miles de confirmaciones, utilice la respuesta de kostmo de
puede ser poco práctico y lento, solo debido a la gran cantidad de confirmaciones que el script de rebase tiene que procesar dos veces , una para generar la lista interactiva del editor de rebase (donde selecciona qué acción tomar para cada commit), y una vez para ejecutar realmente nueva aplicación de commits.
Aquí hay una solución alternativa que evitará el costo de tiempo de generar la lista del editor de rebase interactivo al no usar un rebase interactivo en primer lugar. De esta manera, es similar a la solución de Charles Bailey . Simplemente cree una rama huérfana a partir de la segunda confirmación, y luego vuelva a basar todas las confirmaciones descendientes encima de ella:
Documentación
fuente
En una pregunta relacionada, logré encontrar un enfoque diferente a la necesidad de aplastar el primer commit, que es, bueno, hacerlo el segundo.
Si está interesado: git: ¿cómo insertar un commit como el primero, cambiando todos los demás?
fuente
Comando git para escuadrón: git rebase -i HEAD ~ [número de confirmaciones]
Digamos que tienes el siguiente historial de git commit:
pick 5152061 feat: Se agregó soporte para guardar la imagen. (A)
elija 39c5a04 Corrección: correcciones de errores. (B)
elija la corrección 839c6b3: conflicto resuelto. (C)
Ahora desea aplastar A y B a AB, realice los siguientes pasos:
pick 5152061 feat: Se agregó soporte para guardar la imagen. (A)
s 39c5a04 Corrección: corrección de errores. (B)
elija la corrección 839c6b3: conflicto resuelto. (C)
Nota: para el squash commit podemos usar squash o s. El resultado final será:
seleccione 5152061 feat: Se agregó soporte para guardar la imagen. (AB)
pick 839c6b3 fix: conflicto resuelto. (C)
fuente
Tienes que realizar un poco de magia de línea de comandos.
Eso debería dejarte con una rama que tiene AB y C como commits.
fuente