Как перенести последние коммиты Git, находящиеся в данный момент на ветке, на другую ветку?

У меня есть репозиторий, в котором я работал над веткой master, когда в последний раз добавлял около 10 коммитов, которые, как я теперь хотел, были в другой ветке, поскольку они описывают работу, которую я сейчас считаю экспериментальной (я все еще изучаю хорошие практики Git).

В свете этого соображения я хотел бы, чтобы последние 10 коммитов, так сказать, формировали свою собственную ветвь, чтобы я мог очистить master и зарезервировать только для коммитов "release"/"stable".

Чтобы проиллюстрировать, что у меня есть:

        b--b (feature B)
       /       
X--X--X--Z--Z--Z--Z--Z--Z (master)
    \
     a--a--a (feature A)

Вы можете видеть, что все коммиты, отмеченные X и Z, находятся на ветке master, тогда как я хочу, чтобы коммиты, отмеченные Z (теперь рассматриваемая экспериментальная работа "Feature Z"), лежали на их собственной ветки и master заканчивая самым правым X. Для иллюстрации необходим график:

        b--b (feature B)
       /       
X--X--X (master)
    \  \
     \  Z--Z--Z--Z--Z--Z (feature Z - the new branch I want)
      \
       a--a--a (feature A)

Таким образом, мой master будет зарезервирован для выпусков и других стабильных коммитов, с возможностью объединения функций A, B и Z по мере необходимости.

Так как мне переместить коммиты "Z" на их собственную ветку?

Ответ 1

git checkout master
git branch feature-Z
git reset <commit_id>

где commit_id - это идентификатор последнего коммита X до того, как b отключается.

Ответ 2

Для полноты ответа здесь - http://git-scm.com/docs/git-reset - поиск текста "Отменить фиксацию, сделав ее ветвью темы" - в примере показано, что последние 3 фиксируют ветвь и восстанавливают мастер до фиксации, предшествующей этим 3 коммитам:

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 3 commits.
#
nothing to commit (working directory clean)
$ git branch topic/wip
$ git reset --hard HEAD~3
$ git checkout topic/wip
Switched to branch topic/wip

Ответ 3

Просто переименуйте мастер и запустите новый мастер на последнем X:

git checkout master; git branch -m feature; git checkout -b master HEAD~6

Ответ 4

Создать и оформить заказ в нужной новой ветке
Принудительная ветвь мастера N фиксирует назад (в вашем случае 10)

git checkout -b feature-z
git branch -f master HEAD~10