Есть ли способ заставить работать git rerere, когда нужно удалить конфликтующий файл?

Вот сделка. Мастер имеет файл, файл1. Я разветвляюсь и удаляю этот файл в ветке. Тем временем я изменяю file1 на master. Бум, конфликт.

Когда я объединяю свою ветку с мастером, разрешение - удалить файл. Я пытаюсь использовать git rerere чтобы иметь возможность делать одно и то же разрешение несколько раз, но, как вы можете видеть ниже, оно не записывает разрешение в случае, когда вы удаляете файл.

Я не могу найти какие-либо документы по этому вопросу, это просто ограничение rerere?

 |system| brad-macbook-air in ~/tmp
± bb+ih |master ✓| → touch file1.txt

 |system| brad-macbook-air in ~/tmp
± bb+ih |master ✗| → git add . && git commit -m 'File1'
[master (root-commit) 95a807e] File1
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 file1.txt

 |system| brad-macbook-air in ~/tmp
± bb+ih |master ✓| → git checkout -b delete_file_1
Switched to a new branch 'delete_file_1'

 |system| brad-macbook-air in ~/tmp
± bb+ih |delete_file_1 ✓| → git rm file1.txt
rm 'file1.txt'

 |system| brad-macbook-air in ~/tmp
± bb+ih |delete_file_1 ✗| → git commit -m 'rm file1'
[delete_file_1 83d1a57] rm file1
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 file1.txt

 |system| brad-macbook-air in ~/tmp
± bb+ih |delete_file_1 ✓| → git checkout master
Switched to branch 'master'

 |system| brad-macbook-air in ~/tmp
± bb+ih |master ✓| → echo 'hello' > file1.txt

 |system| brad-macbook-air in ~/tmp
± bb+ih |master ✗| → git commit -am 'update file1'
[master 16f6541] update file1
 1 file changed, 1 insertion(+)

 |system| brad-macbook-air in ~/tmp
± bb+ih |master ✓| → git merge delete_file_1 
CONFLICT (modify/delete): file1.txt deleted in delete_file_1 and modified in HEAD. Version HEAD of file1.txt left in tree.
Automatic merge failed; fix conflicts and then commit the result.

 |system| brad-macbook-air in ~/tmp
± bb+ih |master ✗| → git rm file1.txt
file1.txt: needs merge
rm 'file1.txt'

 |system| brad-macbook-air in ~/tmp
± bb+ih |master ✗| → git commit --no-edit
[master 4791204] Merge branch 'delete_file_1'

Здесь мы должны увидеть что-то вроде "записанное разрешение для file1.txt", но мы этого не видим. Просто чтобы убедиться, что это не записывает наше разрешение, мы продолжаем и снова делаем то же самое слияние:

 |system| brad-macbook-air in ~/tmp
± bb+ih |master ✓| → git reset head^
Unstaged changes after reset:
D   file1.txt

 |system| brad-macbook-air in ~/tmp
± bb+ih |master ✗| → git co .

 |system| brad-macbook-air in ~/tmp
± bb+ih |master ✓| → git merge delete_file_1 
CONFLICT (modify/delete): file1.txt deleted in delete_file_1 and modified in HEAD. Version HEAD of file1.txt left in tree.
Automatic merge failed; fix conflicts and then commit the result.

И здесь вы можете увидеть, что git rerere не помнит разрешение конфликта (и фактически неправильно оставляет файл в дереве).

2 ответа

Решение

В нынешнем виде No. rerere пытается записать предыдущие разрешения на основе фрагментов в каждом конфликтующем файле. В случае удаления, rerere видит его только как не требующий решения.

У меня тоже были проблемы, когда ветвь функций включает в себя новый файл, который не существует в основной ветке, но для того, чтобы ветка функций объединилась с главной и работала правильно, требуется небольшая модификация этого нового файла. Git Rerere не понимает, что это является частью всего процесса слияния и, следовательно, никогда не записывает необходимые изменения.

Другие вопросы по тегам