[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-git-chto-takoe-git-bisect":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":17,"progress":18,"seo":19},1337,"chto-takoe-git-bisect",44,"git","Git","📦","Что такое git bisect?","git bisect — это встроенный инструмент бинарного поиска коммита, который внёс баг. Git автоматически делит историю пополам и позволяет найти проблемный коммит за O(log N) шагов.\n\n> Аналогия из жизни: представьте, что в книге из 1000 страниц где-то допущена опечатка. Вместо просмотра каждой страницы, вы открываете середину: если опечатка уже есть — ищете в первой половине, иначе — во второй. Каждый шаг сокращает область поиска вдвое. 1000 страниц = максимум 10 проверок.\n\n### Как работает\n\nАлгоритм бинарного поиска: если в истории N коммитов, потребуется не более log2(N) проверок. Для 1000 коммитов — максимум 10 шагов.\n\n### Ручной режим\n\n```bash\n# 1. Начать bisect\ngit bisect start\n\n# 2. Указать «плохой» коммит (баг присутствует) — обычно текущий\ngit bisect bad\n\n# 3. Указать «хороший» коммит (баг отсутствует)\ngit bisect good v1.0.0\n\n# Git переключается на средний коммит и говорит, сколько шагов осталось:\n# Bisecting: 12 revisions left to test after this (roughly 4 steps)\n\n# 4. Проверяем: баг есть?\n# Если да:\ngit bisect bad\n# Если нет:\ngit bisect good\n\n# 5. Повторяем шаг 4, пока Git не найдёт виновный коммит:\n# a1b2c3d is the first bad commit\n\n# 6. Завершить bisect и вернуться к исходному состоянию\ngit bisect reset\n```\n\n### Автоматический режим\n\nМожно автоматизировать, передав скрипт\u002Fкоманду, которая возвращает 0 (good) или 1 (bad):\n\n```bash\n# Автоматический bisect с тестом\ngit bisect start HEAD v1.0.0\ngit bisect run mvn test -pl payment-service -Dtest=PaymentCalculationTest\n\n# Или с произвольным скриптом\ngit bisect run .\u002Ftest-bug.sh\n```\n\n\u003Cdetails>\n\u003Csummary>Пример скрипта test-bug.sh\u003C\u002Fsummary>\n\n```bash\n#!\u002Fbin\u002Fbash\nmvn compile -q && java -cp target\u002Fclasses com.example.BugCheck\n# Возвращает 0, если баг НЕ воспроизводится (good)\n# Возвращает 1, если баг воспроизводится (bad)\n```\n\n\u003C\u002Fdetails>\n\n### Ключевые моменты\n\n- `git bisect` — невероятно эффективен для поиска регрессий: 1024 коммита = максимум 10 проверок\n- Автоматический `bisect run` экономит время — Git сам выполняет все проверки\n- Bisect работает с любой проверкой — компиляция, тест, ручная проверка\n- Скрипт для `bisect run` должен вернуть код 125, если коммит нельзя проверить (будет пропущен)\n\n### Частые ошибки\n\n- Забывать `git bisect reset` — оставаться в detached HEAD после завершения поиска\n- Не иметь автоматических тестов для проверки — приходится вручную тестировать каждый шаг\n- Указывать неверный «хороший» коммит — если баг существовал и в нём, bisect не найдёт правильный результат\n- Скрипт для `bisect run` использует exit code неправильно (код 128 и выше прерывает bisect)\n\n### Как используется в 2026\n\n- `git bisect` остаётся стандартным инструментом для поиска регрессий\n- В сочетании с хорошим тестовым покрытием автоматический bisect находит проблемный коммит за секунды\n- Некоторые CI-системы умеют запускать bisect автоматически при обнаружении регрессии\n- AI-ассистенты помогают составлять скрипты для `bisect run` по описанию бага\n\n> **На собеседовании:** этот вопрос показывает глубину опыта. Объясните алгоритм (бинарный поиск, log2(N) шагов) и опишите пошаговый процесс: start, bad, good, повторять, reset. Бонус — упомянуть `bisect run` для автоматизации с тестами. Частая ошибка кандидатов — не знать про этот инструмент вообще.","","junior",[7,15,16],"основы","commands",[],null,{"title":20,"description":21,"ogTitle":22,"ogDescription":23,"keywords":24,"schemaAnswer":33,"featuredSnippetReady":34},"Что такое git stash — Gymterview","git stash: временное сохранение незакоммиченных изменений. Операции push\u002Fpop\u002Fapply\u002Fdrop, флаг -u для untracked, создание ветки из stash, типичные сценарии.","Git stash: временное сохранение изменений — Gymterview","Как использовать git stash: push, pop vs apply, флаг -u, создание ветки. Типичный сценарий — срочное переключение контекста.",[25,26,27,28,29,30,31,8,32],"git stash","stash pop","stash apply","stash push","временное сохранение","untracked","LIFO","собеседование","git stash — команда для временного сохранения незакоммиченных изменений в стековом хранилище (LIFO). pop = apply + drop (применяет и удаляет), apply — оставляет в списке. Флаг -u включает untracked-файлы. Stash привязан к репозиторию, не к ветке. git stash push --staged (Git 2.35+) сохраняет только проиндексированные. Можно создать ветку из stash: git stash branch \u003Cname>.",true]