J'ai eu un problème similaire et je l'ai résolu en rebasant mon travail pour qu'il corresponde à l'organisation de fichiers cible.
Disons que vous avez modifié original.txtsur votre branche (la localbranche), mais sur la branche maître, original.txta été copiée dans une autre, par exemple copy.txt. Cette copie a été faite dans un commit que nous nommons commit CP.
Vous voulez appliquer toutes vos modifications locales, commits Aet Bci - dessous, qui ont été apportées original.txt, au nouveau fichier copy.txt.
---- X -----CP------ (master)
\
\--A---B--- (local)
Créez une branche jetable moveau point de départ de vos modifications avec git branch move X. C'est-à-dire, mettez la movebranche à commit X, celle qui précède les commits que vous souhaitez fusionner; il s'agit probablement du commit à partir duquel vous vous êtes diversifié pour implémenter vos modifications. Comme l'a écrit l' utilisateur @digory doo ci-dessous, vous pouvez le faire git merge-base master localpour trouver X.
---- X (move)-----CP----- (master)
\
\--A---B--- (local)
Sur cette branche, exécutez la commande de changement de nom suivante:
git mv original.txt copy.txt
Cela renomme le fichier. Notez que cela copy.txtn'existait pas encore dans votre arbre à ce stade.
Validez votre modification (nous appelons ce commit MV).
/--MV (move)
/
---- X -----CP----- (master)
\
\--A---B--- (local)
Vous pouvez maintenant rebaser votre travail en plus de move:
git rebase move local
Cela devrait fonctionner sans problème et vos modifications sont appliquées copy.txtdans votre succursale locale.
/--MV (move)---A'---B'--- (local)
/
---- X -----CP----- (master)
Maintenant, vous ne voulez pas ou n'avez pas nécessairement besoin d'avoir une validation MVdans l'historique de votre branche principale, car l'opération de déplacement peut conduire à un conflit avec l'opération de copie lors de la validation CPdans la branche principale.
Il vous suffit de rebaser à nouveau votre travail en annulant l'opération de déplacement, comme suit:
git rebase move local --onto CP
... où CPest le commit où a copy.txtété introduit dans l'autre branche. Cela rebase tous les changements copy.txten plus du CPcommit. Maintenant, votre localbranche est exactement comme si vous aviez toujours modifié copy.txtet non original.txt, et vous pouvez continuer à fusionner avec d'autres.
/--A''---B''-- (local)
/
-----X-------CP----- (master)
Il est important que les modifications soient appliquées CPou copy.txtn'existeraient pas et que les modifications seraient appliquées de nouveau original.txt.
J'espère que c'est clair. Cette réponse arrive tardivement, mais cela peut être utile à quelqu'un d'autre.