¿Combinar las dos primeras entradas del repositorio Git?

Supongamos que tiene una historia que contiene tres confirmaciones A, B y C :

 ABC 

Me gustaría combinar dos comités A y B con un pestillo AB :

 AB-C 

Lo intenté

 git rebase -i A 

que abre mi editor con el siguiente contenido:

 pick e97a17b B pick asd314f C 

Lo cambio a

 squash e97a17b B pick asd314f C 

Entonces Git 1.6.0.4 dice:

 Cannot 'squash' without a previous commit 

¿Hay una manera o es simplemente imposible?

172
12 янв. establecido por Christian el 12 de enero 2009-01-12 17:53 '09 a las 17:53 2009-01-12 17:53
@ 7 respuestas

Utilice git rebase -i --root con Git versión 1.7.12 .

En el archivo de reescritura en línea, cambie la segunda línea de corrección de B para aplastar y deje las líneas restantes en el menú de selección:

 pick f4202da A squash bea708e B pick a8c6abc C 

Esto combinará los dos compromisos A y B con una fijación AB.

Encontrado en esta respuesta .

130
09 февр. respuesta dada por kostmo 09 feb. 2014-02-09 05:14 '14 a las 5:14 2014-02-09 05:14

¿Has probado?

 git rebase -i A 

Puede comenzar de esta manera si continúa con la edit lugar de con squash :

 edit e97a17b B pick asd314f C 
border=0

luego corre

 git reset --soft HEAD^ git commit --amend git rebase --continue 

Esta hecho

124
12 февр. Respuesta dada por David Lichteblau el 12 de febrero. 2009-02-12 17:29 '09 a las 17:29 2009-02-12 17:29

A fue la confirmación inicial, pero ahora desea que B sea ​​la confirmación original. Los compromisos de git son árboles enteros, no diferencias, incluso si generalmente se describen y se ven en términos de la diferencia que introducen.

Esta receta funciona incluso si hay varias confirmaciones entre A y B, y B y C.

61
12 янв. Respuesta dada por Charles Bailey 12 de enero. 2009-01-12 21:46 '09 a las 9:46 PM 2009-01-12 21:46

En el caso de la reinstalación en línea, debe hacerlo antes de A, para que la lista sea:

 pick A pick B pick C 

convertirse en

 pick A squash B pick C 

Si A es una confirmación inicial, debe tener una confirmación inicial diferente antes de que A. Git piense en las diferencias; funcionará para la diferencia entre (A y B) y (B y C). Por lo tanto, el squash no funciona en tu ejemplo.

10
12 янв. La respuesta la da Loki el 12 de enero. 2009-01-12 18:05 '09 a las 6:05 pm 2009-01-12 18:05

En caso de que tenga cientos o miles de confirmaciones, utilice la respuesta de kostmo.

 git rebase -i --root 

puede ser poco práctico y lento, simplemente debido a la gran cantidad de confirmaciones que el script de rebase debe procesar dos veces, una para crear una lista de editor de lista de redireccionamiento interactivo (donde elige qué acción realizar para cada confirmación) y una volver a aplicar los compromisos.

Aquí hay una solución alternativa que evitará el tiempo necesario para crear una lista de editor de lista de redirección interactiva sin utilizar primero la redirección interactiva. Por lo tanto, esto es similar a la decisión de Charles Bailey . Simplemente creas una rama huérfana desde el segundo commit, y luego reinstalas todos los descendientes en la parte superior:

git -checkout (1) página de manual 
  • git -rebase (1) página de manual
  • 7
    23 июля '14 в 18:00 2014-07-23 18:00 la respuesta la da el usuario 456814, 23 de julio de 2014 a las 18:00 2014-07-23 18:00

    En una pregunta relacionada, logré encontrar un enfoque diferente a la necesidad de aplastar el primer compromiso, que, por cierto, lo haría segundo.

    Si tienes curiosidad: git: ¿cómo insertar una solución como la primera, cambiando todo el resto?

    1
    14 марта '09 в 11:15 2009-03-14 11:15 la respuesta la da kch el 14 de marzo de 2009 a las 11:15, 2009-03-14 11:15

    Necesitas hacer algo de magia en la línea de comandos.

     git checkout -ba A git checkout B <files> git commit --amend git checkout master git rebase a 

    Esto debería dejarte con una sucursal en la que se comprometerán AB y C.

    -1
    12 янв. La respuesta se da Bombe 12 jan. 2009-01-12 18:36 '09 a las 18:36 2009-01-12 18:36

    Otras preguntas acerca de las etiquetas o Haz una pregunta