Git et" la branche 'x' n'est pas entièrement fusionnée " erreur

Voici les commandes que j'ai utilisées depuis la branche master

git branch experiment
git checkout experiment

Ensuite, j'ai apporté quelques modifications à mes fichiers, commis les modifications et poussé la nouvelle branche vers GitHub.

git commit .
git push -u origin experiment

Notez qu'après git commit . on m'a demandé un message de validation, et je lui ai donné un. Plus tard, j'ai décidé de fusionner ma branche experiment dans la branche master.

git checkout master
git merge experiment

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

git push -u origin master

Tout s'est bien passé jusqu'à ce que j'essaie de supprimer ma branche experiment utilisation de

git branch -d experiment

J'ai eu le message d'erreur error: The branch 'experiment' is not fully merged. je suis un peu nouveau pour git, et je ne sais pas combien de plus je pourrais éventuellement fusionner les deux branches. Ce qui me manque ici?

224
demandé sur Yahel 2011-09-26 02:01:22

9 réponses

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 êtes sur le point de supprimer contient des commits qui ne sont accessibles depuis aucune des branches amont ou HEAD (révision actuellement extraite). en d'autres termes, quand vous risquez de perdre des commits1.

En pratique, cela signifie que vous avez probablement modifié, rebasé ou filtré des commits et qu'ils ne semblent pas identiques.

Par conséquent, vous pouvezéviter l'avertissement en vérifiant une branche qui contient les commits sur lesquels vous êtesun-reference en supprimant cette autre branche.²

Vous voudrez vérifier que vous ne manquez pas de commits vitaux:

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

Cela vous donnera une liste de tous les non partagés entre les branches. Dans le cas où 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 obtenir:

--cherry-pick

Omettez tout commit qui introduit le même changement qu'un autre commit de "l'autre côté" lorsque l'ensemble des commits est limité avec une différence symétrique. Par exemple, si vous avez deux branches, A et B, une façon habituelle de lister tous les commits sur un seul côté d'entre eux est avec --left-right, comme l'exemple ci-dessus dans la description de cette option. Il montre cependant les commits qui ont été sélectionnés dans l'autre branche (par exemple, "3rd on b" peut être cerise-cueillies de la branche A). Avec cette option, ces paires de commits sont exclues de la sortie.


1 ils ne sont vraiment que des ordures collectées après un certain temps, par défaut. De plus, la commande git-branch ne vérifie pas l'arborescence des révisions de toutes les branches . L'avertissement est là pour éviter les erreurs évidentes.

2 (Ma préférence ici est de simplement forcer la suppression à la place, mais vous voudrez peut-être avoir l'assurance supplémentaire).

240
répondu sehe 2016-03-17 23:42:29

Comme L'a souligné Drew Taylor, la suppression de branche avec -d ne considère que la tête actuelle 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 extraire la branche fusionnée avant de la supprimer, soit simplement utiliser git branch-D. Le capital-D remplacera entièrement la vérification.

64
répondu drwowe 2012-04-02 14:59:00

Cela 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 fil ailleurs sur SO, L'astuce était de 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.

12
répondu Drew Taylor 2012-03-05 23:52:21

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

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

git log oldbranch ^newbranch --no-merges
10
répondu qwertzguy 2013-09-17 20:26:51

Git avertit que vous risquez de perdre l'historique en supprimant cette branche. Même si cela ne supprimerait aucun commit tout de suite, une partie ou la totalité des commits sur la branche deviendraient inaccessibles s'ils ne font pas partie d'une autre branche.

, Pour la direction, experiment "être complètement fusionné" dans une autre branche, sa pointe s'engager doit être un ancêtre de l'autre branche de la pointe, rendant l'engage dans experiment un sous-ensemble de l'autre branche. Cela rend sûr de supprimer experiment, puisque tous sa s'engage restera une partie de l'historique du dépôt par l'autre branche. Il doit être" entièrement " fusionné, car il peut avoir déjà été fusionné plusieurs fois, mais maintenant des commits ajoutés depuis la dernière fusion qui ne sont pas contenus dans l'autre branche.

Git ne vérifie pas toutes les autres branches du dépôt, cependant; juste deux:

  1. la branche actuelle (HEAD)
  2. la branche amont, s'il y en a une

La "branche amont" pour experiment, comme dans votre cas est probablement origin/experiment. Si experiment est entièrement fusionné dans la branche courante, git la supprime sans aucune plainte. Si ce n'est pas le cas, mais qu'il est entièrement fusionné dans sa branche amont, alors Git procède avec un avertissement semblant comme:

warning: deleting branch 'experiment' that has been merged
to 'refs/remotes/origin/experiment', but not yet merged to
HEAD.
Deleted branch experiment (was xxxxxxxx).

xxxxxxxx indique un ID de validation. Être entièrement fusionné dans son amont indique que les commits dans experiment ont été poussés vers le référentiel d'origine, de sorte que même si vous les perdez ici, ils peuvent au moins être enregistrés ailleurs.

Puisque Git ne le fait pas vérifiez les autres branches, il peut être prudent de supprimer une branche car vous savez qu'elle est entièrement fusionnée dans une autre; vous pouvez le faire avec l'option -D comme indiqué, ou passer d'abord à cette branche et laisser git confirmer le statut entièrement fusionné pour vous.

4
répondu troore 2014-12-11 16:04:23

Pour voir les changements qui ne sont pas fusionnés, j'ai fait ceci:

git checkout experiment
git merge --no-commit master

git diff --cached

Remarque: Cette montre l'évolution de master qui ne sont pas dans experiment.

N'oubliez pas de:

git merge --abort

Quand vous avez fini de regarder.

3
répondu ThorSummoner 2014-05-20 20:48:43

Je n'avais pas la branche amont sur mon Git local. J'avais créé une branche locale de master, git checkout-b mybranch . J'ai créé une branche avec bitbucket GUI sur le git amont et poussé ma branche locale (mybranch) à cette branche amont. Une fois que j'ai fait un git fetch sur mon Git local pour récupérer la branche amont, je pourrais faire une branche git-d mybranch.

1
répondu edW 2016-10-31 15:05:24

Vous pouvez simplement comprendre:

Git log --la cerise maître...expérimental

--de cerise est un synonyme de --droit-seulement-cerise-marque-pas-fusionne

La page de manuel Git-log a dit

Il est utile de limiter la sortie aux commits de notre côté et de marquer ceux qui ont été appliqués à l'autre côté d'un historique fourchu avec git log --cherry upstream...mybranch, similaire à git cherry en amont mybranch.

Pour info. --cherry-pick omet les commits équivalents mais --cherry-marks ne le font pas. il est utile de trouver le rebase et de forcer les changements mis à jour entre la branche publique amont et co-working

0
répondu yongbin 2016-07-06 15:56:36

Solution la plus simple avec explication (solution vérifiée deux fois) (face au problème avant)

LE PROBLÈME EST:

1 - je ne peux pas supprimer une branche

2 - le terminal keep affiche un message d'avertissement indiquant que certains commits ne sont pas encore approuvés

3 - sachant que j'ai vérifié le maître et le branche et qu'ils sont identiques (à jour)

Solution:

git checkout master
git merge branch_name
git checkout branch_name
git push
git checkout master
git branch -d branch_name

Explication:

Lorsque votre branche est connectée à une branche distante en amont (on Github, bitbucket ou autre), vous devez le fusionner (push) dans le maître, et vous devez pousser les nouveaux changements (commits) dans le repo distant (Github, bitbucket ou autre) de la branche,

Ce que j'ai fait dans mon code, c'est que je suis passé à master, puis que je fusionne la branche (pour m'assurer qu'elles sont identiques sur votre machine locale), puis je suis passé à la branche et j'ai poussé les mises à jour ou les modifications dans le repo en ligne distant en utilisant "git push".

Après cela, je suis passé à la maître à nouveau, et a essayé de supprimer la branche, et le problème (message d'avertissement) a disparu, et la branche supprimée avec succès

0
répondu Elta3lab 2018-01-14 08:39:21