git - locally - merge request definition



Git branch--merged/--no-fusionné et--squash option (1)

git branch --merged ne semble pas bien jouer avec --squash.

Si vous faites une git merge normale, alors git branch --merged vous indique quelles branches ont été fusionnées. Ce n'est pas le cas cependant si l'option --squash est utilisée, même si l'arbre résultant est le même.

Je doute que ce soit un défaut et je voudrais savoir s'il y a du git-fu qui me manque ou si j'ai mal compris quelque chose.

En bref: je veux utiliser --squash, mais je veux aussi que git me dise si la branche que j'ai écrasée dans un autre a été fusionnée.


Vous ne pouvez pas vous y rendre à partir d'ici (comme l'a dit le confrère). Plus précisément, cela n'a pas de sens.

Le problème est que git merge --squash ne fait pas de fusion. Supposons que votre histoire de branche ressemble à ceci, par exemple (avec les branches topic et devel ):

          H ⬅ I ⬅ J     <-- topic
        ⬋
⬅ F ⬅ G
        ⬉
          K ⬅ L         <-- devel

Si vous devel topic devel et de fusion, vous obtenez un nouveau commit de fusion M qui contient le résultat de la fusion, et M a deux parents:

          H ⬅ I ⬅ J     <-- topic
        ⬋         ⬆
⬅ F ⬅ G           ⬆
        ⬉         ⬆
          K ⬅ L ⬅ M     <-- devel

Mais si vous utilisez git merge --squash topic vous obtenez, à la place, un nouveau commit ( git merge --squash topic S pour squash):

          H ⬅ I ⬅ J     <-- topic
        ⬋
⬅ F ⬅ G
        ⬉
          K ⬅ L ⬅ S     <-- devel

où (comme vous l'avez déjà noté) le contenu (l'arbre) de commit S fait que tous les fichiers sortent comme ils le feraient dans le commit M Mais il n'y a pas de back-link (flèche parent) de S vers le topic . Ce n'est pas du tout une fusion, c'est simplement prendre tous les changements du topic , les écraser en un seul changement, et l'ajouter comme un commit entièrement indépendant.

Maintenant, l'autre chose à propos de git merge --squash est qu'il ne fait pas la validation finale. Donc, vous pouvez créer les fichiers .git que git aurait sur une fusion "régulière", et faire un commit qui a les deux parents que vous obtiendriez sur une "vraie" fusion. Et alors vous obtiendriez ... exactement ce que vous obtiendrez si vous lancez un git merge topic , un commit (étiquetez-le S ou M , ça n'a pas d'importance) qui a le même arbre, mais qui a maintenant deux flèches parent, pointant à L et J , tout comme M

En fait, exécuter git merge --squash est presque exactement le même que git merge --squash git merge --no-commit , à l'exception des fichiers de trace laissés derrière lorsque la fusion est terminée ( git commit utilise certains pour configurer les parents). La version de squash n'écrit pas dans .git/MERGE , .git/MERGE_HEAD et .git/MERGE_MODE . (Il crée .git/MERGE_MSG , le même que git merge --no-commit , et crée aussi .git/SQUASH_MSG .)

Donc, fondamentalement, vous avez votre choix: une fusion réelle (deux parents ou plus sur la validation finale), ou un squash (mêmes mécanismes de combinaison d'arbres, mais un seul parent sur la validation finale). Et, puisque git branch --merged fonctionne en regardant les "flèches parents" de chaque commit stocké dans le dépôt, seule une fusion réelle est vraiment une fusion, donc seule une fusion réelle peut être découverte plus tard par git branch .





squash