Системы контроля версий
Git flow, rebase, cherry-pick и pre-commit.
6 вопросов
MiddleТеорияОчень частоЧем отличаются git merge и git rebase?
Чем отличаются git merge и git rebase?
merge сохраняет обе истории и пишет merge-коммит, оставляя правдивую, но запутанную хронологию. rebase переписывает ваши коммиты поверх целевой вершины ради чистой линейной истории, но меняет хэши — поэтому общие ветки им не трогают.
Типичные ошибки
- ✗Менять их местами — думать, что
mergeпереписывает историю, аrebaseсохраняет - ✗Считать, что
rebaseсоздаёт merge-коммит, какmerge - ✗Полагать, что безопасно делать
rebaseобщей или уже отправленной ветки
Уточняющие вопросы
- →Что такое fast-forward merge и когда Git использует его вместо merge-коммита?
- →Как
git pull --rebaseменяет поведение pull по умолчанию?
JuniorТеорияЧастоЧто делает git cherry-pick?
Что делает git cherry-pick?
Применяет изменения из одного или нескольких конкретных коммитов, выбранных по хэшу, на текущую ветку — копируя отдельные коммиты между ветками. Скопированный commit при этом получает новый хэш.
Типичные ошибки
- ✗Ожидать, что скопированный
commitсохранит свой исходный хэш на новой ветке - ✗Думать, что cherry-pick удаляет
commitиз исходной ветки - ✗Путать cherry-pick одного коммита со слиянием всей ветки
Уточняющие вопросы
- →Как cherry-pick того же изменения позже может вызвать конфликты или дубликаты?
- →Что добавляет
git cherry-pick -xв сообщение коммита?
JuniorТеорияЧастоЧто такое модель ветвления Git Flow?
Что такое модель ветвления Git Flow?
Процесс с двумя долгоживущими ветками: master (история релизов) и develop (интеграция), плюс короткоживущие feature (от develop), release (от develop, в обе) и hotfix (от master).
Типичные ошибки
- ✗Слияние ветки
featureнапрямую вmasterвместоdevelop - ✗Отведение
hotfixотdevelop, а не отmaster - ✗Забывают, что ветку
releaseнужно слить обратно и вmaster, и вdevelop
Уточняющие вопросы
- →Зачем нужна отдельная ветка
releaseвместо тегирования прямо вdevelop? - →Чем trunk-based development отличается от Git Flow?
MiddleТеорияЧастоЧто делает git rebase и для чего нужен интерактивный rebase?
Что делает git rebase и для чего нужен интерактивный rebase?
Rebase воспроизводит ваши коммиты поверх вершины другой ветки, давая линейную историю с новыми хэшами. Интерактивный rebase (git rebase -i) — для наведения порядка в ветке перед публикацией: переупорядочить, отредактировать, squash, fixup или drop коммиты через todo-список.
Типичные ошибки
- ✗Думать, что интерактивный rebase правит файлы рабочего дерева, а не сами коммиты
- ✗Считать, что
squashиfixupработают одинаково и оба выбрасывают сообщение коммита - ✗Полагать, что
git rebase -iне умеет переупорядочивать илиdropкоммиты, только переписывать сообщения
Уточняющие вопросы
- →Когда выбрать
squashвместоfixupпри интерактивном rebase? - →Что позволяет
git rebase --onto, чего не может обычный rebase?
JuniorТеорияИногдаДля чего используется хук pre-commit?
Для чего используется хук pre-commit?
Это клиентский Git-хук — скрипт, запускающийся автоматически перед записью коммита. Он может линтить, форматировать, гонять тесты или проверять стиль вроде PEP8 и прервать commit, если проверки не прошли.
Типичные ошибки
- ✗Думать, что
pre-commitзапускается на сервере после push, а не локально - ✗Считать, что хук не может заблокировать или прервать неудачный
commit - ✗Полагать, что хуки — это возможность GitHub, а не самого Git
Уточняющие вопросы
- →Почему Git-хуки по умолчанию не под версионным контролем и как команды ими делятся?
- →Чем фреймворк
pre-commitотличается от обычного скрипта Git-хука?
SeniorТеорияИногдаПочему после rebase нужен force push и что такое --force-with-lease?
Почему после rebase нужен force push и что такое --force-with-lease?
Rebase переписывает коммиты с новыми хэшами, удалёнка расходится и обычный push отклоняется. --force перезаписывает её, но может затереть коммиты коллег. --force-with-lease перезапишет, только если удалёнка совпадает с тем, что вы видели.
Типичные ошибки
- ✗Думать, что обычный
pushпроходит после rebase без флага force - ✗Считать
--forceи--force-with-leaseполностью взаимозаменяемыми - ✗Полагать, что обычный force push никогда не затрёт коммиты коллеги
Уточняющие вопросы
- →Какое состояние удалёнки проверяет
--force-with-leaseи когда проверка падает? - →Как
git reflogпомогает вернуть коммиты, потерянные из-за неудачного force push?