Git "error: La rama 'x' no está completamente fusionada"

Resuelto mellowsoon asked hace 12 años • 14 respuestas

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?

mellowsoon avatar Sep 26 '11 05:09 mellowsoon
Aceptado

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-picky 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-branchcomando 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).

sehe avatar Sep 25 '2011 22:09 sehe

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.

drwowe avatar Apr 02 '2012 14:04 drwowe

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
qwertzguy avatar Sep 17 '2013 20:09 qwertzguy

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.

ELTA avatar Jan 14 '2018 07:01 ELTA

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 experimentesté "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 experimentun 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:

  1. La rama actual (HEAD)
  2. La rama aguas arriba, si la hay.

La "rama ascendente" para experiment, como en su caso, probablemente sea origin/experiment. Si experimentestá 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 xxxxxxxxindica una identificación de confirmación. Estar completamente fusionado en su nivel ascendente indica que las confirmaciones se experimenthan 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 -Dopción indicada, o cambiar primero a esa rama y dejar que Git confirme el estado completamente fusionado por usted.

troore avatar Dec 11 '2014 16:12 troore