Страницы

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

четверг, 5 декабря 2019 г.

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

#git #git_rebase


Задачка из области синтетических, нужно для понимания как это делать правильно.

Есть история из 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    

    


Ответы

Ответ 1



И то, и другое делается с помощью 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 хэши новых коммитов поменяются. За дополнительными инструкциями как всегда читайте справку.

Ответ 2



Можно сделать с помощью git rebase -i как писал @KoVadim, можно откатиться на aaabbb с сохранением изменением в рабочей директории и перекоммитить заново выборочно. И то и то при условии что не было push на сервер и другие люди не скачали изменения.

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

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