Git - Как обрабатывать изменения в локально переименованных файлах при извлечении из родительского репо - PullRequest
3 голосов
/ 28 мая 2019

Вопрос

У меня проблемы с вытягиванием родительского репозитория в форк и правильным разрешением конфликтов. Похоже, что если файл переименован в 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, чтобы увидеть проблему.

Ручные шаги:

  1. Создание небольшого проекта с файлами с произвольным текстом с именами A.txt, B.txt и C.txt в пути репо /path/to/parent.

  2. Создайте форк этого репо, скопировав его в /path/to/fork и переключившись на этот путь.

  3. В этом новом репо-форке переименуйте файлы следующим образом и подтвердите. Я сделал это с ОС вместо использования git mv, но это не должно иметь значения из-за того, как работает git.

A.txt → X.txt
B.txt → Y.txt
C.txt → Z.txt
  1. Убедитесь, что 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
  1. В родительском репо внесите изменения в содержимое файлов A.txt и B.txt.

  2. В репозитории 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
  1. «вытяните» родительское репо в вилку, запустив 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.

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

примечание: github показывает некоторые дополнительные символы (a crlf может быть?) В конце B.txt, которые исчезают как в «модифицированном B.txt», так и в «переименованном Y.txt». Это может привести к путанице при обнаружении переименований для git.


0 голосов
/ 28 мая 2019

Похоже, что если файл переименован в fork и изменен как родительским, так и ответвленным, git рассматривает его только как удаленный нами.

Обратите внимание, что gitне отслеживает переименования или перемещения файлов.Это означает, что когда файл перемещается в ветку и изменяется в другой ветке, вы получаете конфликты слияния, как вы видели.

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

Вам необходимо вручную внести изменения в перемещенную версию файла.

...