Miałem podobny problem i rozwiązałem go, dostosowując moją pracę do docelowej organizacji plików.
Powiedzmy, że zmodyfikowałeś original.txtswoją gałąź ( localgałąź), ale na gałęzi głównej, original.txtzostała skopiowana do innej, powiedzmy copy.txt. Ta kopia została wykonana w zatwierdzeniu, które nazywamy commit CP.
Chcesz zastosować wszystkie lokalne zmiany, zatwierdzenia Ai Bponiższe zmiany, które zostały wprowadzone w original.txtnowym pliku copy.txt.
---- X -----CP------ (master)
\
`--A---B--- (local)
Utwórz gałąź jednorazowego użytku movew punkcie początkowym zmian za pomocą git branch move X. To znaczy, umieść movegałąź w zatwierdzeniu X, tym przed zatwierdzeniami, które chcesz scalić; najprawdopodobniej jest to zatwierdzenie, z którego wyszedłeś, aby wprowadzić zmiany. Jak napisał poniżej użytkownik @digory doo , możesz git merge-base master localznaleźć X.
---- X (move)-----CP----- (master)
\
`--A---B--- (local)
W tej gałęzi wydaj następujące polecenie zmiany nazwy:
git mv original.txt copy.txt
Spowoduje to zmianę nazwy pliku. Zauważ, że copy.txtw tym momencie jeszcze nie istniał w twoim drzewie.
Zatwierdź swoją zmianę (nazywamy to zatwierdzenie MV).
,--MV (move)
/
---- X -----CP----- (master)
\
`--A---B--- (local)
Możesz teraz oprzeć swoją pracę na move:
git rebase move local
Powinno to działać bez problemu, a zmiany zostaną zastosowane copy.txtw lokalnym oddziale.
,--MV (move)---A'---B'--- (local)
/
---- X -----CP----- (master)
Teraz niekoniecznie chcesz lub musisz mieć zatwierdzenie MVw historii swojej głównej gałęzi, ponieważ operacja przenoszenia może prowadzić do konfliktu z operacją kopiowania przy zatwierdzaniu CPw głównej gałęzi.
Musisz tylko ponownie ustawić bazę swojej pracy, odrzucając operację przenoszenia w następujący sposób:
git rebase move local --onto CP
... gdzie CPjest zatwierdzenie, gdzie copy.txtzostało wprowadzone w innej gałęzi. Ten rebases wszystkie zmiany na copy.txtna szczycie CPpopełnić. Teraz twoja localgałąź jest dokładnie taka, jakbyś zawsze modyfikowała, copy.txta nie original.txt, i możesz kontynuować scalanie z innymi.
,--A''---B''-- (local)
/
-----X-------CP----- (master)
Ważne jest, aby zmiany zostały zastosowane CPlub w inny copy.txtsposób nie istniałyby, a zmiany zostałyby zastosowane ponownie original.txt.
Mam nadzieję, że to jest jasne. Ta odpowiedź jest spóźniona, ale może być przydatna dla kogoś innego.