Выбор вишни с изменениями в несуществующем файле

У меня есть два репозитория с похожими архитектурами:

repo1:
 - file1
 - file2 *(this file is non-existent in repo2)
 - folder
    - file3
    - file4
    - file5

и

repo2:
 - file1
 - folder
    - file3
    - file4
    - file5

Repo1 удален для repo2:

git remote add repo1 http://repo1.git

Мне нужно выбирать коммиты из репо1 в репо2

git cherry-pick <commit_repo1>

Обычно все ок. Но я столкнулся с проблемой, если я хочу выбрать изменения в несуществующем файле.

Изменения выглядят так:

 folder/file4    | 9 ---------
 folder/file5    | 5 -----
 file1           | 5 -----
 file2           | 5 -----
 4 files changed, 24 deletions(-)

В конце: слияние Cherry-pick изменяет несуществующий файл на файл3. Только для удаления изменений

Кто-нибудь знает, как избежать слияния изменений в неправильный файл, если нужный файл не существует?

Попытки:

git cherry-pick --strategy-option theirs <commit_repo1>
git cherry-pick --strategy-option ours <commit_repo1>

Дайте те же результаты:

Auto-merging folder/file3 !!! this file was not changes (instead changed in file2)
Auto-merging folder/file4
Auto-merging file1

person Lola    schedule 11.06.2021    source источник
comment
@Лиам, этот билет не ответ для меня. Я пробовал --strategy-option и другие. но все еще есть проблема с удалением изменений в несуществующих файлах   -  person Lola    schedule 11.06.2021
comment
@liam Этот билет вообще не описывает мою проблему   -  person Lola    schedule 11.06.2021
comment
Поместите то, что вы пробовали (фактические команды и их результаты), в свой вопрос.   -  person torek    schedule 11.06.2021
comment
Думаю, имеет смысл спросить: какова история file2 в соответствующих ветках? Его переименовали в file3 в той ветке, что в repo2? Потому что я не могу придумать прямого ответа, почему git путает file3 (который, кажется, присутствует в обеих ветках) с file2, который присутствует только в ветке repo1.   -  person eftshift0    schedule 11.06.2021
comment
Чего я ожидал бы от git в этом случае, так это получить конфликт дерева из-за отсутствующего файла в ветке repo2.   -  person eftshift0    schedule 11.06.2021
comment
@eftshift0 File2 был в repo2 год назад   -  person Lola    schedule 11.06.2021
comment
Я хотел бы, чтобы git ничего не сделал в этом случае. Когда добавляются новые изменения, git создает файл. Если изменения удалятся, то логично было бы ничего не делать   -  person Lola    schedule 11.06.2021


Ответы (2)


Auto-merging folder/file3

Это похоже на случай чрезмерного обнаружения переименования: Git считает, что file3 соответствует отсутствующему файлу, поэтому он импортирует изменение туда.

Вы можете отключить обнаружение переименования:

-X no-renames

(т. е. git cherry-pick -X no-renames hash, а не -X ours или -X theirs), чтобы избежать этой проблемы. В качестве альтернативы используйте git cherry-pick -n, чтобы Git не фиксировал результат, а затем исправьте отредактированный файл, проверив версию HEAD:

git cherry-pick -n <hash>

проверить результаты, внести любые необходимые изменения, включая:

git checkout HEAD -- folder/file3

и в итоге:

git commit

чтобы сделать новый коммит.

person torek    schedule 11.06.2021
comment
Я не знал о --no-renames. @tokek, как обычно, знает все хорошее. - person eftshift0; 11.06.2021
comment
@eftshift0: -X или --strategy-option, а затем no-renames: это один из вариантов стратегии слияния. Если у вас старый Git, вы должны использовать старую ручку управления rename-threshold и опустить ее до нуля. - person torek; 11.06.2021

Почему вы получаете этот результат

Выбирая фиксацию, вы должны смотреть на изменения, внесенные фиксацией.

Из того, что вы описываете, похоже, что file2 присутствовал в родительском коммите, и каким-то образом git вычислил, что file2 был переименован в folder/file3.

И таким образом: выбор вишни, которая покорно пытается применить это изменение.


Как это исправить

Вы можете указать git полностью игнорировать переименования (как ответил @torek):

git cherry-pick -X no-renames

Вероятно, у вас будет конфликт на folder/file3 (теперь git, так как вы импортируете коммит, который создал folder/file3, но он уже существует в вашей целевой ветке), который вы можете исправить.

Или вы можете вручную исправить проблему после выбора вишни:

# it looks like you want to revert `file3` to its previous state :
git checkout HEAD^ -- folder/file3
git commit --amend
person LeGEC    schedule 11.06.2021