Cela peut sembler étrange et ça m'a surpris la première fois, mais il peut arriver d'avoir un conflit fantôme avec Git. Mais qu'est ce qu'un conflit fantôme ? Personnellement j'en ai la connaissance que de deux types mais je suppose qu'il y a d'autres types également.

Le premier cas, celui sur lequel je suis tombé, est GitLab (et je le précise car je ne sais pas si GitHub est capable d'avoir le même comportement) détecte un conflit entre le fichier que je veux push et la version déjà disponible vers la branche cible. Sauf que le fichier ne montre aucun changement dans l'outil de conflit de GitLab et que l'état du fichier n'est pas celui qui est montré (évidemment les commits sont les mêmes jusqu'au point de divergence attendu).

De plus en tentant un rebase (en local, en mettant les branches à jour) de la branche cible vers la branche source, aucun conflit n'est détecté. Ce qui signifie que GitLab imagine un conflit sur un fichier qui est de plus même pas modifié. Mon hypothèse est que GitLab vérifie le fichier d'une version antérieur par erreur par rapport au fichier actuel (ou alors que je n'ai vraiment pas eu de bol sur le hash du commit).

L'autre cas dont on m'a parlé, c'est un commit qui disparait de l'historique (ce qui peut techniquement arriver si un développeur oublie de redescendre un hotfix vers develop) ce qui cause un historique désynchronisé et un historique qui driftera de plus en plus au fur et à mesure des commits.

Le dernier cas c'est un changement de master qui n'a pas été redscendu sur develop. Dans ce cas la personne fautive est celle qui n'a pas redescendu le dit développement.

On va cependant s'attarder sur le premier cas. Donc comment forcer la merge de develop vers main, develop étant normalement votre source de vérité (puisque c'est la version avec laquelle vous travaillez et que vous n'allez pas perdre le travail effectué en écrasant vos développements par une version antérieure) puisque c'est la branche qui a été testé avant mise en production. Le tout se fait avec une commande git assez simple (à faire en local) :

git checkout main
git fetch origin
git merge -X theirs nom_de_la_branche_a_pousser_sur_master
git push

Normalement le conflit a disparu !

Have fun !