Aquí están los comandos que usé de la rama maestra
git branch experiment
git checkout experiment
Luego realicé algunos cambios en mis archivos, los comprometí y empujé la nueva rama a GitHub.
git commit . -m 'changed files'
git push -u origin experiment
Más tarde, decidí fusionar mi rama experimental 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é eliminar mi rama de experimento usando
git branch -d experiment
Recibí el mensaje de error error: The branch 'experiment' is not fully merged.
que soy un poco nuevo en git, y no sé cuánto más podría fusionar las dos ramas. ¿Que me estoy perdiendo aqui?
git
git-branch
suave
fuente
fuente
git commit --amend
squash
: stackoverflow.com/q/41946475/109941Respuestas:
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: su rama ascendente o HEAD (revisión actualmente desprotegida). En otras palabras, cuándo podrías perder commits¹.
En la práctica, significa que probablemente modificó, modificó o confirmó las confirmaciones y no parecen idénticas.
Por lo tanto, puede evitar la advertencia al verificar una rama que contiene las confirmaciones de las que está sin referencia eliminando esa otra rama.²
Deberá verificar que, de hecho, no le faltan confirmaciones vitales:
Esto le dará una lista de cualquier no compartido entre las ramas. En caso de que tenga curiosidad, puede haber una diferencia sin
--cherry-pick
y esta diferencia podría ser la razón de la advertencia que recibe:Really en realidad son solo basura recolectada después de un tiempo, por defecto. 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 forzar la eliminación en su lugar, pero es posible que desee tener la tranquilidad adicional).
fuente
Como señaló Drew Taylor, la eliminación de la rama con -d solo considera el HEAD actual para determinar si la rama está "completamente 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.
fuente
origin/master
?) Supongo que verificarorigin/master
primero no es demasiado oneroso, pero se siente como una especie de flujo extraño: ¿por qué necesito verificarorigin/master
localmente? ¿solo para que verifiques que mis cambios se fusionan allí?Intenté la respuesta de Sehe y no funcionó.
Para encontrar las confirmaciones que no se han fusionado, simplemente use:
fuente
Hoy me sucedió esto, ya que estaba fusionando mi primera rama de características nuevamente en master. Como algunos dijeron en un hilo en otra parte de SO, el truco fue cambiar de nuevo a maestro antes de intentar eliminar la rama. Una vez de vuelta en master, git se alegró de eliminar la rama sin ninguna advertencia.
fuente
Git advierte que puede 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 quedarían inalcanzables si no son parte de otra rama también.
Para que la rama
experiment
se “fusione completamente” en otra rama, su confirmación de punta debe ser un antecesor de la punta de la otra rama, haciendo que las confirmaciones estén enexperiment
un subconjunto de la otra rama. Esto hace que sea seguro eliminarloexperiment
, ya que todas sus confirmaciones seguirán siendo parte del historial del repositorio a través de la otra rama. Debe fusionarse "completamente", 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 verifica todas las demás ramas en el repositorio; sólo dos:
La "rama ascendente" para
experiment
, como en su caso, es probablementeorigin/experiment
. Siexperiment
está completamente fusionado en la rama actual, Git lo elimina sin ninguna queja. Si no es así, pero está completamente fusionado en su rama aguas arriba, entonces Git procede con una advertencia que parece:Donde
xxxxxxxx
indica un id de confirmación. Estar completamente fusionado en su flujo ascendente indica que los commitsexperiment
se han enviado al repositorio de origen, por lo que incluso si los pierde aquí, al menos se pueden guardar en otro lugar.Dado que Git no verifica otras ramas, puede ser seguro eliminar una rama porque sabe que está completamente fusionada con otra; puede hacer esto con la
-D
opción como se indica, o cambiar a esa rama primero y dejar que Git confirme el estado completamente fusionado por usted.fuente
para ver los cambios que no se fusionan, hice esto:
Nota: Esto muestra cambios
master
que no están enexperiment
.No te olvides de:
Cuando termines de mirar.
fuente
man git-reset
y los comandos git reset son suficientes para recuperarse de problemas de estado.Solución más fácil con explicación (solución doblemente verificada) (enfrentó el problema antes)
El problema es:
1- No puedo borrar 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 revisé el master y la rama y que son idénticos (actualizados)
solución:
Explicación:
cuando su rama está conectada a una rama remota ascendente (en Github, bitbucket o lo que sea), debe fusionarla (empujarla) en el maestro, y debe empujar los nuevos cambios (confirmaciones) al 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énticos 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, y el problema (mensaje de advertencia) desapareció, y la rama se eliminó con éxito
fuente
Simplemente puedes descubrir:
--cherry
opción es sinónimo de--right-only --cherry-mark --no-merges
la página de manual de git-log dijo
FYI.
--cherry-pick
omite confirmaciones equivalentes pero--cherry-marks
no lo hace. Es útil encontrar rebase y forzar cambios actualizados entre la rama pública ascendente y colaboradorafuente
No tenía la rama aguas arriba en mi git local. Había creado una sucursal local de master, git checkout -b mybranch. Creé una rama con bitbucket GUI en el git ascendente y empujé mi rama 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.
fuente
Creo que la bandera
--force
es lo que realmente estás buscando. Solo usegit branch -d --force <branch_name>
para eliminar la rama por la fuerza.fuente