406 votes

Git "erreur : La branche 'x' n'est pas entièrement fusionnée"

Voici les commandes que j'ai utilisées à partir de la branche principale

git branch experiment
git checkout experiment

Ensuite, j'ai apporté des modifications à mes fichiers, validé les changements et poussé la nouvelle branche sur GitHub.

git commit . -m 'fichiers modifiés'
git push -u origin experiment

Plus tard, j'ai décidé de fusionner ma branche expérimentale dans la branche principale.

git checkout master
git merge experiment

Enfin, j'ai poussé les changements sur GitHub.

git push -u origin master

Tout s'est bien passé jusqu'à ce que j'essaie de supprimer ma branche expérimentale en utilisant

git branch -d experiment

J'ai reçu le message d'erreur :

erreur : La branche 'experiment' n'est pas entièrement fusionnée.
Si vous êtes sûr de vouloir la supprimer, exécutez 'git branch -D experiment'.

Je débute un peu avec git, et je ne sais pas comment je pourrais éventuellement fusionner davantage les deux branches. Qu'est-ce que je rate ici ?

2 votes

Ce message vous aide-t-il? stackoverflow.com/questions/1710894/…

2 votes

Cela se produit parfois lorsque j'ai effectué un git commit --amend

43 votes

Aussi - Soyez conscient que ce message apparaîtra après un squash : stackoverflow.com/q/41946475/109941

425voto

sehe Points 123151

Note 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 vous apprêtez à supprimer contient des validations qui ne sont pas accessibles depuis sa branche en amont, ou HEAD (révision actuellement vérifiée). En d'autres termes, vous pourriez perdre des validations¹.

En pratique, cela signifie que vous avez probablement modifié, rebasé (y compris fusion par écrasement) ou filtré des validations et elles ne semblent pas identiques.

Par conséquent, vous pourriez éviter l'avertissement en vérifiant une branche contenant 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 effectivement aucune validation vitale:

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

Cela vous donnera une liste des validations non partagées entre les branches. Au cas où cela vous intéresserait, il pourrait y avoir une différence sans le --cherry-pick et cette différence pourrait bien être la raison de l'avertissement que vous recevez:

--cherry-pick

Exclure toute validation qui introduit le même changement qu'une autre validation du "côté opposé" lorsque l'ensemble des validations est limité avec une différence symétrique. Par exemple, si vous avez deux branches, A et B, une façon habituelle de lister toutes les validations d'un côté seulement est avec --left-right, comme l'exemple ci-dessus dans la description de cette option. Cependant, cela montre les validations qui ont été cherry-pickées de l'autre branche (par exemple, "3ème sur b" pourrait être cherry-pickée depuis la branche A). Avec cette option, de tels paires de validations sont exclues de la sortie.


¹ elles ne sont vraiment collectées que plus tard, par défaut. De plus, la commande git-branch 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 simplement de forcer la suppression, mais vous pourriez préférer avoir cette assurance supplémentaire).

35 votes

Merci. La phrase clé était "contient des commits qui ne sont pas accessibles depuis une autre référence principale". Même si je n'avais plus besoin de la branche expérimentale, que je l'avais déjà fusionnée dans master et que je prévoyais de la supprimer de l'origine, git n'allait pas être satisfait tant que je n'aurais pas poussé les changements de l'expérience vers l'origine. Je suppose que cet avertissement était une sorte de vérification de la santé.

41 votes

-1 "Cela signifie que la branche que vous êtes sur le point de supprimer contient des validations qui ne sont pas accessibles à partir d'une autre référence." Ceci n'est pas correct. L'avertissement signifie que la branche n'est pas accessible soit depuis son amont (si elle en a un), soit depuis le HEAD actuel. Voir la page de manuel de git-branch.

0 votes

@sleske +1 J'ai pu supprimer la branche après avoir poussé le repo.

112voto

drwowe Points 575

Comme l'a souligné Drew Taylor, la suppression de branche avec -d ne prend en compte que le HEAD actuel pour déterminer si la branche est "entièrement fusionnée". Il se plaindra même si la branche est fusionnée avec une autre branche. Le message d'erreur pourrait certainement être plus clair à cet égard... Vous pouvez soit passer à la branche fusionnée avant de la supprimer, soit simplement utiliser git branch -D. Le -D en majuscule annulera complètement la vérification.

4 votes

La partie sur le HEAD actuel a réglé mon problème. Mon master était différent de la branche fonctionnelle que j'avais créée en conflit :D

3 votes

Pour quelqu'un qui apprend git, le mot "actuel" semble redondant avec "HEAD"? Il n'y a pas de HEAD non actuel - HEAD est par définition le branchement actuel. Est-ce que j'ai raté quelque chose? Je suppose que vous pourriez dire "branchement actuel" ou "HEAD" mais pas "HEAD actuel".

1 votes

Y a-t-il un moyen de changer/configurer cela (par exemple, avez-vous toujours la vérification contre origin/master ?) Je suppose que vérifier origin/master en premier n'est pas trop contraignant, mais cela semble juste comme un flux un peu bizarre - pourquoi dois-je vérifier origin/master localement juste pour que vous vérifiez que mes modifications sont fusionnées là-bas ?

34voto

qwertzguy Points 1021

J'ai essayé la réponse de sehe mais cela n'a pas fonctionné.

Pour trouver les commits qui n'ont pas été fusionnés, utilisez simplement :

git log feature-branch ^master --no-merges

0 votes

Cette méthode a donné un résultat qui était beaucoup plus compréhensible que la suggestion dans la réponse acceptée.

16voto

Drew Taylor Points 196

J'ai eu cela m'arriver aujourd'hui, alors que je fusionnais ma toute première branche de fonctionnalité dans la branche principale. Comme quelqu'un l'a dit dans un fil de discussion ailleurs sur SO, l'astuce était de revenir à la branche principale avant d'essayer de supprimer la branche. Une fois de retour dans la branche principale, git était heureux de supprimer la branche sans avertissements.

8 votes

Ne semble pas être le problème spécifique ici, mais je viens de rencontrer le problème que vous décrivez juste maintenant, donc merci!

0 votes

Oui, j'avais une branche de fonctionnalité existante sur le serveur distant, mais j'ai créé une nouvelle branche avec le même nom à partir d'une autre branche de fonctionnalité. J'essayais de supprimer ma branche de fonctionnalité en double nommée localement à partir de l'autre branche de fonctionnalité. Je suis simplement allé sur la branche de fonctionnalité à partir de laquelle cette branche en double a été créée et je n'ai pas obtenu cette erreur. J'ai pu la supprimer en toute sécurité

0 votes

Il s'agit d'un avertissement différent, sans le 'n'est pas entièrement fusionné'.

5voto

yongbin Points 1

Vous pouvez simplement comprendre :

git log --cherry master...experimental

L'option --cherry est un synonyme de --right-only --cherry-mark --no-merges

La page de manuel de git-log a dit

il est utile de limiter la sortie aux engagements de notre côté et de marquer ceux qui ont été appliqués à l'autre côté d'une histoire branchée avec git log --cherry upstream...mybranch, similaire à git cherry upstream mybranch.

Pour information. --cherry-pick omet les engagements équivalents mais --cherry-marks ne le fait pas. Il est utile de trouver les changements de rebasage et les mises à jour forcées entre l'amont et la branche publique de co-travail

0 votes

Cela a fonctionné, j'ai fait une demande de tirage sur le site github, sur le site github il était indiqué comme étant 1 commit en avance, mais ce commit était déjà dans la branche principale. De plus git branch -d -r origin/nom-de-branche fonctionne étrangement, il est censé supprimer, mais il est toujours sur le distant, et la deuxième fois il montre comme introuvable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X