Git "error: La rama 'x' no está completamente fusionada"
Aquí están los comandos que utilicé desde la rama maestra.
git branch experiment
git checkout experiment
Luego hice algunos cambios en mis archivos, confirmé los cambios y envié la nueva rama a GitHub.
git commit . -m 'changed files'
git push -u origin experiment
Más tarde decidí fusionar mi rama experimental con la rama maestra.
git checkout master
git merge experiment
Finalmente envié los cambios a GitHub.
git push -u origin master
Todo salió bien hasta que intenté eliminar la rama de mi experimento usando
git branch -d experiment
Recibí el mensaje de error:
error: la rama 'experimento' no está completamente fusionada.
Si está seguro de que desea eliminarlo, ejecute 'git branch -D experiment'.
Soy un poco nuevo en git y no sé cuánto más podría fusionar las dos ramas. ¿Que me estoy perdiendo aqui?
Nota La redacción cambió en respuesta a los comentarios. Gracias @slekse
Eso no es un error, es una advertencia. Significa que la rama que está a punto de eliminar contiene confirmaciones a las que no se puede acceder desde ninguna de: su rama ascendente o HEAD (revisión actualmente desprotegida). En otras palabras, cuándo podría perder compromisos¹.
En la práctica, significa que probablemente modificaste, rebasaste (incluida la combinación de squash) o filtraste confirmaciones y no parecen idénticas.
Por lo tanto, puede evitar la advertencia revisando una rama que contenga las confirmaciones a las que desea eliminar eliminando esa otra rama.²
Querrá verificar que, de hecho, no le falta ninguna confirmación vital:
git log --graph --left-right --cherry-pick --oneline master...experiment
Esto le dará una lista de los no compartidos entre las sucursales. En caso de que tenga curiosidad, puede haber una diferencia --cherry-pick
y esta diferencia bien podría ser el motivo de la advertencia que recibe:
--cherry-pick
Omita cualquier confirmación que introduzca el mismo cambio que otra confirmación en el "otro lado" cuando el conjunto de confirmaciones esté limitado por una diferencia simétrica. Por ejemplo, si tiene dos ramas, A y B, una forma habitual de enumerar todas las confirmaciones en un solo lado es con --izquierda-derecha, como en el ejemplo anterior en la descripción de esa opción. Sin embargo, muestra las confirmaciones que se seleccionaron de la otra rama (por ejemplo, "3.º en b" se puede seleccionar de la rama A). Con esta opción, dichos pares de confirmaciones se excluyen de la salida.
¹ en realidad, de forma predeterminada, solo se recolecta basura después de un tiempo. Además, el git-branch
comando no verifica el árbol de revisión de todas las ramas . La advertencia está ahí para evitar errores obvios.
² (Mi preferencia aquí es simplemente forzar la eliminación, pero es posible que desees tener más tranquilidad).
Como señaló Drew Taylor, la eliminación de ramas con -d solo considera el HEAD actual para determinar si la rama está "completamente fusionada". Se quejará incluso si la sucursal se fusiona con alguna otra sucursal. El mensaje de error definitivamente podría ser más claro a este respecto... Puede verificar la rama fusionada antes de eliminarla, o simplemente usar git branch -D. La -D mayúscula anulará la verificación por completo.
Probé la respuesta de sehe y no funcionó.
Para encontrar las confirmaciones que no se han fusionado, simplemente use:
git log feature-branch ^master --no-merges
Solución más fácil con explicación (solución verificada dos veces) (enfrenté el problema antes)
El problema es:
1- No puedo eliminar una rama
2- El terminal sigue mostrando un mensaje de advertencia de que hay algunas confirmaciones que aún no están aprobadas
3- sabiendo que verifiqué el master y la rama y son idénticos (actualizados)
solución:
git checkout master
git merge branch_name
git checkout branch_name
git push
git checkout master
git branch -d branch_name
Explicación:
cuando su rama está conectada a una rama remota ascendente (en Github, bitbucket o lo que sea), debe fusionarla (insertar) en el maestro, y debe enviar los nuevos cambios (confirmaciones) al repositorio remoto (Github, bitbucket o lo que sea) de la sucursal,
Lo que hice en mi código es que cambié a master, luego fusioné la rama en ella (para asegurarme de que sean idénticas en su máquina local), luego cambié a la rama nuevamente y envié las actualizaciones o cambios al control remoto en línea. repositorio usando "git push".
después de eso, cambié al maestro nuevamente e intenté eliminar la rama, pero el problema (mensaje de advertencia) desapareció y la rama se eliminó correctamente.
Git advierte que podrías perder el historial al eliminar esta rama. Aunque en realidad no eliminaría ninguna confirmación de inmediato, algunas o todas las confirmaciones de la rama serían inalcanzables si no fueran parte de alguna otra rama también.
Para que la rama experiment
esté "completamente fusionada" en otra rama, su confirmación de sugerencia debe ser un antepasado de la sugerencia de la otra rama, lo que hace que las confirmaciones sean experiment
un subconjunto de la otra rama. Esto hace que sea seguro eliminarlo experiment
, ya que todas sus confirmaciones seguirán siendo parte del historial del repositorio a través de la otra rama. Debe estar "completamente" fusionado, porque es posible que ya se haya fusionado varias veces, pero ahora se han agregado confirmaciones desde la última fusión que no están contenidas en la otra rama.
Sin embargo, Git no comprueba todas las demás ramas del repositorio; sólo dos:
- La rama actual (HEAD)
- La rama aguas arriba, si la hay.
La "rama ascendente" para experiment
, como en su caso, probablemente sea origin/experiment
. Si experiment
está completamente fusionado en la rama actual, Git lo elimina sin quejas. Si no es así, pero está completamente fusionado en su rama ascendente, Git continúa con una advertencia similar a la siguiente:
warning: deleting branch 'experiment' that has been merged
to 'refs/remotes/origin/experiment', but not yet merged to
HEAD.
Deleted branch experiment (was xxxxxxxx).
Donde xxxxxxxx
indica una identificación de confirmación. Estar completamente fusionado en su nivel ascendente indica que las confirmaciones se experiment
han enviado al repositorio de origen, de modo que incluso si las pierde aquí, al menos pueden guardarse en otro lugar.
Dado que Git no verifica otras ramas, puede ser seguro eliminar una rama porque sabes que está completamente fusionada con otra; puede hacer esto con la -D
opción indicada, o cambiar primero a esa rama y dejar que Git confirme el estado completamente fusionado por usted.