J'ai une ancienne branche que j'aimerais supprimer. Cependant, avant de le faire, je veux vérifier que tous les commits effectués dans cette branche ont à un moment donné été fusionnés dans une autre branche. Ainsi, j'aimerais voir toutes les validations effectuées dans ma branche actuelle qui n'ont été appliquées à aucune autre branche [ou, si cela n'est pas possible sans un script, comment peut-on voir toutes les validations dans une branche qui n'ont pas été appliquées à une autre branche donnée?].
git
branch
git-branch
sircolinton
la source
la source
Réponses:
Tu veux probablement juste
Ceci listera toutes les branches qui contiennent les validations de "branch-to-delete". S'il signale plus que "branche à supprimer", la branche a été fusionnée.
Vos alternatives ne sont vraiment que des choses de syntaxe rev-list. Par exemple,
git log one-branch..another-branch
montre tout ce quione-branch
doit avoir toutanother-branch
.Vous pourriez également être intéressé
git show-branch
par un moyen de voir où.la source
git branch --contains some-branch
seulement elle revientsome-branch
, alors elle retourne quelque chose, mais elle n'a pas été fusionnée.git log foo..bar
cela montrera les validations entre la dernière barre et la dernière foo, mais pas d'autres validations manquantes plus loin dans le temps. Pour tout voir en bar mais pas en foo, vous devez utiliser la solution de @ jimmyorr.Pour voir la liste des validations sur une branche mais pas sur une autre, utilisez git log:
... c'est-à-dire afficher les journaux de validation pour toutes les validations sur oldbranch qui ne sont pas sur newbranch. Vous pouvez répertorier plusieurs branches à inclure et à exclure, par exemple
Remarque: sous Windows
^
est une clé d'échappement, elle doit donc être échappée avec une autre^
:la source
^
d'un préfixe ici m'a dérouté. Dans ce contexte, cela signifie exclure cette branche. L'utilisation^
comme suffixe serait une référence relative au commit parent de cette branche.gitk oldbranch ^newbranch --no-merges
(Testé avec git 1.8.1.1). Note latérale, pour moi, cela^
signifie un engagement HEAD inclusif de la branchenewbranch
.Pour afficher les commits dans oldbranch mais pas dans newbranch:
Pour afficher le diff par ces commits (notez qu'il y a trois points):
Voici le doc avec une illustration de schéma https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges
la source
newbranch
ouoldbranch
, nous pouvons fairegit log ..oldbranch
ougit log newbranch..
respectivement..
entre les noms des arbitres. J'ai également utilisé l'--cherry-pick
option pour masquer les commits qui sont présents sur les deux branches mais qui ont un hachage différent car ils ont été sélectionnés d'une branche à l'autre.Pour ceux qui recherchent toujours une réponse simple, consultez git cherry . Il compare les différences réelles au lieu des hachages de validation. Cela signifie qu'il accepte les commits qui ont été sélectionnés ou rebasés.
Vérifiez d'abord la branche que vous souhaitez supprimer:
git checkout [branch-to-delete]
puis utilisez git cherry pour le comparer à votre branche de développement principale:
git cherry -v master
Exemple de sortie:
Remarque: L'
-v
indicateur doit inclure le message de validation avec le hachage SHA.Les lignes avec le «+» devant sont dans la branche à supprimer, mais pas dans la branche principale. Ceux avec un '-' devant ont un commit équivalent dans master.
Pour JUSTE les commits qui ne sont pas en master, combinez cherry pick avec grep:
git cherry -v master | grep "^\+"
Exemple de sortie:
la source
diff
utilitaire unix pour comparer les différents fichiers. Ou, vous pouvez créer une branche temporaire et écraser toutes les validations similaires à ce que vous avez fait avec la branche d'origine, puis l'utiliser, ce qui, je pense, fonctionnerait.Bien que certaines des réponses publiées ici vous aideront à trouver ce que vous cherchez, la sous-commande suivante de git branch est une solution plus adaptée à votre tâche.
--merged est utilisé pour trouver toutes les branches qui peuvent être supprimées en toute sécurité, car ces branches sont entièrement contenues par HEAD.
Alors que dans l'
master
un, vous pouvez exécuter la commande pour énumérer les branches que vous pouvez supprimer en toute sécurité, comme suit:la source
La réponse de jimmyorr ne fonctionne pas sous Windows. il aide à utiliser
--not
au lieu de^
comme ça:la source
^
est pris en charge sur Windows, mais il doit être échappé, qui, sous Windows, est ( une autre)^
:git log oldbranch ^^newbranch --no-merges
.S'il s'agit d' une seule (unique) branche que vous devez vérifier, par exemple si vous voulez que la branche 'B' soit complètement fusionnée dans la branche 'A', vous pouvez simplement faire ce qui suit:
git branch -d <branchname>
a la sécurité que "La branche doit être complètement fusionnée dans HEAD."Attention : cela supprime en fait la branche B si elle est fusionnée en A.
la source
Vous pouvez utiliser ce script simple pour voir les validations qui ne sont pas fusionnées
Vous pouvez également utiliser l'outil git-wtf qui affichera l'état des branches
la source
Utilisez simplement
git cherry
pour sélectionner tous les commits dans la branchenewFeature42
par exemple:git cherry -v master newFeature42
la source
Commencez à créer une demande de pull via le service d'hébergement git que vous utilisez. Si la branche a été complètement fusionnée dans la branche de base, vous ne pourrez pas créer le nouveau PR.
Vous n'avez pas besoin de faire la demande d'extraction, utilisez simplement la première étape où vous choisissez des branches.
Par exemple, sur GitHub:
Cela n'utilise pas git sur la ligne de commande, mais je trouve souvent qu'il est utile d'utiliser les autres outils à votre disposition avec un modèle mental clair plutôt que d'essayer de se souvenir d'une autre commande git arcanique.
la source