Страницы

Поиск по вопросам

суббота, 13 октября 2018 г.

Как разделить/склеить старый комит?

Задачка из области синтетических, нужно для понимания как это делать правильно.
Есть история из 3 коммитов
git log --oneline cccccc change c.txt bbccaa add new two file (b.txt, c.txt) and change a.txt aaaaaa add new file a.txt
Задача 1: разделить bbccaa на два, чтобы результат был
git log --oneline cccccc change c.txt aaa111 change a.txt bbbccc add two file (b.txt, c.txt) aaaaaa add new file a.txt
Задача 2: склеить частично bbbccc с aaaaaa, чтобы вышло
git log --oneline cccccc change c.txt aaa111 change a.txt ccc111 add file c.txt aaabbb add files a.txt b.txt


Ответ

И то, и другое делается с помощью rebase (самой страшной командой в гите:) ).
Начнем с второго, как более простого.
git rebase -i HEAD~3
-i - интерактивный режим, HEAD~3 - три последних коммита.
Откроется редактор по умолчанию, где будет список коммитов. Вверху более старые, внизу более свежие (обратно выводу git log!) На против каждого будет написано pick (то есть, "взять"). Находим коммиты, которые нужно слить и напротив верхнего с пары пишем s или squash. Сохраняемся. Git сам откатит указанные коммиты, а потом накатит по новому. Коммит-сообщение возьмет с парного коммита. Если нужно его поправить, то напротив него пишем edit - при накатывании коммита будет открыто стандартное окно редактора для ввода сообщения коммита.
С разделением чуть сложнее. Для этого выбираем коммит, пишем напротив него edit и сохраняем. Гит откатит коммиты (не только тот, который выбран, и все до самого свежего - это нужно понимать!). И начнет накатывать их по новой. Когда дойдет до того, который помечен edit - вывалится в консоль. В этот момент с помощью git add/git reset (я люблю использовать git add -i, если нужно добавить "кусочками") исправить коммит, можно сделать ещё один-другой, а потом дать комманду git rebase --continue и гит продолжит накатывать коммиты. Важно понимать, что sha хэши новых коммитов поменяются.
За дополнительными инструкциями как всегда читайте справку

Комментариев нет:

Отправить комментарий