Почему git объединяет, удаляет файлы, а не перемещает их? - PullRequest
3 голосов
/ 29 сентября 2019

У меня есть старая ветка, которую я хочу обновить.Я слился с master, но было перемещено три файла, и Git говорит, что они были «удалены ими».

Сначала я попытался переместить файлы в новое место в моей ветке, а затем слить, но gitпросто использовал файлы веток и не пытался объединиться с мастером.

Затем я попытался установить:

git config merge.renameLimit 999999

, но получил тот же результат.

Есть личто-нибудь еще, что я могу сделать, чтобы заставить Git признать, что эти файлы были перемещены, а не удалены?Имена файлов совпадают.

1 Ответ

4 голосов
/ 29 сентября 2019

Вы столкнулись с (на самом деле) недостатком метода Git по записи только снимков и родословных: обычно Git может идентифицировать переименованные файлы, потому что они все еще выглядят достаточно похожими, но если вы радикально измените файл, а также переместите его,Там ничего не осталось, чтобы отличить результат от удаленного старого файла и нового другого файла в этом новом месте.

git checkout master^0                         # make a scratch commit to help Git
git mv new/path/to/file1 old/path/to/file1    # move the drastic-rewrite stuff back
git commit -m \
    'put drastically-changed-and-renamed files back where automerge can find them'

git checkout oldstuff                         # merge the helper commit to oldstuff
git merge @{1}                                # ...
git mv old/path/to/file1 new/path/to/file1    # put things in their new location
git commit --amend

Слияние Гита смотрит на кончики и основу.Так как эти файлы с подсказкой master ничем не похожи на то, что они делали на базе слияния с oldstuff, и с тех пор их тоже подняли и переместили, слияние больше не видит их как одни и те же файлы.Поэтому поместите их обратно, чтобы помочь Git в автоматическом объединении, запустите слияние, переместите их обратно в их новый дом.

Чтобы прямо ответить на ваш заглавный вопрос, почему Git делает свои истории только для снимков и предков, это инженеркомпромисс.Есть недостатки, независимо от того, что вы делаете, вы попали в обратную сторону выбора Git.

...