En utilisant Git, affichez tous les commits qui sont dans une twig, mais pas les autres

J’ai une ancienne twig, que je voudrais supprimer. Cependant, avant de le faire, je veux vérifier que tous les commits effectués sur cette twig ont été fusionnés à un autre moment. Ainsi, j’aimerais voir tous les commits effectués sur ma twig actuelle qui n’ont pas été appliqués à une autre twig [ou, si cela n’est pas possible sans un script, comment voir tous les commits d’une twig qui n’ont pas été appliqués à une autre twig donnée?].

Vous voulez probablement juste

git branch --contains branch-to-delete 

Cela listera toutes les twigs contenant les commits de “branch-to-delete”. S’il rapporte plus que simplement “branch-to-delete”, la twig a été fusionnée.

Vos alternatives ne sont vraiment que des choses de syntaxe de liste de révision. ex. git log one-branch..another-branch montre tout ce dont one-branch besoin pour avoir tout another-branch .

Vous pouvez également être intéressé par git show-branch comme un moyen de voir où.

Pour voir une liste des commits sur une twig mais pas sur une autre, utilisez git log:

 git log oldbranch ^newbranch --no-merges 

… c’est-à-dire afficher les journaux de validation pour tous les commits sur oldbranch qui ne sont pas sur newbranch. Vous pouvez lister plusieurs twigs à inclure et exclure, par exemple

 git log oldbranch1 oldbranch2 ^newbranch1 ^newbranch2 --no-merges 

Remarque: sous Windows ^ est une clé d’échappement, il faut donc l’éviter avec un autre ^ :

 git log oldbranch ^^newbranch --no-merges 

Pour montrer les commits dans oldbranch mais pas dans newbranch:

 git log newbranch..oldbranch 

Pour montrer le diff par ces commits (notez qu’il y a trois points):

 git diff newbranch...oldbranch 

Voici la doc avec une illustration de diagramme https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges

Bien que certaines des réponses affiché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 twigs qui peuvent être supprimées en toute sécurité, car ces twigs sont entièrement contenues par HEAD.

Alors que dans master on pouvait exécuter la commande pour énumérer les twigs que l’on pouvait supprimer en toute sécurité, comme ceci:

 git branch --merged develop fpg_download_links * master master_merge_static # Delete local and remote tracking twigs you don't want git branch -d fpg_download_links git push origin :fpg_download_links git branch -d master_merge_static git push origin :master_merge_static # There is also a flag to specify remote twigs in the output git branch --remotes --merged 

Pour ceux qui recherchent toujours une réponse simple, jetez un coup d’ œil à git cherry . Il compare les diffs réels au lieu des hachages de validation. Cela signifie qu’il accueille les commits qui ont été sélectionnés ou rebasés.

Commencez par extraire la twig que vous souhaitez supprimer:

git checkout [branch-to-delete]

utilisez ensuite git cherry pour le comparer à votre twig de développement principale:

git cherry -v master

Exemple de sortie:

 + 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message + b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message - 85867e38712de930864c5edb7856342e1358b2a0 Yet another message 

Remarque: L’ -v doit inclure le message de validation avec le hachage SHA.

Les lignes avec le ‘+’ en avant sont dans la twig-à-supprimer, mais pas la twig principale. Ceux avec un ‘-‘ en avant ont un commit équivalent en master.

Pour JUST les commits qui ne sont pas dans master, combinez pick cherry avec grep:

git cherry -v master | grep "^\+"

Exemple de sortie:

 + 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message + b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message 

La réponse de jimmyorr ne fonctionne pas sous Windows. ça aide d’utiliser – --not au lieu de ^ comme ça:

 git log oldbranch --not newbranch --no-merges 

Si vous devez vérifier une twig unique , par exemple si vous souhaitez que la twig B soit entièrement intégrée dans la twig A, vous pouvez simplement effectuer les opérations suivantes:

 $ git checkout A $ git branch -d B 

git branch -d a la sécurité que “la twig doit être entièrement fusionnée dans HEAD”.

Notez que cela supprime effectivement la twig si elle est fusionnée,

Vous pouvez utiliser ce script simple pour voir les commits qui ne sont pas fusionnés

 #!/bin/bash # Show commits that exists only on branch and not in current # Usage: # git branch-notmerge  # # Setup git alias # git config alias.branch-notmerge [path/to/this/script] grep -Fvf <(git log --pretty=format:'%H - %s') <(git log $1 --pretty=format:'%H - %s') 

Vous pouvez également utiliser l'outil git-wtf qui affichera l'état des twigs

Pour lister les commits manquants entre deux twigs, vous pouvez utiliser compare-twigs.py

https://bitbucket.org/aakef/compare-git-twigs

Créez une requête Pull via le service d’hébergement git que vous utilisez. Si la twig a été entièrement fusionnée dans la twig de base, vous ne pourrez pas créer le nouveau PR.

Par exemple, sur GitHub:

Il n’y a rien à comparer

Impossible de créer un PR pour les branches qui ont été fusionnées.

Cela n’utilise pas git sur la ligne de commande, mais je trouve souvent utile d’utiliser les autres outils à votre disposition avec un modèle mental clair plutôt que d’essayer de mémoriser une autre commande d’arcane git.