Как переименовать измененные файлы при объединении веток и сохранить старые версии? - PullRequest
0 голосов
/ 23 мая 2019

Допустим, у меня есть следующий файл в главной ветке

$ git checkout master
$ cat truth.txt
The Earth is flat

И его обновленная версия на какой-то ветке (перебазирована на master)

$ git checkout magellan-dev
$ cat truth.txt
The Earth is a globe

Теперь я хотел бы объединить ветку magellan-dev в master, но оставить все файлы измененными как новые файлы с разными именами. Это может выглядеть как

$ git checkout master
$ git merge megellan-dev --some-magic-flag
$ ls
truth.txt truth.txt.magellan-dev

Решение, которое я нашел для одного файла, состояло в том, чтобы вручную переименовать этот файл и оформить предыдущий

$ git checkout master
$ git merge magellan-dev
$ mv truth.txt truth.txt.magellan-dev
$ git checkout HEAD^ truth.txt
$ git add truth.txt truth.txt.magellan-dev 

Но это плохо обобщает для большего количества файлов. Как мне этого добиться?

1 Ответ

1 голос
/ 23 мая 2019

Нет ничего встроенного в Git, чтобы сделать это.

Вы можете обработать некоторые случаи, используя git read-tree для объединения в индекс, без разрешения каких-либо конфликтующих изменений.Но обратите внимание, что даже git read-tree 3-way merge в некоторых случаях просто выберет одну из двух версий конечной точки какого-либо файла: если базовая версия слияния (дерево # 1 вставлено в слот # 1)в индексе) какого-либо файла F соответствует одному из двух других (промежуточные слоты 2 или 3), а не соответствует версии F в другие из двух промежуточных слотов, git read-tree свернет три версии до одного слота нулевой стадии, взяв измененный файл.

Другими словами, учитывая ваш пример с двумяразличное содержимое для truth.txt, нам сначала нужно знать: что говорит базовая версия слияния? Если базовая версия слияния truth.txt точно совпадает с одной из двух версий tip-tip, то все Операции слияния Git просто автоматически примут другую версию.Только когда все три будут различаться, Git оставит все три в индексе, чтобы вы могли достичь желаемого результата с помощью некоторых встроенных помощников Git.

Если это не соответствует вашим желаниям, выЗастрял в создании собственных программ для работы с различными деревьями.Обратите внимание, что вы можете создать свой собственный временный индекс и использовать git read-tree для его заполнения, а затем использовать git ls-files --stage для любого количества временных файлов индекса, которые вы использовали, плюс, конечно, реальный файл индекса для сравнения сущностей.Это дает вам быстрый способ определить, является ли truth.txt одинаковым или разным в любых двух деревьях, считываемых в любые два индексных файла.

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

...