2015-02-18 3 views
1

У меня есть две ветки Разработка и master. Скажите мастер за разработать ~ 20 коммит. Я хочу объединить только один из коммитов (07f5722) от разработать в мастер. Как я могу это сделать?Git cherry pick commit from branch A to B

How to merge a specific commit in git и How do I merge a specific commit from one branch into another in Git? обе говорят, что используют git cherry-pick без объяснений относительно того, как вы должны его использовать. Я действительно не следовал примерам с man-страницы.

Я попытался сделать следующее:

git checkout -b merge-07f5722 develop 
git cherry-pick 07f5722 

Но получил это сообщение о вишневом драфте быть пустым:

On branch merge-07f5722 
You are currently cherry-picking commit 07f5722. 

nothing to commit, working directory clean 
The previous cherry-pick is now empty, possibly due to conflict resolution. 
If you wish to commit it anyway, use: 

    git commit --allow-empty 

If you wish to skip this commit, use: 

    git reset 

Then "git cherry-pick --continue" will resume cherry-picking 
the remaining commits. 

Ответ на git cherry-pick not working указует, что это означает, что вишневый выбор является no-op без фактических изменений. Хорошо, так как я могу получить изменения?

ПРИМЕЧАНИЕ. Мой вопрос почти идентичен git cherry-pick not working. Тем не менее, я хочу знать, как выполнить то, что я намереваюсь сделать, а не почему команда, которую я попробовал, не удалась.


Последовательность команд мне пришлось использовать было:

git checkout -b merge-07f5722 master 
git cherry-pick 07f5722 # commit from develop 
git checkout master 
git merge merge-07f5722 

ответ

4

Я думаю, что ваша ошибка в том, что вы создали merge-07f5722 ответвление от develop. Затем, когда вы пытались сделать вишневый выбор, ваши изменения уже были на этой ветке, потому что у вас уже была фиксация. Таким образом, это приведет к пустой фиксации. Создайте свою ветку слияния master, а не develop, что приведет к успешному набору вишни для вас.

0

Другое решение (при условии, что все ваши коммиты относительно атомарны), чтобы просто переустановить develop и переместить рассматриваемые коммиты в нижнюю часть стека. Затем объедините только те, которые вам нужны. Это приведет к слиянию быстрых слияний.

Хотя использование мастера и разработка в вашем примере подразумевают, что это публично опубликованные ветви, и если вы не готовы рассказать всем, кто когда-либо клонировал их, то ваш ответ на вопрос о выборе вишни от @schleis правильный.

Для полноты я просто добавить это для тех, кто хотел бы перебазироваться над вишневым выбор:

$ git checkout develop 
$ git rebase -i master 

Редактор всплывет со списком фиксаций (20 или около того в вашем примере) переместить линия для фиксации (s) в вопросе верхней части файла и сохранения/выход)

$ git checkout master 
$ git merge 07f5722 # The last commit you wanted 

Это будет выглядеть так:

A--B (master) 
    \ 
    C--D--E (develop) 

After git rebase -i master and moving D to the beginning: 

A--B (master) 
    \ 
    D'--C'--E' (develop) 

After git merge D from master: 

A--B--D' (master) 
     \ 
     C'--E' (develop) 
Смежные вопросы