J'ai eu un problème similaire et je l'ai résolu en rebasant mon travail pour qu'il corresponde à l'organisation du fichier cible. Cela fonctionne parce que git garde une trace des fichiers contenu Ainsi, en procédant à un rebasage à la suite d'un renommage, les modifications sont appliquées comme il se doit.
Plus précisément, disons que vous avez modifié original.txt
sur votre branche (le local
), mais sur la branche master, original.txt
a été copié dans un autre, disons copy.txt
. Cette copie a été effectuée dans un commit que nous appelons commit CP
.
Vous souhaitez appliquer toutes vos modifications locales, les commits A
y B
ci-dessous, qui ont été faites le original.txt
vers le nouveau fichier copy.txt
.
---- X -----CP------ (master)
\
`--A---B--- (local)
Créer une branche jetable move
au point de départ de vos modifications avec git branch move X
. En d'autres termes, il s'agit de mettre le move
branche au moment de la validation X
, celui qui précède les commits que vous souhaitez fusionner ; il s'agit très probablement du commit à partir duquel vous avez effectué une dérivation pour mettre en œuvre vos changements. Comme l'utilisateur @digory doo a écrit ci-dessous, vous pouvez faire git merge-base master local
pour trouver X
.
---- X (move)-----CP----- (master)
\
`--A---B--- (local)
Sur cette branche, lancez la commande de renommage suivante :
git mv original.txt copy.txt
Cette opération permet de renommer le fichier. Notez que copy.txt
n'existait pas encore dans votre arbre à ce moment-là.
Validez votre modification (nous appelons cette validation "commit") MV
).
,--MV (move)
/
---- X -----CP----- (master)
\
`--A---B--- (local)
Vous pouvez maintenant baser votre travail sur la base de move
:
git rebase move local
Cela devrait fonctionner sans problème, et vos modifications sont appliquées à copy.txt
dans votre agence locale.
,--MV (move)---A'---B'--- (local)
/
---- X -----CP----- (master)
Il n'est pas nécessaire d'avoir un engagement. MV
dans l'historique de votre branche principale, car l'opération de déplacement peut entraîner un conflit avec l'opération de copie lors du commit CP
dans la branche principale.
Il vous suffit de rebaser à nouveau votre travail, en supprimant l'opération de déplacement, comme suit :
git rebase move local --onto CP
... où CP
est l'engagement où copy.txt
a été introduite dans l'autre branche. Ceci rebase tous les changements sur copy.txt
au sommet de la CP
commettre. Maintenant, votre local
est exactement comme si vous aviez toujours modifié copy.txt
et non original.txt
et vous pouvez continuer à fusionner avec d'autres.
,--A''---B''-- (local)
/
-----X-------CP----- (master)
Il est important que les changements soient appliqués sur CP
ou autre copy.txt
n'existerait pas et les changements seraient appliqués en retour sur le site de la original.txt
.
J'espère que c'est clair. Cette réponse arrive tardivement, mais elle peut être utile à quelqu'un d'autre.