remote from delete create another git git-branch

from - git pull



Git y el error "La rama ''x'' no está completamente fusionada" (9)

Como señaló Drew Taylor, la eliminación de la rama con -d solo considera la CABEZA actual para determinar si la rama está "totalmente fusionada". Se quejará incluso si la rama se fusiona con alguna otra rama. El mensaje de error definitivamente podría ser más claro a este respecto ... Puede retirar la rama combinada antes de eliminarla, o simplemente usar git branch -D. La capital -D anulará el cheque por completo.

Aquí están los comandos que usé de la rama maestra

git branch experiment git checkout experiment

Luego hice algunos cambios en mis archivos, los confirmé y empujé la nueva rama a GitHub.

git commit . git push -u origin experiment

Tenga en cuenta que después de git commit . Me pidieron un mensaje de confirmación y le di uno. Más tarde decidí fusionar mi rama de experimento en la rama maestra.

git checkout master git merge experiment

Finalmente empujé los cambios a GitHub.

git push -u origin master

Todo salió bien hasta que intenté borrar mi rama de experimento usando

git branch -d experiment

Recibí el mensaje de error: The branch ''experiment'' is not fully merged. Soy un poco nuevo para git, y no sé cuánto más podría fusionar las dos ramas. ¿Que me estoy perdiendo aqui?


Git advierte que puedes perder el historial al eliminar esta rama. A pesar de que en realidad no eliminaría ninguna confirmación de inmediato, algunas o todas las confirmaciones en la rama se volverían inalcanzables si no forman parte de otra rama también.

Para que el experiment rama se "fusione completamente" en otra rama, su confirmación de punta debe ser un antecesor de la punta de la otra rama, haciendo que la confirmación en experiment un subconjunto de la otra rama. Esto hace que sea seguro eliminar el experiment , ya que todas sus confirmaciones seguirán siendo parte del historial del repositorio a través de la otra rama. Debe estar "totalmente" fusionado, porque puede 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 hay una

La “rama hacia arriba” para el experiment , como en su caso, es probablemente el origin/experiment . Si el experiment está completamente fusionado en la rama actual, Git lo elimina sin quejarse. Si no lo está, pero está completamente fusionado en su rama ascendente, Git continúa con una advertencia que parece:

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 un ID de confirmación. El hecho de estar totalmente fusionado en su flujo ascendente indica que las confirmaciones en el experiment se han enviado al repositorio de origen, de modo que incluso si las pierde aquí, al menos se pueden guardar en otro lugar.

Dado que Git no comprueba otras sucursales, puede ser seguro eliminar una sucursal porque sabe que está completamente fusionada con otra; puede hacer esto con la opción -D como se indica, o cambiar a esa rama primero y dejar que Git confirme el estado completamente fusionado para usted.


Me sucedió esto hoy, ya que estaba fusionando mi primera rama de funciones de nuevo en Master. Como algunos dijeron en un hilo en otra parte de SO, el truco fue volver al maestro antes de intentar eliminar la rama. Una vez en el maestro, git estaba feliz de eliminar la rama sin advertencias.


No tenía la rama de aguas arriba en mi git local. Había creado una sucursal local desde Master, git checkout -b mybranch. Creé una rama con la GUI de bitbucket en el git ascendente y empujé mi sucursal local (mybranch) a esa rama ascendente. Una vez que hice una búsqueda de git en mi git local para recuperar la rama aguas arriba, pude hacer una rama de git -d mybranch.


Para ver cambios que no están fusionados, hice esto:

git checkout experiment git merge --no-commit master git diff --cached

Nota: Esto muestra los cambios en el master que no están en el experiment .

No te olvides de:

git merge --abort

Cuando hayas terminado de mirar.


Probé la respuesta de Sehe y no funcionó.

Para encontrar las confirmaciones que no se han fusionado simplemente use:

git log oldbranch ^newbranch --no-merges


Usted puede simplemente averiguar:

git log --cherry master ... experimental

--cherry option es un sinónimo de --right-only --cherry-mark --no-merges

git-log man page dijo

es útil limitar la salida a las confirmaciones de nuestro lado y marcar aquellas que se han aplicado al otro lado de un historial bifurcado con git log --cherry upstream ... mybranch, similar a git cherry upstream mybranch.

Para tu información --cherry-pick omite los compromisos equivalentes, pero --cherry-marks no. Es útil encontrar la reorganización y forzar cambios actualizados entre las sucursales públicas anteriores y las que trabajan conjuntamente


Solución más fácil con explicación (solución de doble verificación) (enfrentó el problema antes)

El problema es:

1- No puedo borrar una rama

2- El terminal sigue mostrando un mensaje de advertencia que indica que hay algunas confirmaciones que aún no están aprobadas.

3- sabiendo que he comprobado el maestro y la rama y son idénticos (hasta la fecha)

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 en sentido ascendente (en Github, bitbucket o lo que sea), necesita fusionarla (empujarla) en el maestro, y debe insertar los nuevos cambios (confirmaciones) en el repositorio remoto (Github, bitbucket o lo que sea) de la rama,

Lo que hice en mi código es que cambié a maestro, luego fusioné la rama en él (para asegurarme de que sean idénticas en su máquina local), luego volví a la rama y puse las actualizaciones o cambios en el control remoto en línea Repo utilizando "git push".

después de eso, volví a cambiar al maestro e intenté eliminar la rama, y ​​el problema (mensaje de advertencia) desapareció y la rama se eliminó con éxito


Nota redacción cambiada 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 que no son accesibles desde: su rama en sentido ascendente, o HEAD (revisión revisada actualmente). En otras palabras, cuando podrías perder commit¹.

En la práctica, significa que probablemente modificó, rebasó o filtró los compromisos y no parecen idénticos.

Por lo tanto, podría evitar la advertencia si revisa una rama que contiene las confirmaciones de que no está haciendo referencia al eliminar esa otra rama.

Querrá verificar que, de hecho, no falte ningún compromiso vital:

git log --graph --left-right --cherry-pick --oneline master...experiment

Esto le dará una lista de los no compartidos entre las ramas. En caso de que tenga curiosidad, podría haber una diferencia sin --cherry-pick y esta diferencia podría ser la razón 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 --left-right, como el ejemplo anterior en la descripción de esa opción. Sin embargo, muestra las confirmaciones que fueron seleccionadas de la otra rama (por ejemplo, "3rd on b" puede seleccionarse de la rama A). Con esta opción, dichos pares de confirmaciones se excluyen de la salida.

Really en realidad, solo son basura recolectada después de un tiempo, por defecto. Además, el comando git-branch no comprueba el árbol de revisión de todas las sucursales . La advertencia está ahí para evitar errores obvios.

² (Mi preferencia aquí es simplemente forzar la eliminación en su lugar, pero es posible que desee tener la tranquilidad adicional).