Git: объединить часть исходного дерева одной ветви в другую, независимо от отдельных коммитов - PullRequest
1 голос
/ 14 ноября 2009

Я понимаю, как объединять ветви в git, и мне нравится, как легко это сделать.

У меня есть ветка, которая выглядит так:

project/
|--subproj1/
|  |---(files)
|
|--subproj2/
   |---(files)

У коллеги есть филиал, который внес существенные изменения в оба подпроекта. В частности, он изменил их оба, чтобы они зависели от общего кода в новом подпроекте 3. Однако по разным причинам мы не будем настаивать на его ответвлении в обозримом будущем.

Моя ветвь отличается от master только в subproj1, где я делаю специфичные для подпроекта улучшения. Мой подпроект менее важен, чем некоторые другие, и, следовательно, имеет меньше ограничений в отношении того, какие типы изменений мы можем продвигать. Я хотел бы объединить изменения subproj1 моего коллеги (и его новый subproj3, от которого зависят эти изменения), но оставить существующий subproj2 в покое. Когда-нибудь в будущем, когда он полностью объединит свой проект с мастером, я бы хотел, чтобы его изменения в subproj2 сливались нормально.

Как мне это сделать с помощью git?

1 Ответ

2 голосов
/ 14 ноября 2009

Каждый коммит является логической единицей работы. К сожалению, это означает, что вы не можете разделить правки, внесенные коллегой, в subproj1 и subproj2, если он сделал их в одной ветви.

Однако, чтобы сделать то, что вы просите, вы должны использовать git filter-branch . Вы можете использовать это для создания новой ветки, которая определяется путем воспроизведения всех коммитов вашего коллеги, но только для добавления изменений в subproj1 к каждому коммиту.

Команды - это что-то вроде:

git fetch colleague-repo ...
git filter-branch --subdirectory-filter subproj1 -- A..B

(где A..B - диапазон коммитов, которые вы получаете из его хранилища)

Этим вы создаете уникальную ветку с работой, которая полностью отделена от работы вашего коллеги. Если вы объедините эту новую ветку и ветку вашего коллеги с мастером, история изменений в subproj1 будет постоянно разделена между двумя ветками.

...