Как мне объединить определенный коммит из одной ветви в другую в Git?

159

У меня BranchAесть 113 коммитов впереди BranchB.

Но я хочу, чтобы последние 10 или около того коммитов были BranchAобъединены в BranchB.

Есть ли способ сделать это?

NullVoxPopuli
источник
6
Возможный дубликат Как слить конкретный коммит в git
chharvey

Ответы:

233

Команда git cherry-pick <commit>позволяет вам взять один коммит (из любой ветки) и, по сути, перебазировать его в вашей рабочей ветке.

Глава 5 книги Pro Git объясняет это лучше, чем я , в комплекте с диаграммами и тому подобным. ( Глава о ребазинге также хороша для чтения.)

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

ewall
источник
1
Вопрос: скажем коммит Aответвляется от masterи вы сделать некоторую работу над этим, создавая дочерние фиксаций Bчерез E. Допустим E, добавлена ​​только 1 строка из D. Если вам git cherry-pick Eнравится master, применяет ли он все изменения из Aсквозной Eв masterветку, или он применяет только изменения от Dк E, а именно добавляет только эту 1 строку master? Если дело касается первого, как мне достичь последнего? (кроме ручного копирования и вставки)
chharvey
7
git cherry-pick -n <commit> Если вы не хотите, чтобы вишня выбиралась автоматически.
Бен Флинн
6

Если BranchA не была отправлена ​​на удаленный компьютер, вы можете изменить порядок коммитов, используя, rebaseа затем просто merge. Предпочтительно использовать mergeболее, rebaseкогда это возможно, потому что это не создает дублирующие коммиты.

git checkout BranchA
git rebase -i HEAD~113
... reorder the commits so the 10 you want are first ...
git checkout BranchB
git merge [the 10th commit]
Сет Рено
источник
2

ИСТОЧНИК: https://git-scm.com/book/en/v2/Distributed-Git-Maintainment-a-Project#Integrating-Contributed-Work

Другой способ переместить введенную работу из одной ветви в другую - выбрать ее. Вишня в Git подобна перебазировке за один коммит. Он берет патч, который был введен в коммите, и пытается повторно применить его к ветке, в которой вы находитесь. Это полезно, если у вас есть несколько коммитов в ветке темы, и вы хотите интегрировать только один из них, или если у вас есть только один коммит в ветке темы, и вы предпочитаете выбрать его, а не запускать rebase. Например, предположим, у вас есть проект, который выглядит так:

введите описание изображения здесь

Если вы хотите добавить коммит e43a6 в вашу основную ветку, вы можете запустить

$ git cherry-pick e43a6
Finished one cherry-pick.
[master]: created a0a41a9: "More friendly message when locking the index fails."
 3 files changed, 17 insertions(+), 3 deletions(-)

Это влечет за собой то же изменение, которое было внесено в e43a6, но вы получаете новое значение SHA-1 для коммита, потому что примененная дата отличается. Теперь ваша история выглядит так:

введите описание изображения здесь

Теперь вы можете удалить ветку своей темы и удалить коммиты, которые вы не хотели использовать.

artamonovdev
источник