Git создать ветку из диапазона предыдущих коммитов?

У меня есть куча коммитов для проекта ОС, и я хочу вытащить только последнее слово. 20 коммиттов в другую ветку, чтобы я мог вытащить запрос.

Как я могу это сделать? Причина в том, что у меня есть, возможно, 150 коммитов, но большинство из них для гораздо большего вклада, который еще не готов. Но вскоре будет выпущена следующая версия.

Спасибо!

Ответ 1

Вы можете сделать это с помощью cherry-pick. Если ваша история long_branch выглядит так:

A-B  <-- master
   \
    C-D-E-F-G-H  <-- long_branch

и вы хотите переместить содержимое, скажем, F через H, в другую ветвь, скажем, short_branch, которая основана на master:

git checkout master -b short_branch

который дает

A-B  <-- master, short_branch
   \
    C-D-E-F-G-H  <-- long_branch

then... (обратите внимание, что диапазон фиксации E..H, левая сторона не включена для диапазона)

git cherry-pick E..H

который дает:

    F'-G'-H'  <-- short_branch
   /
A-B  <-- master
   \
    C-D-E-F-G-H  <-- long_branch

Обратите внимание, что я имею в виду новые коммиты как F', G', H' - это потому, что, пока они будут содержать те же эффективные изменения, что и F, G и H, они не будут действительными одними и теми же фиксациями (из-за разных родителей + время фиксации).

Ответ 2

Вы хотите, чтобы 20 коммитов остались в текущей ветке? Если нет, то сохраните ссылку на текущую ветвь назад 20, запишитесь:

git checkout -b current_branch_save current_branch~20

Затем переместите последние 20 коммитов с rebase

git checkout current_branch
git rebase --onto another_branch current_branch~20 current_branch

Теперь у вас есть current_branch_save с вашими ~ 100 'не совсем готовыми' коммитами и current_branch на another_branch с последними 20.