В старые времена (2006, до 1.5.3 и его руководство пользователя ), git rebase
было представлено так :
Особый случай вишневого сбора - это если вы хотите переместить целую ветку
в более новый «базовый» коммит.
Это сделано git-rebase
.
Вы указываете ветку для перемещения (по умолчанию HEAD
) и куда ее перемещать (по умолчанию нет),
и:
git cherry-picks
каждый патч из этой ветки,
- применяет его к цели,
- и перемещает указатель
refs/heads/<branch>
на вновь созданные коммиты.
Таким образом, по определению, будут сделаны коммиты (и не нужно делать коммитов)
Особый случай перебазирования - это когда вы хотите разделить свою работу, переместить (и заново создать новые) коммиты.
Из того же руководства (в качестве иллюстрации того, что нет необходимости в дальнейшей фиксации после ребазинга):
Предположим, вы смешали разработку двух функций в текущем HEAD, ветке под названием "dev".
x-x-x-x (master)
\
-f1a-f1b-f1c-f2a-f2b-f2c (dev, HEAD)
Вы хотите разделить их на "dev1" и "dev2". Предполагая, что HEAD
является ответвлением от мастера, вы можете просмотреть
git log master..HEAD
или просто получить необработанный список коммитов с помощью
git rev-list master..HEAD
В любом случае, предположим, что вы выясняете список коммитов, которые вы хотите в dev1
и создаете эту ветку:
git checkout -b dev1 master
for i in `cat commit_list`; do
git-cherry-pick $i
done
-f1a'-f1b'-f1c' (dev1, HEAD)
/
x-x-x-x (master)
\
-f1a-f1b-f1c-f2a-f2b-f2c (dev)
Вы можете использовать другую половину отредактированного вами списка, чтобы сгенерировать ветку dev2
, но если вы не уверены, что что-то забыли или просто не хотите выполнять эту ручную работу, вы можете использовать git-rebase сделает это за вас.
git checkout -b dev2 dev # Create dev2 branch
git-rebase --onto master dev1 # Subreact dev1 and rebase
Это найдет все патчи, которые находятся в dev
, а не в dev1
, примените их поверх мастера и назовите результат dev2
.
-f1a'-f1b'-f1c' (dev1, HEAD)
/
x-x-x-x (master)
\
-f2a-f2b-f2c (dev2, HEAD)