Eliminar un range de confirmaciones

Tengo un historial de confirmaciones de más de 40 commits. Algunas de estas confirmaciones no son necesarias y solo existen sin ningún motivo.

Me gustaría eliminar un range de commits innecesarios y al principio probé este:

git rebase --onto <branch name>~<first commit number to remove> <branch name>~<first commit to be kept> <branch name> 

Lamentablemente, esto no funcionará. Lo que realmente quiero es eliminar la última confirmación en el logging (la primera confirmada) hasta otra como la décima de la última, de modo que, en general, elimine las últimas 10 confirmaciones.

No estoy buscando revertir a esa versión, ya que estas confirmaciones no son útiles y llevarán a una carpeta de origen vacía.

Puede usar git rebase -i --root para volver a establecer la base de todo comenzando con la confirmación inicial.

Supongamos que tiene 11 confirmaciones que se parecen a esto:

 * cf0bc41 - (HEAD, master) Faun: Eleven (2 seconds ago) * b32d8cc - Faun: Ten (2 seconds ago) * f789e49 - Faun: Nine (2 seconds ago) * 780435e - Faun: Eight (2 seconds ago) * 3c6b084 - Faun: Seven (2 seconds ago) * fecce89 - Faun: Six (2 seconds ago) * 0433dbe - Faun: Five (2 seconds ago) * 8002cb7 - Faun: Four (2 seconds ago) * 3439445 - Faun: Three (2 seconds ago) * 38181f1 - Faun: Two (2 seconds ago) * 9373809 - Faun: One (2 seconds ago) 

Si desea eliminar los primeros 10 commits, simplemente ejecute git rebase -i --root , que abrirá algo como lo siguiente en su editor:

 pick 9373809 One pick 38181f1 Two pick 3439445 Three pick 8002cb7 Four pick 0433dbe Five pick fecce89 Six pick 3c6b084 Seven pick 780435e Eight pick f789e49 Nine pick b32d8cc Ten pick cf0bc41 Eleven # Rebase cf0bc41 onto 0bd34c4 

Simplemente puede eliminar las líneas de las confirmaciones que desea eliminar. Sin embargo, eso probablemente resultará en un conflicto, ya que más tarde confirma los files modificados más probables que introdujo con uno de sus commits anteriores.

También tenga en count que ejecutar este command reescribirá los SHA para todas las confirmaciones, lo que también podría causarle problemas.

Probablemente sea mejor aplastar o arreglar esas confirmaciones iniciales. Deje la primera sola y cambie la pick palabras por squash o fixup . Consulte los comentarios en la parte inferior de la database interactiva para get más información.

Por ejemplo, si edita el rebase interactivo se verá así:

 pick 9373809 One fixup 38181f1 Two fixup 3439445 Three fixup 8002cb7 Four fixup 0433dbe Five fixup fecce89 Six fixup 3c6b084 Seven fixup 780435e Eight fixup f789e49 Nine fixup b32d8cc Ten pick cf0bc41 Eleven 

Terminarás con este historial de git:

 * f8980bc - (HEAD, master) Faun: Eleven (0 seconds ago) * 3d300e9 - Faun: One (0 seconds ago) 

Lo que puedes hacer es squash los primeros 10 commits en un commit. Aquí hay un ejemplo que aplasta cinco compromisos iniciales en uno mientras conserva el rest de su historial.

Advertencia: la reescritura del historial cambiará los SHA1. No es posible evitar esto . No reescriba los SHA de las confirmaciones públicas a less que haya hablado primero con su equipo.

Registro original

 > git log --online --decorate f85179d (HEAD, master) ten 7de4071 nine 5c7a482 eight 9585035 seven b41bffc six d102f05 five 5a28cb9 four 6fc27c9 three 524b0c7 two bb7e6ae one 

Rebase todo , lo que abre el Bloc de notas (o cualquier editor de confirmación que use). Elija los commit que desea aplastar juntos con la opción s .

 > git rebase -i --root # this is notepad pick bb7e6ae one s 524b0c7 two s 6fc27c9 three s 5a28cb9 four s d102f05 five pick b41bffc six pick 9585035 seven pick 5c7a482 eight pick 7de4071 nine pick f85179d ten 

Después de save, este es el resultado de su logging. Tenga en count que ha cambiado todos los SHA1.

 > git log --oneline --decorate 6c63e02 (HEAD, master) ten 276cc7c nine 5248b0b eight 251f87a seven a70d035 six 3529f1a Squash the five initial commits into one.