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?
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).
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.
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.
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
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:
- la branche actuelle (HEAD)
- 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).
Où 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.
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.
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.
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
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