Подтвердить что ты не робот

Git частичное слияние, а не целая ветка

Я читал о некоторых трюках слиянием в Git: слияние государственных и частных ветвей, сохраняя при этом определенные файлы целыми в обоих ветвях и другие, и не нашел решение.

В моем случае мне нужно делать противоположную стратегию слияния. При параллельном развитии я должен хранить некоторые файлы одинаковыми по произвольным ветвям. С другой стороны, я не хочу делать сквош или слияние без фиксации, в то время как разница значительна и может нарушить текущее состояние тестовой ветки.

Что мне нужно, например,

git checkout testing

git merge config.xml -b development или git merge config\*.xml -b development

Я думаю, это похоже на команду git merge-files ..., но второй файл доставлен из ветки, а не из файловой системы. Является ли это возможным? или может быть какое-то обходное решение? подмодуль? атрибуты?

Спасибо

4b9b3361

Ответ 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>)