Смена родительской ветки Git
Есть две ветки master и master-old. По сути — одна продолжает другую, но ветки совершенно не связаны:
A - B - C - master-old
D - E - F - master
Требуется связать ветки, чтобы из master-old будто бы появилась ветка master (с некоторым ограничением):
A - B - C - master-old
\- E - F - master
Перепробовал, кажется, множество разных вариантов git rebase, но получается лишь одна ветка.
Пожалуйста, подскажите команды git, такие, чтобы изменить историю так, как требуется.
Ответы (2 шт):
Чтобы из такого репозитория
* commit 66d70255e22f826f927a3048d156ce4584aecfcc (HEAD -> master)
| F
|
* commit 901fc2f881924ca1d0f58159ea5d3013b4e2f6a8
| E
|
* commit c6a8666cdb4f7dc1bd0a8f9487bd7d60fc91979a
D
* commit 02a57741d5f984450011f15aa1fe9aadb34a2efd (master-old)
| C
|
* commit fcd06de1c88e37624ac688eb724162624e357cac
| B
|
* commit 53d010f279f4d960dd7b31b9e34520321aaa8c70
A
получить
* commit 72db07166d3ce93887e71e5b09db6548f67a4aed (HEAD -> master)
| F
|
* commit 9627a20c8389113d3459fad8c443c5af08c198da
| E
|
* commit 601073c1e8b474b8fc56afc5832eb37c022d8fb0
| D
|
* commit 02a57741d5f984450011f15aa1fe9aadb34a2efd (master-old)
| C
|
* commit fcd06de1c88e37624ac688eb724162624e357cac
| B
|
* commit 53d010f279f4d960dd7b31b9e34520321aaa8c70
A
достаточно лишь с ветки master выполнить rebase на ветку master-old:
git checkout master
git rebase master-old
Важно! Это полностью изменит историю изменений на ветке master, что может привести к неприятным последствиям.
P.S.
Результат может выглядеть как одна ветка, но на самом деле как только на ветке master-old будут новые изменения структура разветвится:
* commit 8c0c7cb4c995ee86bd0a60324d058ecf9a3f61da (HEAD -> master-old)
| N
|
| * commit 72db07166d3ce93887e71e5b09db6548f67a4aed (master)
| | F
| |
| * commit 9627a20c8389113d3459fad8c443c5af08c198da
| | E
| |
| * commit 601073c1e8b474b8fc56afc5832eb37c022d8fb0
|/ D
|
* commit 02a57741d5f984450011f15aa1fe9aadb34a2efd
| C
|
* commit fcd06de1c88e37624ac688eb724162624e357cac
| B
|
* commit 53d010f279f4d960dd7b31b9e34520321aaa8c70
A
Спасибо @Teivaz за то, что позволил мне поверить в себя и не бояться.
Ответ:
git rebase --onto master-old D master
Наверное, это можно интерпретировать, так: к ветке master-old прикрепляется всё от D до master, при этом HEAD у master-old не меняется, а master по сути становится за ветку master-old.
См. также картинки с сайта git-scm:

git rebase --onto master server client
Здесь вместо названий веток можно вставлять хэши коммитов.
