Git принять их / наши и успешно слили код - PullRequest
1 голос
/ 08 марта 2019

Предположим, что существует конфликт при перебазировании ветки feature Git на ветку master Git:

git init
echo -e "one\ntwo\nthree\nfour\nfive" > foo
git add foo
git commit -m a

echo -e "ONE\ntwo\nTHREE\nfour\nfive" > foo
git commit -a -m b

git checkout -b feature HEAD^
echo -e "One\ntwo\nthree\nfour\nFive" > foo
git commit -a -m c

git rebase master

Конфликтующий файл foo:

<<<<<<< HEAD
ONE
=======
One
>>>>>>> c
two
THREE
four
Five

Как получить из командной строки файл foo_master, содержащий успешное слияние (THREE и Five), и в случае конфликта, master код (ONE):

ONE
two
THREE
four
Five

Обратите внимание, что он отличается от git checkout --ours foo, который не содержит модификаты из feature успешно применены (Five):

ONE
two
THREE
four
five

Мне также хотелось бы, чтобы файл foo_feature, содержащий feature код в случае конфликта, но с модификациями из master успешно примененные (ONE):

One
two
THREE
four
Five

Моя цель - вертикальные vimdiff файлы foo_master и foo_feature для разрешения конфликта.

1 Ответ

1 голос
/ 08 марта 2019

Используйте git merge-file, дважды, с --ours в одном случае и --theirs в другом. (Обратите внимание, что это не то же самое, что -s ours, но больше похоже на -X ours, но они применяются только к одному набору из трех входных файлов.)

Вам понадобятся все три входных файла, но они доступны во время конфликтующего слияния, так как все три находятся в индексе, на этапе 1 (базовый), 2 (наш) и 3 (их). Используйте git checkout-index --stage=all, чтобы извлечь все три сразу. Обратите внимание, что это подразумевает --temp, так что вы получите три напечатанных имени файла, содержащие три копии трех входных файлов, скопированных из индекса, в пригодный для использования формат.

(Вот так git mergetool получает три копии файлов для передачи во внешний инструмент слияния, такой как vimdiff.)

...