521 votes

En utilisant Git, afficher tous les commits qui sont dans une branche, mais pas dans l'autre (les autres)

J'ai une ancienne branche que je voudrais supprimer. Cependant, avant de le faire, je veux vérifier que tous les commits faits sur cette branche ont été à un moment donné fusionnés dans une autre branche. J'aimerais donc voir toutes les modifications apportées à ma branche actuelle qui n'ont pas été appliquées à une autre branche (ou, si ce n'est pas possible sans script, comment voir toutes les modifications d'une branche qui n'ont pas été appliquées à une autre branche).

0 votes

Pour lister les commits manquants entre deux branches, vous pouvez utiliser compare-branches.py bitbucket.org/aakef/compare-git-branches

0 votes

644voto

jimmyorr Points 3004

Pour voir la liste des commits qui sont sur une branche mais pas sur une autre, utilisez git log :

git log --no-merges oldbranch ^newbranch

...c'est à dire afficher les logs des commits pour tous les commits sur oldbranch qui sont no sur newbranch. Vous pouvez lister plusieurs branches à inclure et à exclure, par exemple

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

Note : à l'invite de commande de Windows (pas Powershell) ^ est une touche d'échappement, elle doit donc être échappée avec une autre touche ^ :

git log --no-merges oldbranch ^^newbranch

2 votes

Je l'ai trouvé en cherchant git compare commits de deux branches.

32 votes

C'est exactement ce que je cherchais. Mais, en utilisant ^ comme préfixe m'a troublé. Dans ce contexte, il signifie exclure cette branche. L'utilisation de ^ comme suffixe serait une référence relative au commit parent de cette branche.

4 votes

Très utile, merci. Je suis curieux de savoir pourquoi l'option --no-merges est nécessaire. Il est certain que l'on veut voir ces commits aussi ?

345voto

Dustin Points 35205

Vous souhaitez probablement

git branch --contains branch-to-delete

Ceci listera toutes les branches qui contiennent les commits de "branch-to-delete". Si elle rapporte plus que "branche-à-supprimer", la branche a été fusionnée.

Vos alternatives ne sont en fait que des syntaxes de listes de révisions, par exemple git log one-branch..another-branch montre tout ce que one-branch doit tout avoir another-branch a.

Vous pouvez également être intéressé par git show-branch comme moyen de voir où se trouve l'information.

2 votes

1 votes

La ligne "S'il rapporte quelque chose, la branche a fusionné" peut être mal interprétée : si git branch --contains some-branch ne renvoie que some-branch Il renvoie alors quelque chose, mais il n'y a pas de no ont été fusionnés.

5 votes

Il convient de noter que git log foo..bar affichera les commits entre le dernier de bar et le dernier de foo, mais pas les autres commits manquants plus loin dans le temps. Pour voir tout ce qui se trouve dans bar mais pas dans foo, vous devriez utiliser la solution de @jimmyorr.

113voto

Xuan Points 1174

Pour afficher les commits dans oldbranch mais pas dans newbranch :

git log newbranch..oldbranch

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

git diff newbranch...oldbranch

Voici le document avec un diagramme d'illustration https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges

1 votes

Voir Commentaire de Paul A Jungwirth ci-dessus. Il semblerait que cela ne permette pas de prendre en compte certains anciens commits ?

2 votes

Je ne sais pas ce que signifient les anciens engagements. Le double point demande à Git de résoudre une série de commits qui sont accessibles à partir d'un commit mais qui ne le sont pas à partir d'un autre. Voici la documentation avec un diagramme illustré git-scm.com/book/fr/v2/

1 votes

Et si nous sommes sur l'un ou l'autre newbranch o oldbranch nous pouvons faire git log ..oldbranch o git log newbranch.. respectivement

51voto

Freddie Points 619

Bien que certaines des réponses affichées ici vous aideront à trouver ce que vous cherchez, la sous-commande suivante de branche git est une solution plus adaptée à votre tâche.

-- fusionné est utilisé pour trouver toutes les branches qui peuvent être supprimées en toute sécurité, puisque ces branches sont entièrement contenues par HEAD.

Alors qu'en master on pourrait exécuter la commande pour énumérer les branches que l'on peut supprimer en toute sécurité, comme suit :

git branch --merged
  develop
  fpg_download_links
* master
  master_merge_static

# Delete local and remote tracking branches 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 branches in the output
git branch --remotes --merged

8voto

Jakub Narębski Points 87537

Si c'est le cas un (unique) que vous devez vérifier, par exemple si vous voulez que la branche 'B' soit entièrement fusionnée dans la branche 'A', vous pouvez simplement faire ce qui suit :

$ git checkout A
$ git branch -d B

git branch -d <branchname> a la sécurité suivante : "La branche doit être entièrement fusionnée dans HEAD."

Attention : cela supprime en fait la branche B si elle est fusionnée dans A.

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