rebase con autosquash no funciona como se esperaba

autosquash aplastar las últimas 3 confirmaciones utilizando autosquash opciones de autosquash proporcionadas por gitrebase. Tengo la siguiente historia:

 * commit 78a7e4844fa32d2ef1bb7bd9b44c4a1b9551d31a (HEAD, new) | Author: maxim koretskyi <mkoretskyi@company.com> | Date: Fri Feb 20 10:29:48 2015 +0200 | | squash! s3 | * commit f25491cadc646baf14bd7e951245c6777230a1d7 | Author: maxim koretskyi <mkoretskyi@company.com> | Date: Fri Feb 20 10:29:42 2015 +0200 | | squash! s2 | * commit b988237356ffb59752e49049d083c558373f9486 | Author: maxim koretskyi <mkoretskyi@company.com> | Date: Fri Feb 20 10:29:24 2015 +0200 | | squash! s1 | * commit abbcdc833e5eaabe79681bd82087b4d7969e8599 (new1, ne, 9484) | Author: maxim koretskyi <mkoretskyi@company.com> | Date: Wed Feb 18 18:21:58 2015 +0200 | | 3 

¡Así que quiero commits con posts s1 , s2 y s3 con el prefijo squash! ser aplastado Ahora emite el siguiente command:

 $ git rebase -i abbcdc833 --autosquash 

Y entonces git abre un editor de text con el siguiente contenido:

 pick b988237 squash! s1 pick f25491c squash! s2 pick 78a7e48 squash! s3 

Pero esperaba que fuera así:

 pick b988237 squash! s1 squash f25491c squash! s2 squash 78a7e48 squash! s3 

¿Qué estoy haciendo mal?

De la documentation, pero el énfasis es mío:

Cuando el post de logging de compromiso comienza con "squash! …" (o "fixup! …"), y hay un commit cuyo título comienza con el mismo … , modifica automáticamente la list de rebase -i de rebase -i para que la confirmación marcada para aplastar viene justo después del compromiso para ser modificado, y cambia la acción de la confirmación movida de pick a squash (o fixup). Ignora la subsiguiente "corrección" o "¡aplastar!" Después de la primera, en caso de que hayas hecho reference a una corrección / squash anterior con git commit --fixup/--squash .

¡Tu primera squash! tiene s3 como su ... porción. Por lo tanto, rebase busca una confirmación que tenga s3 como su "título" (esto nunca se define en la documentation, pero parece significar "descripción de una línea", es decir, la primera línea del post de logging). No hay tales commits en la list.

Pasando al segundo, encontramos el mismo problema, y ​​también con el tercero.

Si su primer commit (con el título s1 ) fue seguido por un commit cuyo título era squash! s1 squash! s1 , ese en particular obtendría una palabra "squash".

(Tenga en count que git commit --fixup=<id> o git commit --squash=<id> creará este tipo de confirmación del "mismo título" para usted. El elemento "ignora las subsecuentes" se debe a que puede hacer esto mientras trabaja:

 git add ...; git commit -m thing1 ... edit ... git add ...; git commit -m thing2 # now fix thing1 bug noticed while working on thing2 ... edit ... git add ...; git commit --no-edit --fixup=HEAD^ ... edit/test some more, discover fixup was not complete git add ...; git commit --no-edit --fixup=HEAD 

En este caso, la segunda línea de fixup! fixup! thing1 es fixup! fixup! thing1 fixup! fixup! thing1 fixup! fixup! thing1 ; rebase solo busca un commit cuyo "título" es thing1 , de nuevo.)