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.txt
sur votre branche (la local
branche), mais sur la branche maître, original.txt
a é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 A
et B
ci - dessous, qui ont été apportées original.txt
, au nouveau fichier copy.txt
.
---- X -----CP------ (master)
\
\--A---B--- (local)
Créez une branche jetable move
au point de départ de vos modifications avec git branch move X
. C'est-à-dire, mettez la move
branche à 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 local
pour 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.txt
n'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.txt
dans 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 MV
dans 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 CP
dans 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ù CP
est le commit où a copy.txt
été introduit dans l'autre branche. Cela rebase tous les changements copy.txt
en plus du CP
commit. Maintenant, votre local
branche 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 modifications soient appliquées CP
ou copy.txt
n'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.