GIT слияние несвязанных историй - PullRequest
1 голос
/ 04 февраля 2020

Я объединяю две не связанные истории. Трехстороннее слияние не работает, так как нет «базового» коммита (или файлов) для сравнения. Таким образом, каждый файл конфликтует (поскольку он хочет объединить целые файлы из обоих). Есть ли в любом случае создать «фиктивного» предка, чтобы иметь этот базовый коммит для фактического слияния (только строки, которые отличаются для слияния или конфликта

У меня есть два репозитория. К сожалению, одно было просто скопировано из другого и разработчик работал над этим довольно долго. Они очень похожи. Теперь я хочу объединить их. Потому что у них нет (с точки зрения git) общей истории. Когда я объединяю их, нет базовый файл для объединения, поэтому все файлы конфликтуют, git хочет объединить оба файла (все строки). Я не могу объяснить это лучше.

Ответы [ 2 ]

2 голосов
/ 04 февраля 2020

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

Не легко .

Вы можете использовать git replace --graft для вставки фиктивного предка на время объединения. Но вы должны придумать content для этого фиктивного коммита вручную Если вам не нужно выполнять это слияние несколько раз, вы можете просто запустить git merge --allow-unrelated-histories и вручную исправить результат, поскольку создание базового файла для каждого конфликта добавления / добавления является такой же работой, как и разрешение каждого добавления / добавления. конфликт.

Допустим, вы написали программу или сценарий для создания базового файла из двух входов конфликта добавления / добавления, используя общие строки. Вы все равно можете продолжить работу так:

git merge --allow-unrelated-histories <commit-specifier>

for file in $(cat list-of-add-add-conflict-files); do
    git show :2:$file > file.ours
    git show :3:$file > file.theirs
    program_or_script file.ours file.theirs > file.base
    git merge-file file.ours file.base file.theirs
    mv file.ours $file; rm file.theirs file.base # this rm can be deferred
done

Для объединения трех отдельных файлов используется команда git merge-file. В этом случае используются три файла:

  • file.ours: копия из слота 2 индекс, т. е. от HEAD;
  • file.theirs: копия из слота 3 индекса, т. Е. Из их коммита tip;
  • file.base: файл, созданный вашей программой или сценарием

Команда git merge-file - это тот же низкоуровневый драйвер слияния, который Git использует по умолчанию, извлеченный в отдельную программу, которую вы можете запустить. Таким образом, это дает тот же результат, что и вы, если бы вы запустили эту программу для каждой пары файлов и создали фиктивного предка, зафиксировали его и использовали git replace --graft для его вставки. Но вам не нужно было запускать git commit, чтобы сделать фиктивный коммит, а затем перенести его, поэтому вы сохранили несколько шагов.

0 голосов
/ 04 февраля 2020

Попробуйте эту команду, она может помочь

git pull --allow-unrelated-histories
...