Tengo un servidor Git remoto, este es el escenario que quiero realizar:
Para cada error / característica creo una rama Git diferente
Sigo confirmando mi código en esa rama de Git con mensajes Git no oficiales
En el repositorio superior, tenemos que hacer un commit para un error con el mensaje oficial de Git
Entonces, ¿cómo puedo fusionar mi sucursal con la sucursal remota para que obtengan solo una confirmación para todos mis registros (incluso quiero proporcionar un mensaje de confirmación para esto)?
git
git-merge
git-squash
SunnyShah
fuente
fuente
git merge --squash
lo hace todo en la línea de comando de una sola vez y solo espera que funcione.git rebase -i
abre un editor y le permite afinar el rebase. Es más lento, pero puedes ver lo que estás haciendo. Además, hay una diferencia entre rebase y merge que son demasiado complicadas para abordarlas en un comentario.merge --squash
anterior a lo nuevo, y luego combine la nueva rama para dominar. La antigua rama se vuelve obsoleta.Respuestas:
Supongamos que se llama a su rama de corrección de errores
bugfix
y desea fusionarla enmaster
:Esto tomará todos los commits de la
bugfix
rama, los aplastará en 1 commit y los combinará con sumaster
branch.Explicacion :
Cambia a su
master
rama.Toma todas las confirmaciones de la
bugfix
rama y las fusiona con su rama actual.Crea una única confirmación a partir de los cambios combinados.
Omitir el
-m
parámetro le permite modificar un borrador de mensaje de confirmación que contiene cada mensaje de sus confirmaciones aplastadas antes de finalizar su confirmación.fuente
git commit
(sin-m
parámetro) y podrá modificar un mensaje de confirmación redactado que contiene todos los mensajes de confirmación que eliminó.git commit --amend -m '...'
más adelante.git commit
ya no se mostrará el útil mensaje de confirmación que contiene todos los mensajes de confirmación que eliminó. En ese caso, intentegit commit --file .git/SQUASH_MSG
(a través de stackoverflow.com/a/11230783/923560 ).git commit -a --author="Author" --message="Issue title #id"
git merge --squash
le permite crear una sola confirmación sobre la rama actual cuyo efecto es el mismo que fusionar otra rama. Pero no producirá el registro de combinación, lo que significa que su solicitud de extracción como resultado no tendrá cambios, ¡pero no se marcará como combinada! Por lo tanto, solo tendrá que eliminar esa rama para hacerlo.Lo que finalmente me aclaró esto fue un comentario que muestra que:
es el equivalente a hacer:
Cuando quiero fusionar una rama de características con 105 (!!) confirmaciones y hacer que todas se agrupen en una sola, no quiero hacerlo
git rebase -i origin/master
porque necesito resolver por separado los conflictos de fusión para cada una de las confirmaciones intermedias (o al menos las que Git no puede darse cuenta de sí mismo). El usogit merge --squash
me da el resultado que quiero, de una sola confirmación para fusionar una rama de características completa. Y, solo necesito hacer como máximo una resolución manual de conflictos.fuente
git merge master
, y solo luegogit merge --squash feature
en la rama maestra.git merge --squash feature
desde la rama maestra?Desea fusionarse con la opción de squash. Eso si quieres hacerlo una rama a la vez.
Si desea fusionar todas las ramas al mismo tiempo que las confirmaciones individuales, primero vuelva a redactar de forma interactiva y elimine cada característica y luego combine pulpo:
Aplaste en una confirmación y luego repita para las otras características.
Esa última fusión es una "fusión de pulpo" porque está fusionando muchas ramas a la vez.
Espero que esto ayude
fuente
Si ya tiene
git merge bugfix
enmain
, puede aplastar la combinación de cometer en uno con:fuente
git reset --soft HEAD^1
parece deshacer la última confirmación realizada antes de la fusión, al menos en el caso de que la fusión sea un avance rápido.git reset --soft HEAD^<number-of-commits-to-squash>
.Fusionar
newFeature
ramamaster
con una confirmación personalizada:Si en cambio, lo haces
git merge --squash newFeature && git commit
recibirá un mensaje de confirmación que incluirá todas las
newFeature
confirmaciones de rama, que puede personalizar.Lo explico a fondo aquí: https://youtu.be/FQNAIacelT4
fuente
Sé que esta pregunta no se trata específicamente de Github, pero dado que Github es muy utilizado y esta es la respuesta que estaba buscando, la compartiré aquí.
Github tiene la capacidad de realizar fusiones de squash, dependiendo de las opciones de fusión habilitadas para el repositorio.
Si las fusiones de squash están habilitadas, la opción "Squash and merge" debería aparecer en el menú desplegable debajo del botón "Merge".
fuente
Suponga que trabajó en feature / task1 con múltiples commits.
Vaya a la rama de su proyecto (project / my_project)
Crear una nueva sucursal (feature / task1_bugfix)
Marge con la
--squash
opciónCrear una sola confirmación
Empuja tu rama
fuente
Para Git
Crea una nueva característica
a través de Terminal / Shell:
Esto no lo compromete, le permite revisarlo primero.
Luego, confirme y termine la función de esta nueva rama, y elimine / ignore la anterior (la que realizó).
fuente
si obtiene un error: la confirmación no es posible porque tiene archivos no fusionados.
reparó todos los archivos de conflicto
también podrías usar
fuente
Para aplastar su rama local antes de empujarla:
revise la rama en cuestión para trabajar si aún no está desprotegida.
Encuentra el sha del compromiso más antiguo que deseas mantener.
Crear / pagar una nueva rama (tmp1) a partir de esa confirmación.
git checkout -b tmp1 <sha1-of-commit>
Fusiona la rama original con la nueva aplastando.
git merge --squash <original branch>
Confirme los cambios creados por la fusión, con un mensaje de confirmación de resumen.
git commit -m <msg>
Verifique la rama original que desea aplastar.
git checkout <branch>
Restablezca el commit original que desea mantener.
git reset --soft <sha1>
Rebase esta rama basada en la nueva rama tmp1.
git rebase tmp1
Eso es todo, ahora elimine la rama temporal tmp1 una vez que esté seguro de que todo está bien.
fuente
Puede usar la herramienta que he creado para facilitar este proceso: git-squash . Por ejemplo, para aplastar todas las confirmaciones en la rama de características que se ha ramificado desde la rama maestra, escriba:
fuente