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