LINUX.ORG.RU

Как сделать общую фичу для двух веток git-а, разделившихся год назад?

 ,


1

3

Здравствуйте!

Требуется помощь. Примерно год назад проект разделился на две git-ветки, в каждой из которых происходили свои множественные изменения. Но некоторые части проекта остались без изменений. И сейчас требуется написать новую фичу, затрагивающую больше 10 файлов (почему и не хочется вручную переносить), одинаковую для обоих веток. Как эту фичу написать так, чтобы в обе ветки её можно было влить, при этом никак не смешав сами эти ветки? (можно назвать их разными проектами, поэтому смешивание категорически запрещено).

Пробовал в одной из этих веток создать новую, где реализовал фичу, и сделать одну из команд: git merge / git rebase / git cherry-pick, но каждая из них в итоге приводила к тому, что в одной из веток у меня оказывались изменения не только из ветки с новой фичей, но и более старые изменения с ветки, в которой я эту фичу сделал, т.е. проекты (ветки) смешались.

Неужели нет способа просто взять изменения конкретного коммита и перенести в 2 другие ветки? (насколько я понимаю, этим должен заниматься черри-пик, но почему-то я всё равно в конечной ветке вижу старые изменения).

Подскажите, пожалуйста

Сделай патч с этой своей новой ветки, да накати его на другой проект. Про path/diff знаешь же? Разрулишь руками конфликты, если где будут.

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

path/diff? патч?

Можно пожалуйста поподробнее про патчи и path/diff? Мои знания по гиту ограничиваются созданием новых веток и их слиянием (обычно с помощью merge).

Ratiborro
() автор топика
Ответ на: path/diff? патч? от Ratiborro

Делаешь

$ git diff <hash коммита с которого начинаются изменения, 307547b212ed3856812ac5feea4aa299b2d040c2 например>
Он тебе выплёвывает патч, например:
diff --git a/test b/test
index a020e36..a2c0c22 100644
--- a/test
+++ b/test
@@ -1,5 +1,7 @@
 ttt
 1
 2
+5
+4
 3
+6
Ты перенаправляешь выхлоп в файл, потом несешь этот патч по второй проект, там применяешь патч (man patch), разруливаешь конфликты и т.п. Потренируйся на кошках каких-нибудь тестовых проектах сначала (из 3-х файлов), не спеши сразу всё сделать. Когда приделаешь патч все изменения занеси в гит как обычно это делается, когда кто-то накодил. Я пробовал такие штуки как-то проворачивать, но я обновлял ушедший вперёд проект целиком и гитом всё решалось.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 5)

изменения конкретного коммита

git не оперирует изменениями (всё дифы виртульны и генерятся на лету), он оперирует состояниями (цепочка блобов) файлов. Поэтому и прилетают другие «изменения».

diff/patch будет пожалуй самый дубовый и простой подход в данной ситуации.

beastie ★★★★★
()

Про diff/patch согласен с народом, но подумай еще о том, как потом эту фичу в обоих гитах обновлять будешь? Так же патчи таскать?

Мне кажется вы где-то не так с архитектурой замутили. Возможно эту фичу можно было бы вынести куда-нибудь в отдельный модуль и ставить/обновлять его каким-нибудь пакетным менеджером типа npm, composer и т.д.

У нас тоже похожая ситуация, есть engine и есть несколько отдельных проектов на нем. Мы engine выделили в отдельный проект и юзаем как библиотеку, а не плодили ветки от него.

BaBL ★★★★★
()

Ситуация, когда подмножество изменений нужно перекатить из одной ветки в другую, подробно разобрана в блоге Реймонда Чена.

Вкратце, нужно создать новую ветку относительно определённого коммита (common merge base), внести в неё соответствующие изменения и замерджить её в обе ветки.

anonymous
()

Если не секрет, то с какой целью создавались две изолированные ветки, которые на протяжении года не сливали изменения в одну общую? Если я правильно понял, то там при этом одновременно вносились изменения в одинаковые куски кода?

grem ★★★★★
()
Ответ на: комментарий от beastie

git не оперирует изменениями (всё дифы виртульны и генерятся на лету), он оперирует состояниями (цепочка блобов) файлов. Поэтому и прилетают другие «изменения».

diff/patch будет пожалуй самый дубовый и простой подход в данной ситуации.

Так ведь git cherry-pick именно это и делает - переносит один изолированный патч с одной ветки на другую. Или я что-то неправильно понимаю?

Deleted
()
Ответ на: комментарий от anonymous

Ситуация, когда подмножество изменений нужно перекатить из одной ветки в другую, подробно разобрана в блоге Реймонда Чена.

А ещё там есть ответ от другой команды, которой не нужно мержить долгоживущие ветки друг в друга (как раз, как ТС'у).

i-rinat ★★★★★
()
Ответ на: комментарий от Deleted

Нет, он переносит коммит, а коммит – это не патч.

beastie ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.