Git частичное слияние, а не целая ветвь - PullRequest
55 голосов
/ 30 ноября 2010

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

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

Что я хочу что-то вроде

git checkout testing

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

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

Спасибо

Ответы [ 4 ]

49 голосов
/ 30 ноября 2010

Есть пара вещей, которые вы можете сделать.

Один, вы можете cherry-pick изменения, которые вы хотите, который применяется только один коммит. Например, если есть изменение, которое касается только config.xml, вы можете выбрать его с помощью

$ git cherry-pick $COMMIT_ID_YOU_WANT

Вы также можете просто взять config.xml из ветки разработки:

$ git checkout testing
$ git checkout development -- config.xml

Это даст вам ту же версию config.xml, которая существует в ветви разработки, но учтите, что она не будет тянуть историю изменений файла.

19 голосов
/ 24 января 2011

В основном вы можете прочитать здесь: http://www.gelato.unsw.edu.au/archives/git/0701/37964.html

Короче говоря, если вы просто хотите применить изменения, сделанные определенным диапазоном коммитов (это также может быть только один коммит), сделанныйтолько для подмножества файлов:

git diff commit1..commit2 filepattern | git apply --index && git commit
6 голосов
/ 29 мая 2018

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

https://gitlab.com/bimlas/learning-by-testing-git-partial-merge/tree/doc

TL; DR:

Слияние должно быть тем, чем оно является: объединением ветвей.Если вы делаете коммит слияния без слияния всех файлов, и вы попробуете слить те же ветки позже, чем Git думает, что вы слили все в первом коммите слияния, таким образом, более ранние коммиты не имеют значения, они пропустят незакрытые изменениядо первого слияния.

Используйте checkout для копирования файлов из одной ветви в другую:

git checkout BRANCH -- FILE
git commit -m "Partial merge"
4 голосов
/ 23 января 2012

Возможно объединение с файлом, непосредственно выбранным из git-дерева.
Я предлагаю сделать что-то вроде:
$ git ls-tree development -- config.xml<br> $ git show <blob-hash> > config.xml.development

Тогда получите общую базу:

$ git ls-tree $(git merge-base HEAD development) -- config.xml<br> $ git show <blob-hash> > config.xml.base

И наконец:

$ git merge-file config.xml config.xml.base config.xml.development

Хотя я этого не проверял.

Используя такую ​​оболочку, как zsh, вы можете избежать сохранения большого двоичного объекта во временный файл с помощью:

$ git merge-file config.xml =(git show <base-blob-hash>) =(git show <dev-blob-hash>)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...