Можно ли изменить очень старые коммиты? И еще несколько вопросов про git?
1) Недавно узнал о git rebase -i, с помощью которой можно не только перебазировать, а еще и как-то модифицировать коммиты.
Но вот незадача, коммит, который нужно изменить уже далеко ушел и если я выполню git rebase -i , то откроется блокнот со всеми коммитами, а их довольно много. Можно ли изменить только эту пару старых коммитов, не трогая новые?
2) Я попробовал сделать git rebase --onto HEAD~15 HEAD~15 HEAD~13, но у меня после перебазирования появились новые коммиты, HEAD перешел на них но оказался в Detached state, так что либо их потерять, либо создавать ветку новую... Как это работает? Объясните логику гита, наподобие примеров ниже
И еще пара вопросов
3) Можно ли описать git rebase так: гит идет от HEAD, идет, идет, пока не видит коммит, достижимый из . Затем, берет те, что собрал и перемещает наверх -а?
4) А git rebase --onto так: тоже самое, что и выше, только кладет поверх ?
5) А git rebase -i HEAD~5 так: гит идет от HEAD, идет, идет, пока не видит коммит, достижимый из HEAD~5 (то есть, он сам), и перемещает на HEAD~5, то есть порядок и (база?) не меняется, запускается только интерактивка
Можно ли изменить только эту пару старых коммитов, не трогая новые?
Нельзя. Каждый коммит зависит от своих родителей. Изменяя родителя ты автоматически изменишь и потомков.
Я попробовал сделать git rebase --onto HEAD~15 HEAD~15 HEAD~13
Бессмысленная команда. Первый и второй параметры обозначают откуда и куда пересаживать кусок ветки. А у тебя источник и назначение совпадают. Что тогда должна делать твоя команда?
Можно ли описать git rebase так: гит идет от HEAD, идет, идет, пока не видит коммит, достижимый из . Затем, берет те, что собрал и перемещает наверх -а?
Я не понял твой поток междометий и знаков препинания ((
Обычно rebase просто берет одну ветку и пересобирает её на вершине другой. Кладёт поверх.
А git rebase --onto так: тоже самое, что и выше, только кладет поверх ?
То же самое, но пересаживает только кусок ветки, а не всю цепочку. И тоже поверх.
А git rebase -i HEAD~5 так: гит идет от HEAD, идет, идет, пока не видит коммит, достижимый из HEAD~5 (то есть, он сам), и перемещает на HEAD~5, то есть порядок и (база?) не меняется, запускается только интерактивка
Да. HEAD~5 будет базой, на которой эта ветка пересоберётся по другому. Никаких перемещений веток.