web-dev-qa-db-fra.com

Comment utiliser le message de validation git par défaut après la résolution des conflits de fusion?

Après avoir effectué une fusion et résolu des conflits, existe-t-il un moyen "simple" d'accepter simplement le message de validation généré par défaut à partir de la ligne de commande? Un de nos développeurs résoudra tous les conflits, puis effectuera une git commit -m"Merge Commit" qui remplace le message de validation généré qui répertorie tous les fichiers de conflit. Je voudrais avoir un drapeau différent qui prendrait simplement le fichier actuel sans modification. Je sais qu'il existe une option -F ou --file =, mais cela nécessite de connaître tout le temps le nom du fichier.

Je vous remercie

53
yoyodyn

De toute évidence, la "bonne" réponse ici est d'amener votre développeur à suivre les bonnes pratiques pour votre équipe lors de la génération des validations de fusion. Notez que le comportement que vous souhaitez utiliser était celui par défaut, et que ce n'est que récemment que git a commencé à exiger des messages de validation "générés par l'homme" pour les fusions. C'était pour une raison, et ce n'était pas pour que les développeurs court-circuitent le processus avec un message vide de sens.

Peut-être que le développeur génère des validations de fusion alors qu'il devrait plutôt rebaser?

Cela dit, le commit de fusion est la sortie de git fmt-merge-msg, à laquelle vous devrez nourrir les parents du commit de fusion.

7
Andy Ross

Per the docs , je viens d'essayer cette commande simple et cela a fonctionné pour moi:

git commit --no-edit

Ensuite, exécutez git log pour confirmer que le message par défaut a été utilisé.

80
gMale

Par défaut, lorsqu'une fusion échoue, le message de validation qui devait être utilisé est enregistré dans un fichier dans le dossier git, généralement .git/MERGE_MSG. Une fois les conflits résolus, exécutez git commit transmettra ce message enregistré à l'éditeur par défaut.

Si le message n'est pas récupéré par lui-même, il peut être transmis à la commande git à l'aide de --file option, qui lit le message de validation dans un fichier:

git commit --file .git/MERGE_MSG
18
LopSae

Définissez simplement l'éditeur sur une commande qui ne fait rien:

GIT_EDITOR=true git commit
14
Chronial

git commit --file .git/MERGE_MSG comme déjà mentionné est très bien mais il ignore quelques points:

  • Le répertoire actuel n'est pas le répertoire le plus haut
  • Le dépôt actuel est un sous-module Git n'ayant donc pas le .git répertoire mais un fichier .git.

Et éventuellement:

  • MERGE_MSG contient des informations sur les fichiers avec des conflits.

Les deux premiers points peuvent être utilisés avec git rev-parse:

git commit -F "$(git rev-parse --git-dir)/MERGE_MSG"

Ou, alternativement, avec un alias Git:

commit-merge = !cat $(git rev-parse --git-dir)/MERGE_MSG | git commit -F -

Cela fonctionne aussi bien dans les référentiels "normaux" que dans les sous-modules. Si la #- les marqueurs de conflit marqués doivent être supprimés, par souci de simplicité, seule la première ligne du message de fusion a pu être prise:

git commit -m $(head -1 $(git rev-parse --git-dir)/MERGE_MSG)

Ou un autre alias:

commit-merge = !head -1 $(git rev-parse --git-dir)/MERGE_MSG | git commit -F -

J'ai dû utiliser le -F saisissez des alias car je ne pouvais pas faire émettre des guillemets Git à traiter dans les commandes générées avec bash (sinon git commit se plaindrait des validations partielles lors des fusions).


Git 2.12.0 qui était publié il y a deux jours introduit git merge --continue pour effectuer une validation de fusion qui a été arrêtée lors de conflits lors de la fusion. Cela fonctionne aussi bien pour les sous-modules, mais n'accepte pas --no-edit, au moins pour le moment, il est donc suggéré à un éditeur de modifier le message de validation avant de conclure la fusion.

3
Lyubomyr Shaydariv

Si vous voulez vraiment appliquer cette règle, il pourrait y avoir un moyen de forcer cela en utilisant des hooks git.

Chaque fois qu'il y a un conflit de fusion, un "diff combiné" vous montrera quels fichiers ont été en conflit: git diff HEAD HEAD^1 HEAD^2 --name-only. Je ne sais pas s'il est techniquement possible pour un diff combiné de montrer plus fichiers que les fichiers en conflit.

Mais, en supposant que cela fonctionne comme nous le voulons (ce qui est une hypothèse), alors vous pouvez avoir un git commit-msg hook qui vérifie le message que l'utilisateur a tapé et affirme

  1. est-ce un commit de fusion?
  2. si oui, est-ce que diff diff affiche les fichiers?
  3. si c'est le cas, la chaîne "Conflicts:" suivie de ces noms de fichier?

Si ces conditions échouent, faites imprimer le script pour filtrer une explication de ce qui ne va pas, puis retournez différent de zéro pour annuler la validation. Vous pouvez demander aux développeurs d'installer ce crochet de validation, ou vous pouvez également l'installer sur le serveur pour le faire respecter à coup sûr.

0
Alexander Bird