У меня BranchA
есть 113 коммитов впереди BranchB
.
Но я хочу, чтобы последние 10 или около того коммитов были BranchA
объединены в BranchB
.
Есть ли способ сделать это?
У меня BranchA
есть 113 коммитов впереди BranchB
.
Но я хочу, чтобы последние 10 или около того коммитов были BranchA
объединены в BranchB
.
Есть ли способ сделать это?
Ответы:
Команда git cherry-pick <commit>
позволяет вам взять один коммит (из любой ветки) и, по сути, перебазировать его в вашей рабочей ветке.
Глава 5 книги Pro Git объясняет это лучше, чем я , в комплекте с диаграммами и тому подобным. ( Глава о ребазинге также хороша для чтения.)
И наконец, есть несколько хороших комментариев по поводу выбора вишни против слияния против перебазирования в другом вопросе SO .
A
ответвляется от master
и вы сделать некоторую работу над этим, создавая дочерние фиксаций B
через E
. Допустим E
, добавлена только 1 строка из D
. Если вам git cherry-pick E
нравится master
, применяет ли он все изменения из A
сквозной E
в master
ветку, или он применяет только изменения от D
к E
, а именно добавляет только эту 1 строку master
? Если дело касается первого, как мне достичь последнего? (кроме ручного копирования и вставки)
Если 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]
ИСТОЧНИК: 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 для коммита, потому что примененная дата отличается. Теперь ваша история выглядит так:
Теперь вы можете удалить ветку своей темы и удалить коммиты, которые вы не хотели использовать.