Вопрос
У меня проблемы с вытягиванием родительского репозитория в форк и правильным разрешением конфликтов.
Похоже, что если файл переименован в fork и изменен как родительским, так и ответвленным, git рассматривает его только как deleted by us
.
Это происходит, когда я использую git pull /path/to/parent master
и git merge upstream/master
(с настроенным восходящим потоком) .
Как я могу использовать git так, чтобы мне предлагалось разрешить конфликт с переименованным файлом, вместо того, чтобы git предположил, что файл deleted by us
?
Настройка
Вот установка, чтобы продемонстрировать мою проблему. Это можно сделать локально или в управляемой онлайн-системе (это происходит в DevOps / VSTS Azure).
Я дублировал большинство шагов ниже в GitHub с этими двумя репозиториями:
Вы можете клонировать вилку и сделать git pull https://github.com/Daniel-Khodabakhsh/TestForkPull.git master
, чтобы увидеть проблему.
Ручные шаги:
Создание небольшого проекта с файлами с произвольным текстом с именами A.txt
, B.txt
и C.txt
в пути репо /path/to/parent
.
Создайте форк этого репо, скопировав его в /path/to/fork
и переключившись на этот путь.
В этом новом репо-форке переименуйте файлы следующим образом и подтвердите. Я сделал это с ОС вместо использования git mv
, но это не должно иметь значения из-за того, как работает git.
A.txt → X.txt
B.txt → Y.txt
C.txt → Z.txt
- Убедитесь, что git распознает переименование, запустив
git diff --name-status HEAD~1
и заметив 'R'
, указывающий на обнаруженное переименование.
$ git diff --name-status HEAD~1
R100 A.txt X.txt
R100 B.txt Y.txt
R100 C.txt Z.txt
В родительском репо внесите изменения в содержимое файлов A.txt
и B.txt
.
В репозитории fork внесите изменения в содержимое файлов Y.txt
и Z.txt
.
До этого момента у вас были следующие файлы в обоих репозиториях:
A.txt → X.txt - Modified in parent
B.txt → Y.txt - Modified in both
C.txt → Z.txt - Modified in fork
- «вытяните» родительское репо в вилку, запустив
git pull /path/to/parent master
из пути вилки. Вы получите следующий вывод:
$ git pull /path/to/parent/ master
remote: Enumerating objects: 7, done.
remote: Counting objects: 100% (7/7), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (4/4), done.
From D:/path/to/parent
* branch master -> FETCH_HEAD
CONFLICT (modify/delete): B.txt deleted in HEAD and modified in ba146eba53bd7d51c9977238d9d62b56f7a984f7. Version ba146eba53bd7d51c9977238d9d62b56f7a984f7 of B.txt left in tree.
Automatic merge failed; fix conflicts and then commit the result.
$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Changes to be committed:
modified: X.txt
Unmerged paths:
(use "git add/rm <file>..." as appropriate to mark resolution)
deleted by us: B.txt
Здесь X.txt
корректно показывает только модификацию из родительского репо, Z.txt
корректно не затрагивается изменениями из репо-форка, но Y.txt
(B.txt
) не отображается должным образом, как в конфликте, а, скорее, отображается только как deleted by us
.