Git частичное слияние, а не целая ветка
Я читал о некоторых трюках слиянием в Git: слияние государственных и частных ветвей, сохраняя при этом определенные файлы целыми в обоих ветвях и другие, и не нашел решение.
В моем случае мне нужно делать противоположную стратегию слияния. При параллельном развитии я должен хранить некоторые файлы одинаковыми по произвольным ветвям. С другой стороны, я не хочу делать сквош или слияние без фиксации, в то время как разница значительна и может нарушить текущее состояние тестовой ветки.
Что мне нужно, например,
git checkout testing
git merge config.xml -b development
или git merge config\*.xml -b development
Я думаю, это похоже на команду git merge-files ...
, но второй файл доставлен из ветки, а не из файловой системы.
Является ли это возможным? или может быть какое-то обходное решение? подмодуль? атрибуты?
Спасибо
Ответы
Ответ 1
Есть несколько вещей, которые вы можете сделать.
Во-первых, вы можете вишневым выбрать нужные вам изменения, которые применяют только один фиксатор. Например, если есть изменения, которые касаются только config.xml
, вы можете выбрать его с помощью
$ git cherry-pick $COMMIT_ID_YOU_WANT
Вы также можете просто захватить config.xml
из ветки разработки:
$ git checkout testing
$ git checkout development -- config.xml
Это даст вам ту же версию config.xml
, которая существует в ветке разработки, но заметьте, что она не будет втягивать историю изменений в файл.
Ответ 2
В принципе, вы можете прочитать все здесь: http://www.gelato.unsw.edu.au/archives/git/0701/37964.html
Короче говоря, если вы просто хотите применить изменения, сделанные определенным диапазоном коммитов (это может быть только одно коммит), сделанные только подмножеством файлов, выполните:
git diff commit1..commit2 filepattern | git apply --index && git commit
Ответ 3
Можно объединить файл, непосредственно выбранный из git -tree.
Я предлагаю сделать что-то вроде:
$ git ls-tree development -- config.xml
$ git show <blob-hash> > config.xml.development
Затем получим общую базу:
$ git ls-tree $(git merge-base HEAD development) -- config.xml
$ git show <blob-hash> > config.xml.base
И наконец:
$ git merge-file config.xml config.xml.base config.xml.development
Я не тестировал это.
С оболочкой, подобной zsh, вы можете избежать сохранения blob во временный файл с помощью этого:
$ git merge-file config.xml =(git show <base-blob-hash>) =(git show <dev-blob-hash>)