Что происходит с историей коммитов при rebase
Что проверяют
Понимаете ли вы, что rebase не переносит коммиты, а создаёт новые, и осознаёте ли последствия для ветки, которую коллеги уже забрали себе. Вопрос простой на словах, но по ответу видно, чинил ли человек последствия хоть раз.
Как отвечать
- Rebase берёт коммиты вашей ветки, которых нет в базовой, и по очереди накладывает их поверх её вершины. Каждый коммит пересобирается заново: сменился родитель, значит сменился и хеш.
- Старые объекты не исчезают мгновенно, просто на них больше нет ссылки из ветки. До сборки мусора они видны в
git reflog, и оттуда ветку можно вернуть. - Содержимое коммитов тоже может измениться: конфликт вы разрешаете руками, и в новой истории лежит уже ваша версия файла. Автор и дата авторства сохраняются, дата коммита обновляется.
- История становится линейной, коммиты слияния по умолчанию из неё выпадают, отдельной ветки в графе больше не видно. Это и плюс, и минус: читать проще, а понять, что вот эти пять коммитов делались вместе, уже нельзя.
- Отсюда правило: не переписывать то, что другие уже скачали. Личную ветку обновлять ребейзом нормально, но заливать придётся с
--force-with-lease, который откажется затирать чужой коммит, в отличие от простого--force. - Выбраться можно всегда:
git rebase --abortво время процесса,git reflogиgit reset --hardпосле него.
Где спотыкаются
Говорят, что коммиты «переезжают». Переезжают изменения, а коммиты создаются новые, со своими хешами. Из этого следует всё остальное: и необходимость форсированной заливки, и расхождение с копией ветки у коллеги.
Второе: ребейзят общую ветку, на которой работает вся команда. У остальных она расходится с удалённой, следующий git pull порождает дубли коммитов и слияние поверх переписанной истории. Правило простое: переписывается только то, что никому не отдано.
Третье: запускают git pull --rebase с незакоммиченными правками. Rebase требует чистого дерева: без автоматического прятания команда откажется работать, а с ним изменения вернутся посреди процесса и дадут конфликт там, где разбираться труднее всего. Проще закоммитить или спрятать самому заранее.