Comment utiliser le message de validation git par défaut après avoir résolu les conflits de fusion?

Après avoir effectué une fusion et résolu les conflits, existe-t-il un moyen “simple” d’accepter 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 procédera à un git commit -m"Merge Commit" qui remplacera le message de validation généré qui répertoriera tous les fichiers de conflit. Je voudrais avoir un drapeau différent qui prendrait simplement le fichier actuel sans modification. Je sais qu’il y a une option -F ou –file =, mais cela nécessite de connaître le nom du fichier tout le temps.

Je vous remercie

De toute évidence, la “bonne” réponse consiste à amener votre développeur à suivre les pratiques correctes pour votre équipe lors de la génération de validations de fusion. Notez que le comportement que vous voulez utiliser était le comportement par défaut, et 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 dénué de sens.

Peut-être le développeur génère-t-il des commits de fusion quand il / elle devrait plutôt se rebaser à la place?

Cela dit, la validation de fusion est la sortie de git fmt-merge-msg , à laquelle vous devez alimenter les parents de la validation de fusion.

Par les documents , je viens d’essayer cette commande simple et cela a fonctionné pour moi:

 git commit --no-edit 

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

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

Si le message n’est pas capté par lui-même, il peut être envoyé à la commande git à l’aide de l’option --file , qui lit le message de validation d’un fichier:

 git commit --file .git/MERGE_MSG 

Il suffit de définir l’éditeur sur une commande qui ne fait rien:

 GIT_EDITOR=true git commit 

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

  • Le répertoire en cours n’est pas le répertoire le plus haut
  • Le référentiel actuel est un sous-module Git n’ayant donc pas le répertoire .git mais un fichier .git .

Et éventuellement:

  • MERGE_MSG contient des informations sur les fichiers en conflit.

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 à la fois dans les référentiels “normaux” et les sous-modules. Si les marqueurs de conflit marqués d’un # doivent être ignorés, pour plus de simplicité, seule la première ligne du message de fusion peut ê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 - 

Je devais utiliser la touche -F dans les alias car je ne pouvais pas faire émettre des citations de Git dans les commandes générées avec bash (sinon git commit se plaindrait des commits partiels lors des fusions).


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

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

Chaque fois qu’il y a un conflit de fusion, un «diff combiné» vous indiquera quels fichiers étaient en conflit: git diff HEAD HEAD^1 HEAD^2 --name-only . Je ne sais pas si, techniquement, un diff combiné peut afficher plus de fichiers que ceux qui sont en conflit.

Mais, en supposant que cela fonctionne comme nous le souhaitons (ce qui est une hypothèse), alors vous pouvez avoir un hook git commit-msg 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 les diff combinent les fichiers?
  3. Si oui, la chaîne “Conflicts:” suivie de ces noms de fichiers?

Si ces conditions échouent, faites en sorte que le script imprime une explication de ce qui ne va pas, puis renvoyez une valeur différente de zéro pour annuler la validation. Vous pouvez faire en sorte que les développeurs installent ce hook de validation, ou vous pouvez également l’installer sur le serveur pour le faire respecter à coup sûr.