Ho riscontrato un problema simile e l'ho risolto riformulando il mio lavoro in modo che corrispondesse all'organizzazione del file di destinazione.
Supponiamo che tu abbia modificato original.txt
il tuo ramo (il local
ramo), ma nel ramo principale original.txt
sia stato copiato in un altro, diciamo copy.txt
. Questa copia è stata eseguita in un commit che chiamiamo commit CP
.
Si desidera applicare tutte le modifiche locali, le commit A
e le B
successive, che sono state apportate original.txt
, al nuovo file copy.txt
.
---- X -----CP------ (master)
\
\--A---B--- (local)
Crea un ramo di lancio move
nel punto iniziale delle modifiche con git branch move X
. Vale a dire, metti il move
ramo in commit X
, quello prima dei commit che vuoi unire; molto probabilmente, questo è il commit da cui sei uscito per implementare le tue modifiche. Come l'utente @digory doo ha scritto di seguito, puoi farlo git merge-base master local
per trovare X
.
---- X (move)-----CP----- (master)
\
\--A---B--- (local)
Su questo ramo, emettere il seguente comando di ridenominazione:
git mv original.txt copy.txt
Questo rinomina il file. Nota che copy.txt
non esisteva ancora nel tuo albero a questo punto.
Commetti la tua modifica (la chiamiamo commit MV
).
/--MV (move)
/
---- X -----CP----- (master)
\
\--A---B--- (local)
Ora puoi modificare il lavoro su move
:
git rebase move local
Questo dovrebbe funzionare senza problemi e le tue modifiche verranno applicate copy.txt
nella tua filiale locale.
/--MV (move)---A'---B'--- (local)
/
---- X -----CP----- (master)
Ora, non è necessario o non è necessario eseguire il commit MV
nella cronologia del ramo principale, poiché l'operazione di spostamento può portare a un conflitto con l'operazione di copia durante il commit CP
nel ramo principale.
Devi solo rifare il lavoro di nuovo, scartando l'operazione di spostamento, come segue:
git rebase move local --onto CP
... dov'è CP
il commit dove è copy.txt
stato introdotto nell'altro ramo. Ciò ripristina tutte le modifiche copy.txt
sopra il CP
commit. Ora, il tuo local
ramo è esattamente come se avessi sempre modificato copy.txt
e non original.txt
, e puoi continuare a fonderti con gli altri.
/--A''---B''-- (local)
/
-----X-------CP----- (master)
È importante che le modifiche vengano applicate CP
o copy.txt
non esistano e che le modifiche vengano applicate nuovamente original.txt
.
Spero sia chiaro. Questa risposta arriva in ritardo, ma può essere utile a qualcun altro.