En Git, ¿hay alguna manera de fusionar todos los cambios de una rama a otra, pero aplastar a una sola confirmación al mismo tiempo?
A menudo trabajo en una nueva función en una rama separada y regularmente comprometo / empujo, principalmente para hacer copias de seguridad o transferir lo que estoy trabajando a otra máquina. La mayoría de los commits dicen "Feature xxx WIP" o algo redundante.
Una vez que el trabajo haya finalizado y quiera volver a fusionar la rama WIP en master, me gustaría descartar todas esas confirmaciones intermedias, y solo tener una única confirmación limpia.
¿Hay una forma fácil de hacer esto?
Alternativamente, ¿qué tal un comando que aplasta todos los commits en una rama desde el punto en que se bifurcó?
rebase --squash
¡Lo encontré! El comando de fusión tiene una
--squash
opciónen este punto todo está fusionado, posiblemente en conflicto, pero no comprometido. Entonces ahora puedo:
fuente
git add .
hacer?git add .
agrega todos los archivos no ignorados en el directorio actual, sería cuidadoso de recoger archivos no deseados de esta manera.git add .
, puede usargit add -u
para agregar solo archivos que ya se han agregado al árbol.Pruebe
git rebase -i master
en su rama de características. A continuación, puede cambiar todas las opciones de selección, excepto una, a squash para combinar las confirmaciones. Vea los compromisos de aplastamiento con rebaseFinalmente, puede fusionar desde la rama maestra.
fuente
El uso
git merge --squash <feature branch>
como sugiere la respuesta aceptada hace el truco, pero no mostrará la rama fusionada como realmente fusionada.Por lo tanto, una solución aún mejor es:
<feature branch>
en lo anterior usandogit merge --squash
Este wiki explica el procedimiento en detalle.
fuente
He creado mi propio alias git para hacer exactamente esto. Lo estoy llamando
git freebase
! Tomará su rama de características desordenada e irreconocible existente y la recreará para que se convierta en una nueva rama con el mismo nombre con sus confirmaciones agrupadas en una confirmación y reforzada en la rama que especifique (maestra de forma predeterminada). Al final, le permitirá usar cualquier mensaje de confirmación que desee para su nueva rama "libre".Instálelo colocando el siguiente alias en su .gitconfig:
Úselo desde su rama de características ejecutando:
git freebase <new-base>
Solo he probado esto algunas veces, así que léalo primero y asegúrese de que desea ejecutarlo. Como una pequeña medida de seguridad, imprime el sha1 inicial, por lo que debería poder restaurar su antigua rama si algo sale mal.
Lo mantendré en mi repositorio de archivos de puntos en github: https://github.com/stevecrozz/dotfiles/blob/master/.gitconfig
fuente
git merge --squash <feature branch>
es una buena opción. El "git commit" le dice a todos los mensajes de confirmación de ramificación de características con su elección para mantenerlo.Por menos cometer fusión.
git merge do x times --git reset HEAD ^ --soft luego git commit.
Riesgo: los archivos eliminados pueden volver.
fuente
Puede hacer esto con el comando "rebase". Llamemos a las ramas "main" y "feature":
El comando rebase reproducirá todas las confirmaciones en "característica" como una confirmación con un elemento primario igual a "principal".
Es posible que desee ejecutar
git merge main
antesgit rebase main
si "main" ha cambiado desde que se creó "feature" (o desde la fusión más reciente). De esa manera, todavía tiene su historial completo en caso de que haya tenido un conflicto de fusión.Después del rebase, puede fusionar su rama a main, lo que debería resultar en una fusión de avance rápido:
Vea la página de rebase de Understanding Git Conceptually para una buena visión general
fuente