web-dev-qa-db-fra.com

En utilisant Git, affichez tous les commits qui sont dans une branche, mais pas 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 à cette branche ont été fusionnés à un moment donné dans une autre branche. Ainsi, j'aimerais voir tous les commits de ma branche actuelle qui n'ont été appliqués à aucune autre branche [ou, si cela n'est pas possible sans script, comment voir tous les commits d'une branche qui n'ont pas été appliqués à une autre branche donnée?].

415
sircolinton

Vous voulez probablement juste

git branch --contains branch-to-delete

Ceci listera toutes les branches contenant les commits de "branche à supprimer". S'il en signale plus que "branche à supprimer", la branche a été fusionnée.

Vos alternatives ne sont vraiment que des choses sur la syntaxe de la liste de révocation. par exemple. git log one-branch..another-branch montre tout ce que one-branch doit avoir tout ce que another-branch a.

Vous pouvez également être intéressé par git show-branch comme moyen de voir ce qu’il ya où.

284
Dustin

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

git log --no-merges oldbranch ^newbranch

... c'est-à-dire, affiche les journaux de commit pour tous les commits sur oldbranch qui sont pas sur newbranch. Vous pouvez répertorier plusieurs branches à inclure et à exclure, par exemple.

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

Remarque: sous Windows ^ est une touche d'échappement, il doit donc être échappé avec un autre ^:

git log --no-merges oldbranch ^^newbranch
500
jimmyorr

Pour afficher 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

80
Xuan

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

- merged est utilisé pour rechercher toutes les branches pouvant être supprimées en toute sécurité, car ces branches sont entièrement contenues dans HEAD.

Tandis que dans master, vous pouvez exécuter la commande pour énumérer les branches que vous pouvez supprimer en toute sécurité, comme ceci:

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
49
Freddie

Pour ceux qui recherchent encore une réponse simple, consultez git cherry . Il compare les différences réelles au lieu des hachages de validation. Cela signifie qu’il s’adapte aux commits qui ont été choisis ou rebasés.

Commencez par vérifier la branche que vous souhaitez supprimer:

git checkout [branch-to-delete]

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

git cherry -v master

Exemple de sortie:

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

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

Les lignes précédées du signe "+" se trouvent dans la branche à supprimer, mais pas dans la branche principale. Ceux qui ont un '-' devant ont un commit équivalent en master.

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

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

Exemple de sortie:

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
49
Tim S

réponse de jimmyorr ne fonctionne pas sous Windows. il est utile d’utiliser --not au lieu de ^ comme ceci:

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

Si c'est n (unique) branche 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 procéder comme 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 la branche B si elle est fusionnée avec A.

7
Jakub Narębski

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 <branchname>
#
# 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 branches

3
manRo