У меня была похожая проблема, и я решил ее, изменив работу, чтобы она соответствовала целевой файловой организации.
Скажем, что вы изменили original.txt
в своей ветви (ветка local
), но в основной ветви original.txt
была скопирована в другую, скажем, copy.txt
.Эта копия была сделана в коммите, который мы называем коммитом CP
.
. Вы хотите применить все свои локальные изменения, коммиты A
и B
ниже, сделанные на original.txt
, дляновый файл copy.txt
.
---- X -----CP------ (master)
\
\--A---B--- (local)
Создайте одноразовую ветвь move
в начальной точке ваших изменений с помощью git branch move X
.То есть, поместите ветвь move
в коммит X
, тот, что раньше коммитов, которые вы хотите объединить;скорее всего, это коммит, из которого вы разветвились для реализации ваших изменений.Как писал пользователь @ digory doo , вы можете git merge-base master local
найти X
.
---- X (move)-----CP----- (master)
\
\--A---B--- (local)
В этой ветке введите следующую команду переименования:
git mv original.txt copy.txt
Переименовывает файл.Обратите внимание, что copy.txt
еще не существовало в вашем дереве на данный момент.
Зафиксируйте ваше изменение (мы называем это коммитом MV
).
/--MV (move)
/
---- X -----CP----- (master)
\
\--A---B--- (local)
Теперь вы можете перебазировать свою работу поверхmove
:
git rebase move local
Это должно работать без проблем, и ваши изменения будут применены к copy.txt
в вашем местном филиале.
/--MV (move)---A'---B'--- (local)
/
---- X -----CP----- (master)
Теперь вы не обязательно хотите илинеобходимо иметь коммит MV
в истории вашей основной ветки, потому что операция перемещения может привести к конфликту с операцией копирования при коммите CP
в основной ветке.
Вам нужно только перебазировать свою работу снова, отбрасывая операцию перемещения, следующим образом:
git rebase move local --onto CP
... где CP
- коммит, где copy.txt
было введено в другой ветке.Это отменяет все изменения в copy.txt
поверх фиксации CP
.Теперь ваша ветвь local
точно такая же, как если бы вы всегда изменяли copy.txt
, а не original.txt
, и вы можете продолжать слияние с другими.
/--A''---B''-- (local)
/
-----X-------CP----- (master)
Важно, чтобы изменения были применены к CP
или иначе copy.txt
не будет существовать, и изменения будут применены обратно к original.txt
.
Надеюсь, это понятно.Этот ответ приходит поздно, но это может быть полезно для кого-то еще.