Question Comment puis-je savoir si une branche a déjà été fusionnée en master?


J'ai un dépôt git avec plusieurs branches.

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


853
2017-10-22 18:23


origine


Réponses:


git branch --merged master répertorie les branches fusionnées en maîtriser

git branch --merged répertorie les branches fusionnées en TÊTE (c'est-à-dire la pointe de la branche actuelle)

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

Par défaut, cela s'applique uniquement aux branches locales. le -a Le drapeau montrera les branches locales et distantes, et le -r Le drapeau montre seulement les branches distantes.


1387
2017-10-22 18:33



Vous pouvez utiliser le git merge-base commande pour trouver le dernier commit commun entre les deux branches. Si cette validation est la même que celle de votre branche, la branche a été complètement fusionnée.

Notez que git branch -d fait ce genre de chose déjà parce qu'il va refuser de supprimer une branche n'a pas déjà été complètement fusionné.


78
2017-10-22 18:25



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

gitk --all

Une nouvelle fenêtre d'application affichera une représentation graphique de votre repo entier, où il est très facile de réaliser si une branche a déjà été fusionnée ou non


22
2017-10-23 10:19



Sur le sujet du nettoyage des branches distantes

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

Cette liste répertorie chaque branche distante suivie par les branches distantes de leurs dernières SHA.

Ceci est utile pour identifier les branches distantes qui ont été fusionnées mais pas supprimées et qui n'ont pas été fusionnées et qui sont en train de se décomposer.

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

tig origin/feature/someones-decaying-feature

pour voir l'historique des commit d'une branche sans avoir à passer en caisse


12
2017-10-23 10:09



Utilisation git merge-base <commit> <commit>.

Cette commande trouve le meilleur ancêtre commun entre deux commits. Et si l'ancêtre commun est identique à la dernière validation d'une "branche", alors nous pouvons supposer qu'une "branche" a déjà été fusionnée dans le maître.

Voici les étapes

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

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


7
2017-10-13 02:05



Voici mes techniques quand j'ai besoin de savoir si une branche a été fusionnée, même si elle a été rebasée pour être à jour avec notre branche principale, qui est un scénario commun pour les branches de fonctionnalité.

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

1 Afficher le journal pour toutes les branches

En utilisant un outil visuel comme gitk ou TortoiseGit, ou simplement git log avec --all, parcourez l'historique pour voir toutes les fusions de la branche principale. Vous devriez être en mesure de repérer si cette branche 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 branche locale et la branche distante lorsque vous fusionnez dans une branche de fonctionnalité, vous pouvez simplement mettre à jour et élaguer les télécommandes sur votre autre ordinateur et les branches de fonctionnalités disparaîtront.

Pour m'aider à le faire, j'utilise déjà extensions de flux git (édition AVH) Pour créer et fusionner mes branches de fonctionnalité localement, j'ai donc ajouté le crochet de flux git suivant pour me demander si je veux également supprimer automatiquement la branche distante.

Exemple de branche de création / finition

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 ici est si la branche distante a été rebasée à l'inconnue, comme les commits écrasant ou changeant les messages de validation.

  • Récupérer et élaguer toutes les télécommandes
  • Rechercher un message de la dernière validation sur la branche de fonctionnalité
  • Voir si un commit avec le même message peut être trouvé sur la branche master

Exemples de commandes sur la branche principale:

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

Dans mon bash .profile config

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

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

5
2018-05-29 08:45



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
}

2
2018-03-22 16:49