Как решаются конфликты при rebase
Что проверяют
Понимаете ли вы, что rebase переигрывает ваши коммиты по одному, и можете ли пройти конфликт, не потеряв чужую работу. Следом обычно спрашивают разницу между rebase и merge и что делать с веткой, которую уже запушили.
Как отвечать
Механика: git rebase main откладывает ваши коммиты, переносит ветку на вершину main и применяет коммиты заново, по одному. Поэтому конфликт может всплыть на каждом коммите, а не один раз, как при merge. Порядок действий:
- увидеть конфликт:
git statusпоказывает файлы в состоянии «both modified», внутри маркеры<<<<<<<,=======,>>>>>>>; - разрешить: руками или через окно Resolve Conflicts в Android Studio с тремя панелями. Удобно включить
git config merge.conflictStyle zdiff3, тогда в маркерах видна и общая исходная версия; - продолжить:
git addдля исправленных файлов иgit rebase --continue.git rebase --skipвыбрасывает текущий коммит целиком,git rebase --abortвозвращает ветку в состояние до начала; - проверить: собрать проект и прогнать тесты, текстово чистый результат ещё не значит рабочий код;
- запушить: история переписана, нужен
git push --force-with-lease, а не голый--force, который затрёт чужие коммиты, если они успели появиться.
У Android свои горячие точки: libs.versions.toml и build.gradle.kts при обновлении зависимостей, strings.xml, AndroidManifest.xml, графы навигации. Если одни и те же конфликты повторяются, помогает git rerere: Git запоминает ваше разрешение и применяет его сам. Если что-то пошло не так уже после завершения, прежнее состояние ветки лежит в git reflog.
Где спотыкаются
Путают --ours и --theirs. Во время rebase они меняются местами: «ours» это ветка, на которую вы переносите, а «theirs» это ваш коммит. Команда git checkout --theirs здесь оставит вашу версию, а не чужую.
Делают rebase общей ветки, в которой работают другие люди, и пушат с --force. У коллег после этого расходится история.
Разрешают конфликт в libs.versions.toml, оставив две версии одной библиотеки или выбрав старую, и не собирают проект перед --continue. Ошибка всплывает уже в CI.