web-dev-qa-db-fra.com

Comment puis-je savoir si une branche a déjà été fusionnée dans le maître?

J'ai un référentiel Git avec plusieurs branches. 

Comment savoir quelles branches sont déjà fusionnées dans la branche principale?

930
hectorsq

git branch --merged master liste les branches fusionnées dans master

git branch --merged liste les branches fusionnées dansTÊTE(c'est-à-dire le bout de la branche actuelle)

git branch --no-merged liste les branches qui n'ont pas été fusionnées

Par défaut, cela s'applique uniquement aux branches locales. L’indicateur -a affiche les branches locales et distantes et l’indicateur -r n’indique que les branches distantes.

1523
hectorsq

Vous pouvez utiliser la commande git merge-base pour rechercher la dernière validation commune entre les deux branches. Si ce commit est identique à celui de votre tête de branche, celle-ci a été complètement fusionnée.

Notez que git branch -d fait déjà ce genre de chose car il refusera de supprimer une branche qui n'a pas déjà été complètement fusionnée.

89
Greg Hewgill

Il existe également une solution d'interface graphique. Il suffit de taper

gitk --all

Une nouvelle fenêtre d'application affichera une représentation graphique de l'ensemble de votre dépôt, où il est très facile de savoir si une branche a déjà été fusionnée ou non

24
iberbeu

Sur le thème du nettoyage des branches distantes

git branch -r | xargs -t -n 1 git branch -r --contains

Ceci répertorie chaque branche distante suivie par les branches distantes dans lesquelles se trouvent leurs derniers SHA.

Ceci est utile pour déterminer quelles branches distantes ont été fusionnées mais n'ont pas été supprimées et lesquelles n'ont pas été fusionnées et sont donc en déclin.

Si vous utilisez 'tig' (c'est comme gitk mais basé sur un terminal), alors vous pouvez 

tig Origin/feature/someones-decaying-feature

pour voir l'historique de commit d'une branche sans avoir à git checkout

12
xxjjnn

Utilisez git merge-base <commit> <commit>

Cette commande trouve les meilleurs ancêtres communs entre deux commits. Et si l'ancêtre commun est identique au dernier commit d'une "branche", alors nous pouvons sans risque supposer qu'une "branche" a déjà été fusionnée dans le maître.

Voici les étapes

  1. Trouver le dernier hachage de commit sur la branche master 
  2. Trouver le dernier hachage de commit sur une "branche" 
  3. Exécutez la commande git merge-base <commit-hash-step1> <commit-hash-step2>
  4. Si la sortie de l'étape 3 est identique à celle de l'étape 2, une "branche" a déjà été fusionnée dans le maître.

Plus d'infos sur git merge-base https://git-scm.com/docs/git-merge-base

11
Hari

J'utilise la fonction bash suivante comme: git-is-merged develop feature/new-feature

git-is-merged () {
  merge_destination_branch=$1
  merge_source_branch=$2

  merge_base=$(git merge-base $merge_destination_branch $merge_source_branch)
  merge_source_current_commit=$(git rev-parse $merge_source_branch)
  if [[ $merge_base = $merge_source_current_commit ]]
  then
    echo $merge_source_branch is merged into $merge_destination_branch
    return 0
  else
    echo $merge_source_branch is not merged into $merge_destination_branch
    return 1
  fi
}
9
Carl G

Voici mes techniques lorsque je dois déterminer si une branche a été fusionnée, même si elle a été rebasée pour être à jour avec notre branche principale, ce qui est un scénario courant pour les branches de fonctions.

Aucune de ces approches n'est infaillible, mais je les ai trouvées utiles plusieurs fois.

1 Afficher le journal pour toutes les branches

À l'aide d'un outil visuel tel que gitk ou TortoiseGit, ou simplement git log avec --all, parcourez l'historique pour voir toutes les fusions dans la branche principale. Vous devriez pouvoir déterminer si cette branche de fonctionnalité particulière a été fusionnée ou non.

2 Toujours supprimer la branche distante lors de la fusion dans une branche de fonctionnalité

Si vous avez l'habitude de toujours supprimer à la fois les branches locale et distante lorsque vous fusionnez dans une branche de fonctionnalités, vous pouvez simplement mettre à jour et supprimer les télécommandes sur votre autre ordinateur et les branches de fonctionnalités disparaîtront.

Pour me souvenir de cela, j'utilise déjà extensions de flux git (édition AVH) } pour créer et fusionner mes branches de fonctionnalités localement. -remove la branche distante.

Exemple de création/finition de branche d'objet

554 Andreas:MyRepo(develop)$ git flow start tmp
Switched to a new branch 'feature/tmp'

Summary of actions:
- A new branch 'feature/tmp' was created, based on 'develop'
- You are now on branch 'feature/tmp'

Now, start committing on your feature. When done, use:

     git flow feature finish tmp

555 Andreas:MyRepo(feature/tmp)$ git flow finish
Switched to branch 'develop'
Your branch is up-to-date with 'if/develop'.
Already up-to-date.

[post-flow-feature-finish] Delete remote branch? (Y/n)
Deleting remote branch: Origin/feature/tmp.

Deleted branch feature/tmp (was 02a3356).

Summary of actions:
- The feature branch 'feature/tmp' was merged into 'develop'
- Feature branch 'feature/tmp' has been locally deleted
- You are now on branch 'develop'

556 Andreas:ScDesktop (develop)$

.git/hooks/post-flow-feature-finish 

NAME=$1
Origin=$2
BRANCH=$3

# Delete remote branch
# Allows us to read user input below, assigns stdin to keyboard
exec < /dev/tty

while true; do
  read -p "[post-flow-feature-finish] Delete remote branch? (Y/n) " yn
  if [ "$yn" = "" ]; then
    yn='Y'    
  fi
  case $yn in
      [Yy] ) 
        echo -e "\e[31mDeleting remote branch: $2/$3.\e[0m" || exit "$?"
        git Push $2 :$3; 
        break;;
      [Nn] ) 
        echo -e "\e[32mKeeping remote branch.\e[0m" || exit "$?"
        break;;
      * ) echo "Please answer y or n for yes or no.";;
  esac
done

# Stop reading user input (close STDIN)
exec <&-
exit 0

3 Recherche par message de validation

Si vous ne supprimez pas toujours la branche distante, vous pouvez toujours rechercher des validations similaires pour déterminer si la branche a été fusionnée ou non. Le piège réside dans le fait que la branche distante a été redéfinie sur une valeur non reconnaissable, telle que l'écrasement des validations ou la modification des messages de validation.

  • Chercher et élaguer toutes les télécommandes
  • Trouver le message du dernier commit sur la branche de fonctionnalité
  • Voir si un commit avec le même message peut être trouvé sur la branche master

Exemple de commandes sur la branche master:

gru                   
gls Origin/feature/foo
glf "my message"

Dans ma configuration bash .profile

alias gru='git remote update -p'
alias glf=findCommitByMessage

findCommitByMessage() {
    git log -i --grep="$1"
}
5
angularsen

Afin de vérifier quelles branches sont fusionnées dans le maître, vous devez utiliser ces commandes:

  • git branch <flag[-r/-a/none]> --merged master liste de toutes les branches fusionnées dans le maître.
  • git branch <flag[-r/-a/none]> --merged master | wc -l compte le nombre de toutes les branches fusionnées dans le maître.

Les drapeaux sont:

  • -a flag - (tout) montrant les branches distantes et locales
  • -r indicateur - (distant) montrant uniquement les branches distantes
  • <emptyFlag> - montrant local branches uniquement

par exemple: git branch -r --merged master vous montrera tous les référentiels distants fusionnés dans le maître.

1
avivamg

Voici un petit guide qui vous permettra de savoir si votre branche actuelle incorpore ou s'il manque des données d'une branche distante Origin/master:

$ git fetch && git branch -r --merged | grep -q Origin/master && echo Incorporates Origin/master || echo Out of date from Origin/master

Je suis tombé sur cette question lorsque je travaillais sur une branche technique et que je voulais souvent m'assurer que les travaux les plus récents étaient intégrés à ma propre branche de travail distincte. 

Pour généraliser ce test, j'ai ajouté l'alias suivant à mon ~/.gitconfig:

[alias]
   current = !git branch -r --merged | grep -q $1 && echo Incorporates $1 || echo Out of date from $1 && :

Alors je peux appeler:

$ git current Origin/master

pour vérifier si je suis courant. 

0
radke