En utilisant Git, afficher toutes les propagations qui sont dans une branche, mais pas l'autre(s)

j'ai une vieille branche, que je voudrais supprimer. Cependant, avant de le faire, je veux vérifier que toutes les commits faites à cette branche ont été à un moment donné fusionnées dans une autre branche. Ainsi, j'aimerais voir toutes les propagations faites à ma branche courante qui n'ont pas été appliquées à une autre branche [ou, si cela n'est pas possible sans quelques scripts, comment voit-on Toutes les propagations dans une branche qui n'ont pas été appliquées à une autre branche donnée?].

372
demandé sur Alex 2009-11-10 23:17:15

10 réponses

Vous voulez probablement seulement

git branch --contains branch-to-delete

cette liste énumère toutes les branches qui contiennent les propagations de"branche à supprimer". S'il déclare plus que "branche à supprimer", la branche a été fusionnée.

vos alternatives sont vraiment des choses de syntaxe de rev-list. par exemple git log one-branch..another-branch montre tout ce que one-branch doit avoir tout ce que another-branch A.

Vous pourriez également être intéressé par git show-branch comme un façon de voir ce qui est là.

252
répondu Dustin 2012-09-07 14:12:02

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

git log oldbranch ^newbranch --no-merges

...c'est-à-dire afficher les logs de propagation pour tous les commits sur oldbranch qui sont et non sur newbranch. Vous pouvez énumérer plusieurs branches pour inclure et exclure, par exemple

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

Note: sur Windows ^ est une clé de secours, il doit donc être échappé avec un autre ^ :

git log oldbranch ^^newbranch --no-merges
448
répondu jimmyorr 2015-06-18 13:13:35

pour montrer les commits dans oldbranch mais pas dans newbranch:

git log newbranch..oldbranch

pour montrer la différence par ces commits (notez qu'il y a trois points):

git diff newbranch...oldbranch

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

64
répondu Xuan 2016-10-05 11:35:14

alors 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 appropriée pour 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 tête.

alors que dans master on pouvait exécuter la commande pour énumérer les branches une pourrait en toute sécurité enlever, comme ainsi:

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
répondu Freddie 2016-04-14 15:41:11

pour ceux qui cherchent encore une réponse simple, consultez git cherry . Il compare les diffs réels au lieu de commit hashes. Cela signifie qu'il accepte les commits qui ont été choisis ou rebasés.

première caisse la branche que vous souhaitez supprimer:

git checkout [branch-to-delete]

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

git cherry -v master

exemple de sortie:

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

Note: le drapeau -v doit inclure le message de propagation avec le hachage SHA.

Les lignes

précédées du" + " se trouvent dans la branche à supprimer, mais pas dans la branche principale. Ceux avec un " - " devant un équivalent s'engager dans le maître.

Pour les commits qui ne sont pas en maître, combiner cherry pick avec grep:

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

exemple de sortie:

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
42
répondu Tim S 2015-10-14 23:38:36

réponse de jimmyorr ne fonctionne pas sur Windows. il est utile d'utiliser --not au lieu de ^ comme suit:

git log oldbranch --not newbranch --no-merges
14
répondu sebeck 2017-05-23 11:47:30

si c'est une (simple) 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 faire ce qui suit:

$ git checkout A
$ git branch -d B

git branch -d <branchname> a la sécurité que " la branche doit être entièrement fusionnée dans la tête."

Note que cela supprime effectivement la branche si elle est fusionnée,

7
répondu Jakub Narębski 2016-02-26 21:20:16

vous pouvez utiliser ce script simple pour voir 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  --pretty=format:'%H - %s')

vous pouvez utiliser aussi l'outil git-wtf qui affichera l'état des branches

3
répondu manRo 2012-05-31 15:29:23

pour lister les propagations manquantes entre deux branches, vous pouvez utiliser compare-branches.py

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

-1
répondu Bernd Schubert 2014-03-19 17:03:50

créez une demande via le service d'hébergement git que vous utilisez. Si la branche a été entièrement fusionnée dans la branche de base, vous ne pourrez pas créer la nouvelle PR.

par exemple, sur GitHub:

il n'y a rien à comparer

Can't create a PR for branches that have been merged.

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 se souvenir d'une autre commande arcane git.

-4
répondu pkamb 2017-07-13 08:33:22