Hago una nueva sucursal master
con:
git checkout -b testbranch
Hago 20 compromisos en él.
Ahora quiero aplastar esos 20 commits. Lo hago con:
git rebase -i HEAD~20
¿Qué pasa si no sé cuántos commits? ¿Hay alguna manera de hacer algo como:
git rebase -i all on this branch
git
version-control
usuario3803850
fuente
fuente
git rebase -i 58333012713fc168bd70ad00d191b3bdc601fa2d
que hará un rebase interactivo donde el número de confirmación es la última confirmación que permanece sin cambiosRespuestas:
Otra forma de aplastar todas sus confirmaciones es restablecer el índice a maestro:
Esto no es perfecto ya que implica que sabes de qué rama proviene "yourBranch".
Nota: encontrar esa rama de origen no es fácil / posible con Git (la forma visual es a menudo la más fácil , como se ve aquí ).
EDITAR: deberá usar
git push --force
Karlotcha Hoa agrega en los comentarios :
fuente
YourBranch
está actualmente. Esto se mantendráYourBranch
intacto cuando lo hagasreset
git reset $(git merge-base master $(git rev-parse --abbrev-ref HEAD))
para usar automáticamente la rama en la que se encuentra actualmente. Y si usa eso, también puede usar un alias, ya que el comando no depende del nombre de la rama.git push --force
(y advierte a tus colegas si son varias personas que trabajan en esa rama)Verifique la rama para la que desea agrupar todas las confirmaciones en una confirmación. Digamos que su llamado,
feature_branch
.git checkout feature_branch
Paso 1:
Realice un restablecimiento parcial de su
origin/feature_branch
con sumaster
sucursal local (dependiendo de sus necesidades, también puede restablecer con origen / maestro). Esto restablecerá todas las confirmaciones adicionales en sufeature_branch
, pero sin cambiar ninguno de sus cambios de archivo localmente.git reset --soft master
Paso 2:
Agregue todos los cambios en su directorio git repo, al nuevo commit que se va a crear. Y cometer lo mismo con un mensaje.
git add -A && git commit -m "commit message goes here"
fuente
-f
bandera.Lo que estás haciendo es bastante propenso a errores. Solo haz:
que automáticamente cambiará las confirmaciones de su sucursal al último maestro actual.
fuente
commit -am "the whole thing!"
reset origin/master
método es realmente malo, ya que es lo mismo que hacer confirmaciones directamente en el maestro: no hay historial de 'fusión de rama', no hay opción de solicitud de extracción. La respuesta de @WaZaA es mucho más acorde con el flujo de trabajo normal de git, creoOtra forma simple de hacer esto: ir a la rama de origen y hacer a
merge --squash
. Este comando no realiza la confirmación "aplastada". cuando lo haga, se recopilarán todos los mensajes de confirmación de su Rama.fuente
Suponiendo que se estaba bifurcando desde el maestro, no necesita ingresar
yourBranch
al paso de reinicio todo el tiempo:Explicacion :
git rev-list --count HEAD ^master
cuenta las confirmaciones desde que realizó su ramificación de características desde el maestro, f.ex. 20)git reset --soft HEAD~20
realizará un restablecimiento parcial de las últimas 20 confirmaciones. Esto deja sus cambios en los archivos, pero elimina las confirmaciones.Uso :
En mi .bash_profile he agregado un alias para
gisquash
hacer esto con un comando:Después de resetear y comprometerse, debe hacer a
git push --force
.Pista :
Si está utilizando Gitlab> = 11.0 ya no necesita hacerlo, ya que tiene una opción de aplastamiento al fusionar ramas.
fuente
Basado en la lectura de varias preguntas y respuestas de Stackoverflow sobre el aplastamiento, creo que este es un buen revestimiento para aplastar todos los commits en una rama:
Esto supone que el maestro es la rama base.
fuente
Solución para personas que prefieren hacer clic:
Instalar sourcetree (es gratis)
Comprueba cómo se ven tus commits. Lo más probable es que tengas algo similar a esto
Haga clic derecho en confirmación de padres . En nuestro caso es la rama maestra.
Puede aplastar el compromiso con el anterior haciendo clic en un botón. En nuestro caso tenemos que hacer clic 2 veces. También puedes cambiar el mensaje de confirmación
¡Los resultados son impresionantes y estamos listos para impulsar!
Nota al margen: si estaba empujando sus confirmaciones parciales al control remoto, debe usar el empuje forzado después del squash
fuente
Otra solución sería guardar todos los registros de confirmación en un archivo
git log> branch.log
Ahora branch.log tendrá todos los identificadores de confirmación desde el comienzo ... desplácese hacia abajo y tome la primera confirmación (esto será difícil en la terminal) usando la primera confirmación
git reset --soft
todos los commits serán aplastados
fuente
Git reset, como se mencionó en muchas respuestas anteriores, es, con mucho, la mejor y más simple forma de lograr lo que desea. Lo uso en el siguiente flujo de trabajo:
(en la rama de desarrollo)
fuente
Todo este git reset, hard, soft, y todo lo demás mencionado aquí probablemente esté funcionando (no lo hizo para mí) si sigues los pasos correctamente y algún tipo de genio.
Si eres el Joe Smo promedio, prueba esto:
¿Cómo usar git merge --squash?
Me salvó la vida, y será mi lugar para el squash, he estado usando esto 4 veces desde que me enteré. Simple, limpio y básicamente 1 comando. En resumen:
si está en una sucursal, llamémosla "my_new_feature" fuera del desarrollo y su solicitud de extracción tiene 35 confirmaciones (o la cantidad que sea) y desea que sea 1.
A. Asegúrese de que su sucursal esté actualizada, continúe desarrollar, obtener lo último y fusionar y resolver cualquier conflicto con "my_new_feature"
(este paso realmente debería tomarlo tan pronto como sea posible de todos modos)
B. Obtener lo último de desarrollo y ramificarse a una nueva sucursal llámelo "my_new_feature_squashed"
C. la magia está aquí.
Desea llevar su trabajo de "my_new_feature" a "my_new_feature_squashed"
Así que solo haga (mientras que en su nueva sucursal creamos fuera del desarrollo):
git merge --squash my_new_feature
Todos sus cambios ahora estarán en su nueva rama, siéntase libre de probarlo, luego solo haga su única confirmación, empuje, nuevo PR de esa rama y espere a que se repita al día siguiente.
¿No te encanta la codificación? :)
fuente
Puede usar la herramienta que he creado específicamente para esta tarea:
https://github.com/sheerun/git-squash
Básicamente necesitas llamar
git squash master
y listofuente