ramas - git merge
Combinar todos los cambios de otra rama como un solo compromiso (6)
En Git, ¿hay una 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 cometeré / presionaré, principalmente para hacer copias de seguridad o para transferir lo que estoy trabajando a otra máquina. En su mayoría esos compromisos dicen "Función xxx WIP" o algo redundante.
Una vez que el trabajo haya finalizado y quiero fusionar la rama WIP de nuevo en el maestro, me gustaría descartar todos esos compromisos intermedios, y solo tener un solo compromiso limpio.
¿Hay una forma fácil de hacer esto?
Alternativamente, ¿qué tal un comando que aplasta todas las confirmaciones en una rama desde el punto en que se ramificó?
¡Lo encontré! El comando de fusión tiene una opción --squash
git checkout master
git merge --squash WIP
en este punto, todo está fusionado, posiblemente en conflicto, pero no comprometido. Así que ahora puedo:
git add .
git commit -m "Merged WIP"
Prueba git rebase -i master
en tu rama de características. A continuación, puede cambiar todos menos uno ''pick'' a ''squash'' para combinar los compromisos. Ver el squashing se compromete con rebase.
Finalmente, puedes hacer la fusión desde la rama maestra.
Puedes hacer esto con el comando "rebase". Llamemos a las ramas "principal" y "característica":
git checkout feature
git rebase main
El comando rebase reproducirá todas las confirmaciones en "característica" como una confirmación con un padre igual a "principal".
Es posible que desee ejecutar git merge main
antes de git rebase main
si "main" ha cambiado desde que se creó "feature" (o desde la fusión más reciente). De esa manera, aún tiene su historial completo en caso de que haya un conflicto de fusión.
Después de la reorganización, puede fusionar su rama con la principal, lo que debería dar como resultado una combinación de avance rápido:
git checkout main
git merge feature
Vea la página de rebase de Understanding Git Conceptualmente para una buena visión general
Quería aplastar todos los compromisos en mi maestro en uno. Intenté esto sin éxito:
$ git checkout --orphan new_master
$ git merge --squash master
fatal: Squash commit into empty head not supported yet
Así que hice esto:
$ tar cf /tmp/git.tar --exclude .git .
$ git checkout --orphan new_master
$ tar xf /tmp/git.tar
$ git commit -m "Initial commit"
que funcionó muy bien.
git merge --squash <feature branch>
es una buena opción. El "git commit" le informa sobre todos los mensajes de confirmación de rama de función con su elección para mantenerlo.
Por menos cometer fusionar.
git merge do x veces --git reset HEAD ^ --soft luego git commit.
Riesgo: los archivos eliminados pueden volver.
Otra opción es git merge --squash <feature branch>
y finalmente hacer un git commit
.
Desde Git Merge
--squash
--no-squash
Genere el árbol de trabajo y el estado del índice como si hubiera ocurrido una fusión real (excepto por la información de la fusión), pero en realidad no haga un commit o mueva el
HEAD
, ni registre$GIT_DIR/MERGE_HEAD
para hacer que el siguiente comando degit commit
cree una fusión cometer. Esto le permite crear una única confirmación sobre la rama actual cuyo efecto es el mismo que fusionar otra rama (o más en el caso de un pulpo).