Voici les commandes que j'ai utilisées depuis la branche master
git branch experiment
git checkout experiment
Ensuite, j'ai apporté des modifications à mes fichiers, validé les modifications et poussé la nouvelle branche vers GitHub.
git commit . -m 'changed files'
git push -u origin experiment
Plus tard, j'ai décidé de fusionner ma branche d'expérience dans la branche principale.
git checkout master
git merge experiment
Enfin, j'ai poussé les modifications vers GitHub.
git push -u origin master
Tout s'est bien passé jusqu'à ce que j'essaie de supprimer ma branche d'expérience en utilisant
git branch -d experiment
J'ai reçu le message d'erreur que error: The branch 'experiment' is not fully merged.
je suis un peu nouveau sur git, et je ne sais pas combien de plus je pourrais éventuellement fusionner les deux branches. Qu'est-ce que j'oublie ici?
git
git-branch
mellowsoon
la source
la source
git commit --amend
squash
: stackoverflow.com/q/41946475/109941Réponses:
Remarque Le libellé a été modifié en réponse aux commentaires. Merci @slekse
Ce n'est pas une erreur, c'est un avertissement. Cela signifie que la branche que vous êtes sur le point de supprimer contient des validations qui ne sont pas accessibles depuis l'une de ses branches: sa branche en amont ou HEAD (révision actuellement extraite). En d'autres termes, lorsque vous risquez de perdre des commits¹.
En pratique, cela signifie que vous avez probablement modifié, rebasé ou filtré les commits et qu'ils ne semblent pas identiques.
Par conséquent, vous pouvez éviter l'avertissement en vérifiant une branche qui contient les validations que vous êtes sur le point de dé -référencer en supprimant cette autre branche.²
Vous voudrez vérifier que vous ne manquez en fait aucun commit essentiel:
Cela vous donnera une liste de tout non partagé entre les branches. Si vous êtes curieux, il pourrait y avoir une différence sans
--cherry-pick
et cette différence pourrait bien être la raison de l'avertissement que vous obtenez:¹ ils ne sont vraiment récupérés qu'après un certain temps, par défaut. De plus, la
git-branch
commande ne vérifie pas l'arborescence de révision de toutes les branches . L'avertissement est là pour éviter les erreurs évidentes.² (Ma préférence ici est de forcer la suppression à la place, mais vous voudrez peut-être avoir une assurance supplémentaire).
la source
Comme l'a souligné Drew Taylor, la suppression de branche avec -d ne prend en compte que la TETE actuelle pour déterminer si la branche est "complètement fusionnée". Il se plaindra même si la succursale est fusionnée avec une autre succursale. Le message d'erreur pourrait certainement être plus clair à cet égard ... Vous pouvez soit extraire la branche fusionnée avant de la supprimer, soit simplement utiliser git branch -D. Le -D majuscule remplacera entièrement le chèque.
la source
origin/master
?) Je suppose que vérifier d'origin/master
abord pas trop onéreux, mais il se sent comme une sorte de flux bizarre - pourquoi dois - je vérifierorigin/master
localement juste pour que vous vérifiiez que mes modifications y sont fusionnées?J'ai essayé la réponse de sehe et cela n'a pas fonctionné.
Pour trouver les validations qui n'ont pas été fusionnées, utilisez simplement:
la source
C'est ce qui m'est arrivé aujourd'hui, alors que je fusionnais ma toute première branche de fonctionnalité dans Master. Comme certains l'ont dit dans un thread ailleurs sur SO, l'astuce consistait à revenir à master avant d'essayer de supprimer la branche. Une fois de retour dans master, git était heureux de supprimer la branche sans aucun avertissement.
la source
Git vous avertit que vous risquez de perdre l'historique en supprimant cette branche. Même si cela ne supprimait pas immédiatement les validations, certaines ou toutes les validations de la branche deviendraient inaccessibles si elles ne faisaient pas partie d'une autre branche également.
Pour que la branche
experiment
soit «complètement fusionnée» dans une autre branche, son commit de tip doit être un ancêtre du tip de l'autre branche, ce qui rend les commits dansexperiment
un sous-ensemble de l'autre branche. Cela permet de le supprimer en toute sécuritéexperiment
, car toutes ses validations resteront dans l'historique du référentiel via l'autre branche. Il doit être «entièrement» fusionné, car il a peut-être déjà été fusionné plusieurs fois, mais des commits ont maintenant été ajoutés depuis la dernière fusion qui ne sont pas contenus dans l'autre branche.Cependant, Git ne vérifie pas toutes les autres branches du référentiel; seulement deux:
La «branche amont» pour
experiment
, comme dans votre cas, l'est probablementorigin/experiment
. Siexperiment
est complètement fusionné dans la branche actuelle, Git le supprime sans aucune réclamation. Si ce n'est pas le cas, mais qu'il est complètement fusionné dans sa branche en amont, Git continue avec un avertissement ressemblant à:Où
xxxxxxxx
indique un ID de validation. Être complètement fusionné dans son amont indique que les validationsexperiment
ont été poussées vers le référentiel d'origine, de sorte que même si vous les perdez ici, elles peuvent au moins être enregistrées ailleurs.Puisque Git ne vérifie pas les autres branches, il peut être sûr de supprimer une branche car vous savez qu'elle est complètement fusionnée dans une autre; vous pouvez le faire avec l'
-D
option comme indiqué, ou passer d'abord à cette branche et laisser Git confirmer le statut complètement fusionné pour vous.la source
pour voir les changements qui ne sont pas fusionnés, j'ai fait ceci:
Remarque: cela montre les changements
master
qui ne sont pas dansexperiment
.N'oubliez pas de:
Quand tu auras fini de regarder.
la source
man git-reset
et les commandes de réinitialisation de git suffisent pour récupérer des problèmes d'état.Solution la plus simple avec explication (solution à double vérification) (face au problème avant)
Le problème est:
1- Je ne peux pas supprimer une branche
2- Le terminal affiche toujours un message d'avertissement indiquant que certains commits ne sont pas encore approuvés
3- sachant que j'ai vérifié le master et la branche et qu'ils sont identiques (à jour)
Solution:
Explication:
lorsque votre branche est connectée à une branche distante en amont (sur Github, bitbucket ou autre), vous devez la fusionner (pousser) dans le maître et vous devez pousser les nouvelles modifications (validations) dans le référentiel distant (Github, bitbucket ou que ce soit) de la succursale,
ce que j'ai fait dans mon code, c'est que je suis passé à master, puis y fusionner la branche (pour vous assurer qu'ils sont identiques sur votre machine locale), puis je suis passé à nouveau à la branche et j'ai poussé les mises à jour ou les modifications dans la télécommande en ligne repo utilisant "git push".
après cela, je suis passé à nouveau au maître et j'ai essayé de supprimer la branche, et le problème (message d'avertissement) a disparu, et la branche a été supprimée avec succès
la source
Vous pouvez simplement comprendre:
--cherry
option est synonyme de--right-only --cherry-mark --no-merges
page de manuel git-log
Pour info.
--cherry-pick
omet les validations équivalentes mais--cherry-marks
ne le fait pas. Il est utile de trouver une nouvelle base et de forcer des changements mis à jour entre la branche publique en amont et la collaborationla source
Je n'avais pas la branche en amont sur mon git local. J'avais créé une succursale locale à partir de master, git checkout -b mybranch. J'ai créé une branche avec l'interface graphique bitbucket sur le git en amont et j'ai poussé ma branche locale (mybranch) vers cette branche en amont. Une fois que j'ai fait un git fetch sur mon git local pour récupérer la branche en amont, je pouvais faire une git branch -d mybranch.
la source
Je crois que le drapeau
--force
est ce que vous recherchez vraiment. Utilisez simplementgit branch -d --force <branch_name>
pour supprimer la branche de force.la source