[{"data":1,"prerenderedAt":1727},["ShallowReactive",2],{"$fZBItvx4XQqmgX1wXfqJVIUz1GbSP4Io5C4MZ48QIdDs":3,"$fMMUdSFktwQFqMVGPrTtt3EC5yheBp7PzwIqznamFcMo":132,"$f1Prj1xEczHja_-L7FyIGgRHd5_cSWHo7r6AE5aheAik":135,"$fc0LoAJgqXDLbKKd2JS_NpM4SuzBK8EycUXINSg09CKU":460,"$fM3ea55k6lKMPOTM84llDB26VSQDVVbxiQuSBFQw9P_c":463,"$fI5fDmvm-5tr9wcH0eHaKZa1j3y_FQIQaHHPqbZxAHJE":707,"mdc-cfgfia-key":727,"mdc--sk83mu-key":739,"mdc-3x56fv-key":747,"mdc-x44wd9-key":755,"mdc-amvzdm-key":763,"mdc-qq4wy6-key":771,"mdc-v5kq0m-key":779,"mdc--rzgo6i-key":794,"mdc--q8ke93-key":899,"mdc--lwvj12-key":907,"mdc--ke5m30-key":915,"mdc--po3gch-key":1085,"mdc-ypqbrb-key":1168,"mdc--m52hnp-key":1296,"mdc--peltzc-key":1304,"mdc--rqtunb-key":1373,"mdc--yggelt-key":1381,"mdc--qe9tc1-key":1424,"mdc-sp99fr-key":1441,"mdc--o60huy-key":1454,"mdc--kyv2ob-key":1479,"mdc-dhr6ey-key":1494,"mdc-srcbsa-key":1517},{"content":4,"quizQuestionContent":102,"type":121,"pageMeta":122},[5,9,13,16,20,24,27,31,34,38,41,45,48,51,55,58,62,65,69,72,76,79,82,86,89,93,96,99],{"id":6,"value":7,"isTypeH1":8},"1906","Стратегии ветвления Git для командной разработки",true,{"id":10,"value":11,"anchor":12,"isTypeH2":8},"4371","Теория: что такое стратегия ветвления","theory-what-is-a-branching-strategy",{"id":14,"value":15,"isTypeParagraph":8},"10056","Стратегия ветвления (branching strategy) — это набор командных соглашений о том, какие ветки создаются, как и когда в них вносятся изменения, какими правилами сопровождается проверка (ревью, тесты), и как изменения попадают в основную ветку (`main`) и в релиз.  \nЦель стратегии — сделать совместную работу предсказуемой: уменьшить конфликты при слиянии, сократить риск “сломать” продукт, обеспечить прозрачный путь от задачи до релиза.  \nПрактически любая стратегия ветвления тесно связана с Pull Request / Merge Request, а также с CI (автоматические сборки и тесты) и правилами защиты веток (например, запрет прямых push в `main`).\n\nТиповые элементы стратегии:\n- Основная ветка: обычно `main` (иногда `master` в старых проектах), является “источником истины” и базой для интеграции.\n- Ветки изменений: чаще всего `feature/*` или ветки задач, создаются на время разработки конкретного изменения.\n- Механизм интеграции: merge (обычный), squash merge (слияние с “уплотнением” коммитов), rebase (перенос коммитов поверх свежей базы).\n- Механизм релизов: теги (`v1.2.0`), релизные ветки (`release/*`), либо “релиз из main” при достаточной автоматизации.",{"id":17,"description":18,"titleAlert":19,"isTypeAlertWarning":8},"696","Чем больше долгоживущих веток и ручных переносов изменений, тем выше стоимость сопровождения: возрастает вероятность конфликтов, усложняется понимание “где находится актуальный код”, становится труднее обеспечить постоянную готовность к релизу.",null,{"id":21,"value":22,"anchor":23,"isTypeH2":8},"4372","Вариант 2: разбор стратегий","option-2-explained",{"id":25,"value":26,"isTypeParagraph":8},"10057","Ниже разобраны четыре стратегии из варианта 2: Git Flow, GitHub Flow, GitLab Flow и Trunk-Based Development.",{"id":28,"value":29,"anchor":30,"isTypeH3":8},"4383","Git Flow (Gitflow)","gitflow",{"id":32,"value":33,"isTypeParagraph":8},"10058","Gitflow — стратегия, где помимо основной ветки часто существуют ещё несколько долгоживущих веток и отдельные ветки под релизы и срочные исправления.  \nКлассическая модель включает:\n- `main`: содержит релизы (часто помеченные тегами версий).\n- `develop`: интеграционная ветка, куда сливаются готовые фичи перед релизом.\n- `feature/*`: ветки под отдельные задачи/функции, создаются от `develop` и затем вливаются обратно в `develop`.\n- `release/*`: ветки подготовки релиза, создаются от `develop`, затем вливаются в `main` и обратно в `develop`.\n- `hotfix/*`: ветки срочных исправлений, создаются от `main`, затем вливаются в `main` и `develop`.\n\nСхема (упрощённо):\n```\nmain:     o---------o-----------o------->  (релизы, теги)\n           \\         \\         /\nrelease:     \\---o----\\---o---/          (подготовка релиза)\n              \\        \\     /\ndevelop:        o---o---o---o---------->  (интеграция фич)\n                 \\       \\\nfeature/*:         o---o   o---o         (работа по задачам)\nhotfix/* (от main):     o---o            (срочная правка)\n```\n\nКогда Gitflow подходит:\n- Релизы выходят по расписанию и требуется отдельная “фаза стабилизации”.\n- Требуется поддержка релизных линий (например, исправления для уже выпущенной версии).\n\nКогда Gitflow создаёт сложности:\n- При частых релизах и сильном упоре на непрерывную интеграцию, так как усложняются правила и увеличивается число слияний между долгоживущими ветками.",{"id":35,"value":36,"anchor":37,"isTypeH3":8},"4384","GitHub Flow","github-flow",{"id":39,"value":40,"isTypeParagraph":8},"10059","GitHub Flow — облегчённый workflow, ориентированный на короткоживущие ветки: “ветка под изменение → Pull Request → проверки и ревью → merge в `main` → удаление ветки”.  \nЭто подходит для проектов, где `main` старается оставаться в состоянии “готово к выкладке” (при наличии автоматических проверок).\n\nКлючевые шаги GitHub Flow:\n1) Создание новой ветки от `main` с коротким описательным именем (например, `fix-header-layout`).  \n2) Частые небольшие коммиты в ветке.  \n3) Открытие Pull Request для обсуждения и ревью.  \n4) Прохождение CI-проверок (тесты/сборка).  \n5) Слияние в `main` и удаление ветки.\n\nСхема:\n```\nmain:      o----o----------------o------>\n               \\                /\nfeature/x:       o----o----o----\n```\n\nПреимущества:\n- Простые правила, легко начать применять в небольшой команде.\n- Хорошо сочетается с CI/CD и частыми релизами.\n\nОграничения:\n- Если нужна параллельная поддержка множества версий, может потребоваться дополнительный слой правил (например, релизные ветки или теги плюс строгая политика backport).\n",{"id":42,"value":43,"anchor":44,"isTypeH3":8},"4385","GitLab Flow (как набор стратегий ветвления)","gitlab-flow",{"id":46,"value":47,"isTypeParagraph":8},"10060","GitLab Flow часто рассматривается как практический набор соглашений, который может быть как простым (feature branches → merge в `main`), так и более сложным (релизные ветки, ветки окружений).  \nВажная идея: стратегия ветвления должна соответствовать тому, как реально выполняется поставка (delivery) и через какие окружения проходит релиз.\n\nДва распространённых варианта:\n- “Простой”: каждая задача делается в отдельной ветке и вливается в `main` через Merge Request.  \n- “По окружениям”: существуют ветки, отражающие окружения (например, `test`, `staging`, `production`), и релиз-кандидаты “продвигаются” между ветками.\n\nСхема “ветки по окружениям” (упрощённо):\n```\nmain:      o---o---o---o-------------------->\n                 \\\ntest:             o---o---(проверки)-------->\n                       \\\nstaging:                 o---(приёмка)------->\n                             \\\nproduction:                   o---(деплой)-->\n```",{"id":49,"description":50,"titleAlert":19,"isTypeAlertWarning":8},"697","При ветках окружений важно формализовать правила продвижения: что именно переносится (коммиты, merge-коммиты, теги), кто отвечает за перенос, и как предотвращаются расхождения между окружениями. Иначе появляются повторяющиеся ручные операции и риск “несовпадения” кода в разных ветках.",{"id":52,"value":53,"anchor":54,"isTypeH3":8},"4386","Trunk-Based Development (TBD)","trunk-based-development",{"id":56,"value":57,"isTypeParagraph":8},"10061","Trunk-Based Development — подход, где основная ветка (`main`, “trunk”) является центром разработки: изменения вливаются туда часто, малыми порциями, а ветки живут недолго.  \nГлавная цель — поддерживать непрерывную интеграцию: чем меньше и чаще изменения, тем легче их проверять, тем меньше конфликтов и тем быстрее обратная связь от тестов.\n\nКлючевые принципы TBD:\n- `main` должен оставаться “зелёным”: сборка и тесты проходят, состояние пригодно для выпуска.\n- Короткоживущие ветки (часто 1–2 дня) или даже коммиты напрямую в `main` при строгих правилах и автоматизации.\n- Практика feature flags (флаги функций) помогает сливать код, который ещё не должен быть активен для пользователей.\n\nСхема:\n```\nmain (trunk): o--o--o--o--o--o---------------->\n               \\        /\nshort branch:    o--o--o    (жизнь 1-2 дня)\n```",{"id":59,"value":60,"anchor":61,"isTypeH2":8},"4373","Практика: команды и шаблоны","practice-git-commands-and-templates",{"id":63,"value":64,"isTypeParagraph":8},"10062","Ниже приведены заготовки команд, которые показывают типовой цикл “ветка → проверки → слияние”.",{"id":66,"value":67,"anchor":68,"isTypeH3":8},"4387","Универсальный цикл: feature-ветка → PR/MR → merge","universal-feature-branch-cycle",{"id":70,"value":71,"isTypeParagraph":8},"10063","```\n# 1) Переход в основную ветку и обновление\ngit checkout main\ngit pull --ff-only\n\n# 2) Создание ветки под задачу\ngit checkout -b feature/add-login-form\n\n# 3) Работа и фиксация результата\ngit add .\ngit commit -m \"Add login form markup\"\n\n# 4) Отправка ветки на сервер\ngit push -u origin feature/add-login-form\n\n# 5) Далее создаётся Pull Request / Merge Request в интерфейсе платформы\n```\n\nРекомендации к качеству изменений:\n- Следует стремиться к небольшим Pull/Merge Request, чтобы ревью было быстрым и точным.\n- Следует включать автоматические проверки (линтеры, тесты, сборка) как обязательные условия перед merge.\n- Следует защищать `main` от прямых push, если команда работает через PR/MR.",{"id":73,"value":74,"anchor":75,"isTypeH3":8},"4388","Пример Gitflow: feature → develop → release → main","gitflow-example",{"id":77,"value":78,"isTypeParagraph":8},"10064","```\n# feature-ветка создаётся от develop\ngit checkout develop\ngit pull --ff-only\ngit checkout -b feature/payment-validation\n\n# после завершения feature вливается в develop\ngit checkout develop\ngit merge --no-ff feature/payment-validation\ngit push\n\n# создаётся релизная ветка\ngit checkout -b release/1.4.0\ngit push -u origin release/1.4.0\n\n# в релизной ветке выполняются только правки для релиза\ngit commit -am \"Fix release notes\"\ngit push\n\n# релиз: merge в main + тег версии\ngit checkout main\ngit merge --no-ff release/1.4.0\ngit tag -a v1.4.0 -m \"Release 1.4.0\"\ngit push --follow-tags\n\n# затем релизная ветка вливается обратно в develop\ngit checkout develop\ngit merge --no-ff release/1.4.0\ngit push\n```",{"id":80,"description":81,"titleAlert":19,"isTypeAlertInfo":8},"640","Команда `git tag -a v1.4.0 -m \"Release 1.4.0\"` показывает, как фиксировать релиз “меткой”, чтобы можно было однозначно найти состояние кода релизной версии.",{"id":83,"value":84,"anchor":85,"isTypeH3":8},"4389","Пример TBD: feature flag в веб-приложении","tbd-feature-flag-in-web-app",{"id":87,"value":88,"isTypeParagraph":8},"10065","```\n// Пример feature flag (псевдокод)\nconst flags = {\n  newCheckout: false\n}\n\nfunction renderCheckout() {\n  if (flags.newCheckout) {\n    return renderNewCheckout()\n  }\n  return renderOldCheckout()\n}\n```\n\nСмысл: код новой функциональности может быть слит в `main`, но для пользователей он остаётся выключенным до готовности, что облегчает частую интеграцию и уменьшает размер “опасных” релизов.",{"id":90,"value":91,"anchor":92,"isTypeH2":8},"4374","Как выбрать стратегию (простые критерии)","how-to-choose-a-strategy",{"id":94,"value":95,"isTypeParagraph":8},"10066","Выбор стратегии удобно делать по трём вопросам:\n- Как часто происходят релизы (редко по расписанию или часто/непрерывно)?\n- Нужно ли поддерживать несколько версий параллельно?\n- Насколько сильна автоматизация проверок (тесты, сборка, статический анализ)?\n\nТаблица для выбора:\n\n| Стратегия | Основная идея | Когда подходит | Типовые сложности |\n|---|---|---|---|\n| Gitflow | Отдельные роли веток (`main`, `develop`, `release/*`, `hotfix/*`) | Релизы по расписанию, нужна фаза стабилизации, есть поддержка релизных линий | Больше правил и слияний между долгоживущими ветками |\n| GitHub Flow | Короткие ветки + PR + merge в `main` | Веб‑сервисы и приложения с частыми релизами, простой процесс | Требуется дисциплина CI и защита `main` |\n| GitLab Flow | От простого “feature → main” до веток окружений/релизов | Когда ветки должны отражать поставку через окружения или версионирование | Риск ручных переносов и расхождений между ветками окружений |\n| Trunk-Based Development | Частые небольшие слияния в `main`, короткие ветки | Нужны быстрые релизы и сильная CI‑культура | При слабых тестах и без флагов функций трудно держать `main` стабильным |",{"id":97,"description":98,"titleAlert":19,"isTypeAlertWarning":8},"698","Если автоматические тесты отсутствуют или нестабильны, подходы с частыми слияниями (GitHub Flow, TBD) начинают приносить больше риска, чем пользы, так как ошибки быстрее попадают в `main`.",{"id":100,"value":101,"isTypeParagraph":8},"10067","Итого: правильный вариант: 2, так как он перечисляет распространённые стратегии ветвления Git: Gitflow (ветки develop/release/hotfix), GitHub Flow (короткие ветки и PR в `main`), GitLab Flow (набор стратегий, включая ветки окружений) и Trunk-Based Development (частые небольшие слияния в `main` при опоре на CI и флаги функций).",{"id":103,"options":104,"hint":118,"solution":119,"description":120},"1145",[105,109,112,115],{"id":106,"label":107,"isCorrect":108},"4718","Git Flow, Forking Flow, Centralized Flow, Linear Flow",false,{"id":110,"label":111,"isCorrect":8},"4719","Git Flow, GitHub Flow, GitLab Flow, Trunk-Based Development",{"id":113,"label":114,"isCorrect":108},"4720","Master Flow, Development Flow, Feature Flow, Release Flow",{"id":116,"label":117,"isCorrect":108},"4721","Waterfall, Agile, Scrum, Kanban","Следует выбрать вариант, где перечислены именно стратегии ветвления Git (workflow/branching model), затем дать определения каждой стратегии, показать типовые ветки и короткую схему движения изменений, и завершить критериями выбора (частота релизов, поддержка версий, зрелость CI).","**Правильный ответ: 2** - Git Flow, GitHub Flow, GitLab Flow, Trunk-Based Development","Какие существуют стратегии ветвления для работы команды? Что это такое?","quizQuestion",{"title":123,"description":124,"ogTitle":120,"ogDescription":124,"ogImageUrl":125,"canonical":19,"ogLocale":126,"ogSiteName":127,"ogImageType":128,"ogImageWidth":129,"ogImageHeight":130,"ogType":131,"ogUrl":19},"Стратегии ветвления в Git","Разбор Git Flow, GitHub Flow, GitLab Flow и Trunk-Based Development: смысл, правила веток, примеры команд и типовые схемы.","/og-image.png","ru_RU","goodwebjob.ru","image_jpeg","1200","630","article",{"siteName":133,"siteUrl":134},"GOOD WEB JOB!","https://goodwebjob.ru",{"slugs":136},[137,140,143,146,149,152,155,158,161,164,167,170,173,176,179,182,185,188,191,194,197,200,203,206,209,212,215,218,221,224,227,230,233,236,239,242,245,248,251,254,257,260,263,266,269,272,275,278,281,284,287,290,293,296,299,302,305,308,311,314,317,320,323,326,329,332,335,338,341,344,347,350,353,356,359,362,365,368,371,374,377,380,383,386,389,392,395,398,401,404,407,409,412,415,418,421,424,427,430,433,436,439,442,445,448,451,454,457],{"name":138,"value":139},"Теоретические задания","theoretical-tasks",{"name":141,"value":142},"Что вернёт этот код: typeof (function(){})()","what-this-code-will-return-typeof-function",{"name":144,"value":145},"С чего начать?","where-to-begin",{"name":147,"value":148},"Почему опасно писать прямо в прототипы базовых типов?","why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":150,"value":151},"Backend","backend",{"name":153,"value":154},"Frontend","frontend",{"name":156,"value":157},"Какие логические значения в console.log будут получены?","prototype-what-logical-values-will-be-received-in-console-log",{"name":159,"value":160},"Нечётные числа должны отсортироваться по возрастанию, а чётные должны остаться на своих местах","odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":162,"value":163}," Найти в массиве неповторяющиеся числа","find-non-repeating-numbers-in-an-array",{"name":165,"value":166},"arr.push(0) повлияет на массив так же, как если бы мы выполнили...","arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":168,"value":169},"Дана строка: 'one.two.three.four.five'. Необходимо из строки сделать вложенный объект","the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":171,"value":172},"Реализовать функцию, похоже как в Jquery","implement-a-function-similar-to-jquery",{"name":174,"value":175},"Для каждого вложенного объекта нужно добавить свойство level, которое равняется числу - номер вложенности","for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":177,"value":178},"Какое значение выведет консоль с object.property?","what-value-will-the-console-output-with-object-property",{"name":180,"value":181},"Что выведется в console.log([arr[0](), arr[0]()])?","what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":183,"value":184},"Вернуть массив от 1 до n, где числа, кратные 3, заменены на 'fizz', кратные 5 - на 'buzz', а кратные и 3, и 5 одновременно - на 'fizzbuzz'","returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":186,"value":187},"Необходимо проверить, являются ли две строки анаграммами друг друга","checks-whether-two-strings-are-anagrams-of-each-other",{"name":189,"value":190},"Определить, является ли слово палиндромом","determines-whether-a-word-is-a-palindrome",{"name":192,"value":193},"Есть массив, в котором лежат объекты с датами, необходимо отсортировать даты по возрастанию","there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":195,"value":196},"Реализовать функцию, принимающую аргументы \"*\", \"1\", \"b\", \"1c\" и возвращающую строку \"1*b*1c\"","implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":198,"value":199},"Дано дерево (вложенный объект), надо найти сумму всех вершин","given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":201,"value":202},"Для каждой ветви дерева записать номер вложенности данной ветви","for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":204,"value":205},"Есть слова в массиве, необходимо определить, состоят ли они из одних и тех же букв","there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":207,"value":208},"Числа от 1 до 100 находятся в массиве, они хаотично перемешанные, но в нём не хватает одного числа из этой последовательности. Необходимо найти его","the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"name":210,"value":211},"Есть строка, состоящая из разных скобок, необходимо проверить, закрыты ли все","there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":213,"value":214},"Напишите функцию, который сделает из массива объект","write-a-function-that-will-make-an-object-out-of-an-array",{"name":216,"value":217},"Что выведет console.log в результате выполнения цикла while?","what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":219,"value":220},"Есть функция и объект. Напишите все известные вам способы, чтобы вывести в консоли значение x из объекта, используя функцию","there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":222,"value":223},"Что выведет консоль в случае присвоения свойства массиву по строковому отрицательному индексу?","what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":225,"value":226},"Что выведет консоль в случае удаления элемента массива с помощью оператора delete?","what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":228,"value":229},"Уникализация значений в массиве","unifying-values-in-an-array",{"name":231,"value":232},"«Расплющивание» массива","flattening-the-array",{"name":234,"value":235},"Что вернёт метод book.getUpperName()?","what-will-the-book-get-upper-name-method-return",{"name":237,"value":238},"Сжатие строк","string-compression",{"name":240,"value":241},"Что выведет консоль в случае присвоения свойства массиву по строковому положительному индексу?","what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":243,"value":244},"Что получится в результате передачи объекта как аргумента в функцию и выполнения кода?","what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":246,"value":247},"Как браузер после ввода домена понимает, откуда брать сайт?","how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":249,"value":250},"Как домен попадает в DNS в таблицу соответствия: домен – ip","how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":252,"value":253},"Как браузер решает, какое соединение ему открывать, TCP или UDP?","how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":255,"value":256},"Ключевые отличия TCP и UDP","key-differences-between-tcp-and-udp",{"name":258,"value":259},"\"TCP/IP\" - кем является TCP, а кем IP в данном случае?","tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":261,"value":262},"Что такое HTTP и из чего состоит?","what-is-http-and-what-does-it-consist-of",{"name":264,"value":265},"Что такое заголовки в HTTP и зачем они нужны?","what-are-http-headers-and-why-do-we-need-them",{"name":267,"value":268},"Что такое параметры в HTTP?","what-are-http-parameters",{"name":270,"value":271},"Где находится HTML-код в структуре HTTP-ответа?","where-is-the-html-code-located-in-the-http-response-structure",{"name":273,"value":274},"Что такое HTML?","what-is-html",{"name":276,"value":277},"Чем отличаются 1.0, 1.1, 2.0, 3.0 версии HTTP?","what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":279,"value":280},"Пользователь авторизован на сайте. Как сервер узнает об этом с последующими другими заходами, что «я – авторизованный пользователь»?","the-user-is-logged-in-on-the-website-how-does-the-server-know-that-i-am-an-authorized-user-when-the-user-logs-in-again",{"name":282,"value":283},"Что такое cookie?","what-is-a-cookie",{"name":285,"value":286},"Кто является инициатором записи cookie в браузере?","who-initiates-the-cookie-recording-in-the-browser",{"name":288,"value":289},"Есть ли возможность с клиента (с браузера) управлять cookie?","is-it-possible-to-manage-cookies-from-the-client-browser",{"name":291,"value":292},"Лайвкодинг","livecoding",{"name":294,"value":295},"Что вернёт следующий код? Object.create(null).hasOwnProperty('toString')","what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":297,"value":298},"Всё, что идет по HTTPS – оно защищено?","is-everything-that-goes-through-https-secure",{"name":300,"value":301},"Все данные зашифрованы, используется https. Хакер взламывает dns и делает подмену одного ip на другой, на фишинговый сайт. В этом случае, злоумышленник может получить данные (логин \\ пароль)?","all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":303,"value":304},"Есть веб-приложение. Помимо HTTP, какие протоколы того же уровня (Application Layer) можно дополнительно использовать в веб-приложении в браузере?","there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":306,"value":307},"Как браузер парсит JavaScript и изображения при рендеринге?","how-the-browser-parses-javascript-and-images-when-rendering",{"name":309,"value":310},"Что происходит, когда HTTP прислал HTML? Что браузер дальше делает c HTML с учетом того, что она валидная?","what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":312,"value":313},"Что в браузере блокирует рендеринг страницы?","what-is-blocking-the-page-rendering-in-the-browser",{"name":315,"value":316},"Что такое DOM в браузере? Что такое CSSOM?","what-is-dom-in-a-browser-what-is-cssom",{"name":318,"value":319},"Что является узлами в DOM?","what-are-nodes-in-the-dom",{"name":321,"value":322},"Из чего состоит CSSOM?","what-does-cssom-consist-of",{"name":324,"value":325},"Дан HTML-код. Какой будет цвет у текста «Some dummy text»?","the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":327,"value":328},"Есть шаблон HTML и CSS кода. Какой будет цвет у текста «Таким образом, постоянное»?","there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":330,"value":331},"Есть шаблон вложенного HTML кода. Какой будет цвет у текста «One more dummy text»?","there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":333,"value":334},"Есть шаблон вложенного HTML кода. Будет ли display:block у body влиять на span?","there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":336,"value":337},"Есть HTML код. Будет ли font-weight на span влиять?","there-is-an-html-code-will-font-weight-affect-span",{"name":339,"value":340},"Flexbox и Grid, чем отличаются друг от друга?","what-are-the-differences-between-flexbox-and-grid",{"name":342,"value":343},"Заменяют ли Flexbox и Grid друг друга?","do-flexbox-and-grid-replace-each-other",{"name":345,"value":346},"Есть CSS и JS анимация. Какая между ними разница, что быстрее, что более удобно?","there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"name":348,"value":349},"Сборник задач","tasks",{"name":351,"value":352},"Какие способы объявления функции есть в JavaScript?","what-are-the-ways-to-declare-a-function-in-javascript",{"name":354,"value":355},"Что такое this в JavaScript?","what-is-this-in-javascript",{"name":357,"value":358},"Что такое Event Loop, как работает?","what-is-an-event-loop-and-how-does-it-work",{"name":360,"value":361},"Что будет, если вызвать typeof на необъявленной переменной?","what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":363,"value":364},"Что показывает оператор typeof в JavaScript?","what-does-the-typeof-operator-show-in-javascript",{"name":366,"value":367},"Какие типы данных существует в JavaScript?","what-types-of-data-exist-in-javascript",{"name":369,"value":370},"Какую структуру использовать для хранения упорядоченного списка строк в JavaScript?","what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":372,"value":373},"Что вернет typeof для массива?","what-will-typeof-return-for-an-array",{"name":375,"value":376},"Почему оператор typeof, применённый к массиву, возвращает объект?","why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":378,"value":379},"Если нужно хранить список уникальных строк, какую структуру данных выбрать?","if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":381,"value":382},"Что возвращает typeof для new Set в JavaScript?","what-does-typeof-return-for-new-set-in-javascript",{"name":384,"value":385},"Для чего нужен React, какие он решает проблемы?","what-is-react-used-for-and-what-problems-does-it-solve",{"name":387,"value":388},"Если убрать в React VDOM/Fiber, и вручную изменять DOM, разве это не оптимально?","if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":390,"value":391},"Есть блок кода. Что в реальном DOM изменится после нажатия на кнопку?","there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":393,"value":394},"Есть код, в котором список и кнопка. Что в реальном DOM изменится после нажатия на кнопку?","there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":396,"value":397},"Зачем нужен Redux (Mobx/Effector)? Зачем нужен менеджер состояния? Какие проблемы решает?","why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":399,"value":400},"Как диагностировать и исправить нежелательное изменение цвета фона по клику на кнопку, если исходный код сайта запутан и недоступен для прямого чтения?","how-can-diagnose-and-fix-unwanted-background-color-changes-when-clicking-on-a-button-if-the-source-code-of-the-site-is-confusing-and-inaccessible-to-direct-reading",{"name":402,"value":403},"Разрабатывал, взял закоммитил, запушил. Оказалось, что запушил не в ту ветку, точнее, коммит не в ту ветку. Какие действия?","developed-it-committed-it-and-launched-it-it-turned-out-that-i-had-pushed-it-to-the-wrong-branch-or-rather-the-commit-was-in-the-wrong-branch-what-actions",{"name":405,"value":406},"В git есть несколько вариантов слияния веток, какие? Чем отличаются?","git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":120,"value":408},"what-are-the-branching-strategies-for-the-team-what-is-it",{"name":410,"value":411},"По каким характеристикам, ревьюер понимает, что данный код - хороший, а этот код - плохой?","how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"name":413,"value":414},"Дан фрагмент bash-скрипта: cd ~; mkdir foo... Что в нем происходит?","here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":416,"value":417},"Дан фрагмент bash-скрипта: target=$(ps -Af | grep $1 | head -n 1)...","here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"name":419,"value":420},"Что такое алгоритмическая сложность?","what-is-algorithmic-complexity",{"name":422,"value":423},"Какая алгоритмическая сложность у \"быстрой сортировки\"?","what-is-the-algorithmic-complexity-of-quick-sort",{"name":425,"value":426},"Почему в JavaScript два объекта с одинаковым содержимым при сравнении возвращают false?","why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":428,"value":429},"Каким способом может выполняться авторизация пользователя на сайте?","how-can-a-user-be-authorized-on-a-website",{"name":431,"value":432},"В чем разница между микро- и макро-тасками в JavaScript?","what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":434,"value":435},"В комнате три человека. Какова вероятность того, что хотя бы двое из них одного пола? То есть два и более.","there-are-three-people-in-the-room-what-is-the-probability-that-at-least-two-of-them-are-of-the-same-sex-that-is-two-or-more",{"name":437,"value":438},"Есть монета. Ее подбрасывают пять раз подряд. Каждый раз записывается, что выпало - орел или решка. Сколько разных последовательностей орлов и решек может при этом получиться?","there-is-a-coin-it-is-tossed-five-times-in-a-row-each-time-it-is-recorded-whether-it-lands-on-heads-or-tails-how-many-different-sequences-of-heads-and-tails-can-be-obtained",{"name":440,"value":441},"Как гарантированно найти лёгкую фальшивую монету среди 8 за минимальное число взвешиваний на чашечных весах?","how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"name":443,"value":444},"Подготовка к тех.интервью","technical-interview",{"name":446,"value":447},"Верно ли утверждение, что злоумышленник, контролирующий роутер и прослушивающий трафик, может получить логины и пароли от сайтов, на которые заходит клиент?","is-it-true-that-an-attacker-who-controls-a-router-and-listens-to-traffic-can-obtain-logins-and-passwords-from-websites-that-a-client-visits",{"name":449,"value":450},"Что такое DNS, как DNS находит нужный IP-адрес?","what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":452,"value":453},"Переменные объявлены следующим образом: a=3; b=«hello»;. Укажите правильное утверждение","variables-are-declared-as-follows-specify-the-correct-statement",{"name":455,"value":456},"Какой механизм лежит в основе оптимизации обновлений DOM в React?","what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":458,"value":459},"Что мешает организовать централизованное состояние без менеджера состояния? Если организовать состояние механизмами реакта: контекстом, стейтом, в чем проблема? Что менеджеры состояния привносят?","what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",[461],{"label":443,"slug":444,"to":462},"/technical-interview/where-to-begin",{"navigationList":464,"navigationSublist":470},[465,467],{"path":462,"isActive":108,"name":144,"icon":466,"isNavbarMobileDisabled":8},"material-symbols:visibility-outline-rounded",{"path":468,"isActive":8,"name":348,"icon":469,"isNavbarMobileDisabled":108},"/technical-interview/tasks","material-symbols:task-outline",[471,478,497,506,511,606,623,630,635,678,693,698],{"title":472,"list":473,"isOpened":108},"Bash",[474,476],{"name":413,"path":475,"isActive":108},"/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":416,"path":477,"isActive":108},"/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"title":479,"list":480,"isOpened":108},"CSS",[481,483,485,487,489,491,493,495],{"name":324,"path":482,"isActive":108},"/technical-interview/tasks/the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":327,"path":484,"isActive":108},"/technical-interview/tasks/there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":330,"path":486,"isActive":108},"/technical-interview/tasks/there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":333,"path":488,"isActive":108},"/technical-interview/tasks/there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":336,"path":490,"isActive":108},"/technical-interview/tasks/there-is-an-html-code-will-font-weight-affect-span",{"name":339,"path":492,"isActive":108},"/technical-interview/tasks/what-are-the-differences-between-flexbox-and-grid",{"name":342,"path":494,"isActive":108},"/technical-interview/tasks/do-flexbox-and-grid-replace-each-other",{"name":345,"path":496,"isActive":108},"/technical-interview/tasks/there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"title":498,"list":499,"isOpened":108},"Git",[500,502,504],{"name":402,"path":501,"isActive":108},"/technical-interview/tasks/developed-it-committed-it-and-launched-it-it-turned-out-that-i-had-pushed-it-to-the-wrong-branch-or-rather-the-commit-was-in-the-wrong-branch-what-actions",{"name":405,"path":503,"isActive":108},"/technical-interview/tasks/git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":120,"path":505,"isActive":108},"/technical-interview/tasks/what-are-the-branching-strategies-for-the-team-what-is-it",{"title":507,"list":508,"isOpened":108},"HTML",[509],{"name":273,"path":510,"isActive":108},"/technical-interview/tasks/what-is-html",{"title":512,"list":513,"isOpened":108},"JavaScript",[514,516,518,520,522,524,526,528,530,532,534,536,538,540,542,544,546,548,550,552,554,556,558,560,562,564,566,568,570,572,574,576,578,580,582,584,586,588,590,592,594,596,598,600,602,604],{"name":156,"path":515,"isActive":108},"/technical-interview/tasks/prototype-what-logical-values-will-be-received-in-console-log",{"name":147,"path":517,"isActive":108},"/technical-interview/tasks/why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":294,"path":519,"isActive":108},"/technical-interview/tasks/what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":177,"path":521,"isActive":108},"/technical-interview/tasks/what-value-will-the-console-output-with-object-property",{"name":180,"path":523,"isActive":108},"/technical-interview/tasks/what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":216,"path":525,"isActive":108},"/technical-interview/tasks/what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":219,"path":527,"isActive":108},"/technical-interview/tasks/there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":234,"path":529,"isActive":108},"/technical-interview/tasks/what-will-the-book-get-upper-name-method-return",{"name":452,"path":531,"isActive":108},"/technical-interview/tasks/variables-are-declared-as-follows-specify-the-correct-statement",{"name":240,"path":533,"isActive":108},"/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":222,"path":535,"isActive":108},"/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":225,"path":537,"isActive":108},"/technical-interview/tasks/what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":141,"path":539,"isActive":108},"/technical-interview/tasks/what-this-code-will-return-typeof-function",{"name":243,"path":541,"isActive":108},"/technical-interview/tasks/what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":351,"path":543,"isActive":108},"/technical-interview/tasks/what-are-the-ways-to-declare-a-function-in-javascript",{"name":354,"path":545,"isActive":108},"/technical-interview/tasks/what-is-this-in-javascript",{"name":357,"path":547,"isActive":108},"/technical-interview/tasks/what-is-an-event-loop-and-how-does-it-work",{"name":360,"path":549,"isActive":108},"/technical-interview/tasks/what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":363,"path":551,"isActive":108},"/technical-interview/tasks/what-does-the-typeof-operator-show-in-javascript",{"name":366,"path":553,"isActive":108},"/technical-interview/tasks/what-types-of-data-exist-in-javascript",{"name":369,"path":555,"isActive":108},"/technical-interview/tasks/what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":372,"path":557,"isActive":108},"/technical-interview/tasks/what-will-typeof-return-for-an-array",{"name":375,"path":559,"isActive":108},"/technical-interview/tasks/why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":378,"path":561,"isActive":108},"/technical-interview/tasks/if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":381,"path":563,"isActive":108},"/technical-interview/tasks/what-does-typeof-return-for-new-set-in-javascript",{"name":425,"path":565,"isActive":108},"/technical-interview/tasks/why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":431,"path":567,"isActive":108},"/technical-interview/tasks/what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":165,"path":569,"isActive":108},"/technical-interview/tasks/arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":183,"path":571,"isActive":108},"/technical-interview/tasks/returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":168,"path":573,"isActive":108},"/technical-interview/tasks/the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":198,"path":575,"isActive":108},"/technical-interview/tasks/given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":174,"path":577,"isActive":108},"/technical-interview/tasks/for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":201,"path":579,"isActive":108},"/technical-interview/tasks/for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":192,"path":581,"isActive":108},"/technical-interview/tasks/there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":204,"path":583,"isActive":108},"/technical-interview/tasks/there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":210,"path":585,"isActive":108},"/technical-interview/tasks/there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":162,"path":587,"isActive":108},"/technical-interview/tasks/find-non-repeating-numbers-in-an-array",{"name":213,"path":589,"isActive":108},"/technical-interview/tasks/write-a-function-that-will-make-an-object-out-of-an-array",{"name":186,"path":591,"isActive":108},"/technical-interview/tasks/checks-whether-two-strings-are-anagrams-of-each-other",{"name":159,"path":593,"isActive":108},"/technical-interview/tasks/odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":189,"path":595,"isActive":108},"/technical-interview/tasks/determines-whether-a-word-is-a-palindrome",{"name":231,"path":597,"isActive":108},"/technical-interview/tasks/flattening-the-array",{"name":195,"path":599,"isActive":108},"/technical-interview/tasks/implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":237,"path":601,"isActive":108},"/technical-interview/tasks/string-compression",{"name":228,"path":603,"isActive":108},"/technical-interview/tasks/unifying-values-in-an-array",{"name":207,"path":605,"isActive":108},"/technical-interview/tasks/the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"title":607,"list":608,"isOpened":108},"React",[609,611,613,615,617,619,621],{"name":384,"path":610,"isActive":108},"/technical-interview/tasks/what-is-react-used-for-and-what-problems-does-it-solve",{"name":455,"path":612,"isActive":108},"/technical-interview/tasks/what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":387,"path":614,"isActive":108},"/technical-interview/tasks/if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":390,"path":616,"isActive":108},"/technical-interview/tasks/there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":393,"path":618,"isActive":108},"/technical-interview/tasks/there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":396,"path":620,"isActive":108},"/technical-interview/tasks/why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":458,"path":622,"isActive":108},"/technical-interview/tasks/what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",{"title":624,"list":625,"isOpened":108},"Алгоритмы",[626,628],{"name":419,"path":627,"isActive":108},"/technical-interview/tasks/what-is-algorithmic-complexity",{"name":422,"path":629,"isActive":108},"/technical-interview/tasks/what-is-the-algorithmic-complexity-of-quick-sort",{"title":631,"list":632,"isOpened":108},"Дебаггинг",[633],{"name":399,"path":634,"isActive":108},"/technical-interview/tasks/how-can-diagnose-and-fix-unwanted-background-color-changes-when-clicking-on-a-button-if-the-source-code-of-the-site-is-confusing-and-inaccessible-to-direct-reading",{"title":636,"list":637,"isOpened":108},"Компьютерные сети",[638,640,642,644,646,648,650,652,654,656,658,660,662,664,666,668,670,672,674,676],{"name":246,"path":639,"isActive":108},"/technical-interview/tasks/how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":449,"path":641,"isActive":108},"/technical-interview/tasks/what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":249,"path":643,"isActive":108},"/technical-interview/tasks/how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":252,"path":645,"isActive":108},"/technical-interview/tasks/how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":255,"path":647,"isActive":108},"/technical-interview/tasks/key-differences-between-tcp-and-udp",{"name":258,"path":649,"isActive":108},"/technical-interview/tasks/tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":261,"path":651,"isActive":108},"/technical-interview/tasks/what-is-http-and-what-does-it-consist-of",{"name":264,"path":653,"isActive":108},"/technical-interview/tasks/what-are-http-headers-and-why-do-we-need-them",{"name":267,"path":655,"isActive":108},"/technical-interview/tasks/what-are-http-parameters",{"name":270,"path":657,"isActive":108},"/technical-interview/tasks/where-is-the-html-code-located-in-the-http-response-structure",{"name":276,"path":659,"isActive":108},"/technical-interview/tasks/what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":279,"path":661,"isActive":108},"/technical-interview/tasks/the-user-is-logged-in-on-the-website-how-does-the-server-know-that-i-am-an-authorized-user-when-the-user-logs-in-again",{"name":282,"path":663,"isActive":108},"/technical-interview/tasks/what-is-a-cookie",{"name":285,"path":665,"isActive":108},"/technical-interview/tasks/who-initiates-the-cookie-recording-in-the-browser",{"name":288,"path":667,"isActive":108},"/technical-interview/tasks/is-it-possible-to-manage-cookies-from-the-client-browser",{"name":446,"path":669,"isActive":108},"/technical-interview/tasks/is-it-true-that-an-attacker-who-controls-a-router-and-listens-to-traffic-can-obtain-logins-and-passwords-from-websites-that-a-client-visits",{"name":297,"path":671,"isActive":108},"/technical-interview/tasks/is-everything-that-goes-through-https-secure",{"name":300,"path":673,"isActive":108},"/technical-interview/tasks/all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":303,"path":675,"isActive":108},"/technical-interview/tasks/there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":428,"path":677,"isActive":108},"/technical-interview/tasks/how-can-a-user-be-authorized-on-a-website",{"title":679,"list":680,"isOpened":108},"Отрисовка в браузере",[681,683,685,687,689,691],{"name":309,"path":682,"isActive":108},"/technical-interview/tasks/what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":306,"path":684,"isActive":108},"/technical-interview/tasks/how-the-browser-parses-javascript-and-images-when-rendering",{"name":312,"path":686,"isActive":108},"/technical-interview/tasks/what-is-blocking-the-page-rendering-in-the-browser",{"name":315,"path":688,"isActive":108},"/technical-interview/tasks/what-is-dom-in-a-browser-what-is-cssom",{"name":318,"path":690,"isActive":108},"/technical-interview/tasks/what-are-nodes-in-the-dom",{"name":321,"path":692,"isActive":108},"/technical-interview/tasks/what-does-cssom-consist-of",{"title":694,"list":695,"isOpened":108},"Ревью кода",[696],{"name":410,"path":697,"isActive":108},"/technical-interview/tasks/how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"title":699,"list":700,"isOpened":108},"Теория вероятности",[701,703,705],{"name":434,"path":702,"isActive":108},"/technical-interview/tasks/there-are-three-people-in-the-room-what-is-the-probability-that-at-least-two-of-them-are-of-the-same-sex-that-is-two-or-more",{"name":437,"path":704,"isActive":108},"/technical-interview/tasks/there-is-a-coin-it-is-tossed-five-times-in-a-row-each-time-it-is-recorded-whether-it-lands-on-heads-or-tails-how-many-different-sequences-of-heads-and-tails-can-be-obtained",{"name":440,"path":706,"isActive":108},"/technical-interview/tasks/how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"cooperation":708,"copyright":711,"reportError":712,"socialNetwork":714},{"link":709,"title":710},"https://t.me/baurinanton","Сотрудничество","© “GOOD WEB JOB!”",{"label":713,"link":709},"Сообщить об ошибке",{"label":715,"socialNetworkList":716},"Мы в соцсетях:",[717,720,723],{"icon":19,"link":718,"title":719},"https://max.ru/u/f9LHodD0cOKMaukdnnahTeL5pwvjrPfUaZ4S8_1rsNy9I9qsmc9Ar3kP_y8","Max",{"icon":721,"link":709,"title":722},"ic:baseline-telegram","Telegram",{"icon":724,"link":725,"title":726},"ri:vk-fill","https://vk.com/baurinanton","VK",{"data":728,"body":729},{},{"type":730,"children":731},"root",[732],{"type":733,"tag":734,"props":735,"children":736},"element","p",{},[737],{"type":738,"value":120},"text",{"data":740,"body":741},{},{"type":730,"children":742},[743],{"type":733,"tag":734,"props":744,"children":745},{},[746],{"type":738,"value":107},{"data":748,"body":749},{},{"type":730,"children":750},[751],{"type":733,"tag":734,"props":752,"children":753},{},[754],{"type":738,"value":117},{"data":756,"body":757},{},{"type":730,"children":758},[759],{"type":733,"tag":734,"props":760,"children":761},{},[762],{"type":738,"value":111},{"data":764,"body":765},{},{"type":730,"children":766},[767],{"type":733,"tag":734,"props":768,"children":769},{},[770],{"type":738,"value":114},{"data":772,"body":773},{},{"type":730,"children":774},[775],{"type":733,"tag":734,"props":776,"children":777},{},[778],{"type":738,"value":118},{"data":780,"body":781},{},{"type":730,"children":782},[783],{"type":733,"tag":734,"props":784,"children":785},{},[786,792],{"type":733,"tag":787,"props":788,"children":789},"strong",{},[790],{"type":738,"value":791},"Правильный ответ: 2",{"type":738,"value":793}," - Git Flow, GitHub Flow, GitLab Flow, Trunk-Based Development",{"data":795,"body":796},{},{"type":730,"children":797},[798,830,835],{"type":733,"tag":734,"props":799,"children":800},{},[801,803,810,812,816,818,821,823,828],{"type":738,"value":802},"Стратегия ветвления (branching strategy) — это набор командных соглашений о том, какие ветки создаются, как и когда в них вносятся изменения, какими правилами сопровождается проверка (ревью, тесты), и как изменения попадают в основную ветку (",{"type":733,"tag":804,"props":805,"children":807},"code",{"className":806},[],[808],{"type":738,"value":809},"main",{"type":738,"value":811},") и в релиз.",{"type":733,"tag":813,"props":814,"children":815},"br",{},[],{"type":738,"value":817},"\nЦель стратегии — сделать совместную работу предсказуемой: уменьшить конфликты при слиянии, сократить риск “сломать” продукт, обеспечить прозрачный путь от задачи до релиза.",{"type":733,"tag":813,"props":819,"children":820},{},[],{"type":738,"value":822},"\nПрактически любая стратегия ветвления тесно связана с Pull Request / Merge Request, а также с CI (автоматические сборки и тесты) и правилами защиты веток (например, запрет прямых push в ",{"type":733,"tag":804,"props":824,"children":826},{"className":825},[],[827],{"type":738,"value":809},{"type":738,"value":829},").",{"type":733,"tag":734,"props":831,"children":832},{},[833],{"type":738,"value":834},"Типовые элементы стратегии:",{"type":733,"tag":836,"props":837,"children":838},"ul",{},[839,860,873,878],{"type":733,"tag":840,"props":841,"children":842},"li",{},[843,845,850,852,858],{"type":738,"value":844},"Основная ветка: обычно ",{"type":733,"tag":804,"props":846,"children":848},{"className":847},[],[849],{"type":738,"value":809},{"type":738,"value":851}," (иногда ",{"type":733,"tag":804,"props":853,"children":855},{"className":854},[],[856],{"type":738,"value":857},"master",{"type":738,"value":859}," в старых проектах), является “источником истины” и базой для интеграции.",{"type":733,"tag":840,"props":861,"children":862},{},[863,865,871],{"type":738,"value":864},"Ветки изменений: чаще всего ",{"type":733,"tag":804,"props":866,"children":868},{"className":867},[],[869],{"type":738,"value":870},"feature/*",{"type":738,"value":872}," или ветки задач, создаются на время разработки конкретного изменения.",{"type":733,"tag":840,"props":874,"children":875},{},[876],{"type":738,"value":877},"Механизм интеграции: merge (обычный), squash merge (слияние с “уплотнением” коммитов), rebase (перенос коммитов поверх свежей базы).",{"type":733,"tag":840,"props":879,"children":880},{},[881,883,889,891,897],{"type":738,"value":882},"Механизм релизов: теги (",{"type":733,"tag":804,"props":884,"children":886},{"className":885},[],[887],{"type":738,"value":888},"v1.2.0",{"type":738,"value":890},"), релизные ветки (",{"type":733,"tag":804,"props":892,"children":894},{"className":893},[],[895],{"type":738,"value":896},"release/*",{"type":738,"value":898},"), либо “релиз из main” при достаточной автоматизации.",{"data":900,"body":901},{},{"type":730,"children":902},[903],{"type":733,"tag":734,"props":904,"children":905},{},[906],{"type":738,"value":18},{"data":908,"body":909},{},{"type":730,"children":910},[911],{"type":733,"tag":734,"props":912,"children":913},{},[914],{"type":738,"value":26},{"data":916,"body":917},{},{"type":730,"children":918},[919,929,1037,1042,1054,1059,1072,1077],{"type":733,"tag":734,"props":920,"children":921},{},[922,924,927],{"type":738,"value":923},"Gitflow — стратегия, где помимо основной ветки часто существуют ещё несколько долгоживущих веток и отдельные ветки под релизы и срочные исправления.",{"type":733,"tag":813,"props":925,"children":926},{},[],{"type":738,"value":928},"\nКлассическая модель включает:",{"type":733,"tag":836,"props":930,"children":931},{},[932,942,953,977,1007],{"type":733,"tag":840,"props":933,"children":934},{},[935,940],{"type":733,"tag":804,"props":936,"children":938},{"className":937},[],[939],{"type":738,"value":809},{"type":738,"value":941},": содержит релизы (часто помеченные тегами версий).",{"type":733,"tag":840,"props":943,"children":944},{},[945,951],{"type":733,"tag":804,"props":946,"children":948},{"className":947},[],[949],{"type":738,"value":950},"develop",{"type":738,"value":952},": интеграционная ветка, куда сливаются готовые фичи перед релизом.",{"type":733,"tag":840,"props":954,"children":955},{},[956,961,963,968,970,975],{"type":733,"tag":804,"props":957,"children":959},{"className":958},[],[960],{"type":738,"value":870},{"type":738,"value":962},": ветки под отдельные задачи/функции, создаются от ",{"type":733,"tag":804,"props":964,"children":966},{"className":965},[],[967],{"type":738,"value":950},{"type":738,"value":969}," и затем вливаются обратно в ",{"type":733,"tag":804,"props":971,"children":973},{"className":972},[],[974],{"type":738,"value":950},{"type":738,"value":976},".",{"type":733,"tag":840,"props":978,"children":979},{},[980,985,987,992,994,999,1001,1006],{"type":733,"tag":804,"props":981,"children":983},{"className":982},[],[984],{"type":738,"value":896},{"type":738,"value":986},": ветки подготовки релиза, создаются от ",{"type":733,"tag":804,"props":988,"children":990},{"className":989},[],[991],{"type":738,"value":950},{"type":738,"value":993},", затем вливаются в ",{"type":733,"tag":804,"props":995,"children":997},{"className":996},[],[998],{"type":738,"value":809},{"type":738,"value":1000}," и обратно в ",{"type":733,"tag":804,"props":1002,"children":1004},{"className":1003},[],[1005],{"type":738,"value":950},{"type":738,"value":976},{"type":733,"tag":840,"props":1008,"children":1009},{},[1010,1016,1018,1023,1024,1029,1031,1036],{"type":733,"tag":804,"props":1011,"children":1013},{"className":1012},[],[1014],{"type":738,"value":1015},"hotfix/*",{"type":738,"value":1017},": ветки срочных исправлений, создаются от ",{"type":733,"tag":804,"props":1019,"children":1021},{"className":1020},[],[1022],{"type":738,"value":809},{"type":738,"value":993},{"type":733,"tag":804,"props":1025,"children":1027},{"className":1026},[],[1028],{"type":738,"value":809},{"type":738,"value":1030}," и ",{"type":733,"tag":804,"props":1032,"children":1034},{"className":1033},[],[1035],{"type":738,"value":950},{"type":738,"value":976},{"type":733,"tag":734,"props":1038,"children":1039},{},[1040],{"type":738,"value":1041},"Схема (упрощённо):",{"type":733,"tag":1043,"props":1044,"children":1048},"pre",{"className":1045,"code":1047,"language":738},[1046],"language-text","main:     o---------o-----------o------->  (релизы, теги)\n           \\         \\         /\nrelease:     \\---o----\\---o---/          (подготовка релиза)\n              \\        \\     /\ndevelop:        o---o---o---o---------->  (интеграция фич)\n                 \\       \\\nfeature/*:         o---o   o---o         (работа по задачам)\nhotfix/* (от main):     o---o            (срочная правка)\n",[1049],{"type":733,"tag":804,"props":1050,"children":1052},{"__ignoreMap":1051},"",[1053],{"type":738,"value":1047},{"type":733,"tag":734,"props":1055,"children":1056},{},[1057],{"type":738,"value":1058},"Когда Gitflow подходит:",{"type":733,"tag":836,"props":1060,"children":1061},{},[1062,1067],{"type":733,"tag":840,"props":1063,"children":1064},{},[1065],{"type":738,"value":1066},"Релизы выходят по расписанию и требуется отдельная “фаза стабилизации”.",{"type":733,"tag":840,"props":1068,"children":1069},{},[1070],{"type":738,"value":1071},"Требуется поддержка релизных линий (например, исправления для уже выпущенной версии).",{"type":733,"tag":734,"props":1073,"children":1074},{},[1075],{"type":738,"value":1076},"Когда Gitflow создаёт сложности:",{"type":733,"tag":836,"props":1078,"children":1079},{},[1080],{"type":733,"tag":840,"props":1081,"children":1082},{},[1083],{"type":738,"value":1084},"При частых релизах и сильном упоре на непрерывную интеграцию, так как усложняются правила и увеличивается число слияний между долгоживущими ветками.",{"data":1086,"body":1087},{},{"type":730,"children":1088},[1089,1106,1111,1154,1159],{"type":733,"tag":734,"props":1090,"children":1091},{},[1092,1094,1099,1101,1104],{"type":738,"value":1093},"GitLab Flow часто рассматривается как практический набор соглашений, который может быть как простым (feature branches → merge в ",{"type":733,"tag":804,"props":1095,"children":1097},{"className":1096},[],[1098],{"type":738,"value":809},{"type":738,"value":1100},"), так и более сложным (релизные ветки, ветки окружений).",{"type":733,"tag":813,"props":1102,"children":1103},{},[],{"type":738,"value":1105},"\nВажная идея: стратегия ветвления должна соответствовать тому, как реально выполняется поставка (delivery) и через какие окружения проходит релиз.",{"type":733,"tag":734,"props":1107,"children":1108},{},[1109],{"type":738,"value":1110},"Два распространённых варианта:",{"type":733,"tag":836,"props":1112,"children":1113},{},[1114,1126],{"type":733,"tag":840,"props":1115,"children":1116},{},[1117,1119,1124],{"type":738,"value":1118},"“Простой”: каждая задача делается в отдельной ветке и вливается в ",{"type":733,"tag":804,"props":1120,"children":1122},{"className":1121},[],[1123],{"type":738,"value":809},{"type":738,"value":1125}," через Merge Request.",{"type":733,"tag":840,"props":1127,"children":1128},{},[1129,1131,1137,1139,1145,1146,1152],{"type":738,"value":1130},"“По окружениям”: существуют ветки, отражающие окружения (например, ",{"type":733,"tag":804,"props":1132,"children":1134},{"className":1133},[],[1135],{"type":738,"value":1136},"test",{"type":738,"value":1138},", ",{"type":733,"tag":804,"props":1140,"children":1142},{"className":1141},[],[1143],{"type":738,"value":1144},"staging",{"type":738,"value":1138},{"type":733,"tag":804,"props":1147,"children":1149},{"className":1148},[],[1150],{"type":738,"value":1151},"production",{"type":738,"value":1153},"), и релиз-кандидаты “продвигаются” между ветками.",{"type":733,"tag":734,"props":1155,"children":1156},{},[1157],{"type":738,"value":1158},"Схема “ветки по окружениям” (упрощённо):",{"type":733,"tag":1043,"props":1160,"children":1163},{"className":1161,"code":1162,"language":738},[1046],"main:      o---o---o---o-------------------->\n                 \\\ntest:             o---o---(проверки)-------->\n                       \\\nstaging:                 o---(приёмка)------->\n                             \\\nproduction:                   o---(деплой)-->\n",[1164],{"type":733,"tag":804,"props":1165,"children":1166},{"__ignoreMap":1051},[1167],{"type":738,"value":1162},{"data":1169,"body":1170},{},{"type":730,"children":1171},[1172,1196,1201,1251,1256,1265,1270,1283,1288],{"type":733,"tag":734,"props":1173,"children":1174},{},[1175,1177,1182,1184,1187,1189,1194],{"type":738,"value":1176},"GitHub Flow — облегчённый workflow, ориентированный на короткоживущие ветки: “ветка под изменение → Pull Request → проверки и ревью → merge в ",{"type":733,"tag":804,"props":1178,"children":1180},{"className":1179},[],[1181],{"type":738,"value":809},{"type":738,"value":1183}," → удаление ветки”.",{"type":733,"tag":813,"props":1185,"children":1186},{},[],{"type":738,"value":1188},"\nЭто подходит для проектов, где ",{"type":733,"tag":804,"props":1190,"children":1192},{"className":1191},[],[1193],{"type":738,"value":809},{"type":738,"value":1195}," старается оставаться в состоянии “готово к выкладке” (при наличии автоматических проверок).",{"type":733,"tag":734,"props":1197,"children":1198},{},[1199],{"type":738,"value":1200},"Ключевые шаги GitHub Flow:",{"type":733,"tag":1202,"props":1203,"children":1204},"ol",{},[1205,1224,1229,1234,1239],{"type":733,"tag":840,"props":1206,"children":1207},{},[1208,1210,1215,1217,1223],{"type":738,"value":1209},"Создание новой ветки от ",{"type":733,"tag":804,"props":1211,"children":1213},{"className":1212},[],[1214],{"type":738,"value":809},{"type":738,"value":1216}," с коротким описательным именем (например, ",{"type":733,"tag":804,"props":1218,"children":1220},{"className":1219},[],[1221],{"type":738,"value":1222},"fix-header-layout",{"type":738,"value":829},{"type":733,"tag":840,"props":1225,"children":1226},{},[1227],{"type":738,"value":1228},"Частые небольшие коммиты в ветке.",{"type":733,"tag":840,"props":1230,"children":1231},{},[1232],{"type":738,"value":1233},"Открытие Pull Request для обсуждения и ревью.",{"type":733,"tag":840,"props":1235,"children":1236},{},[1237],{"type":738,"value":1238},"Прохождение CI-проверок (тесты/сборка).",{"type":733,"tag":840,"props":1240,"children":1241},{},[1242,1244,1249],{"type":738,"value":1243},"Слияние в ",{"type":733,"tag":804,"props":1245,"children":1247},{"className":1246},[],[1248],{"type":738,"value":809},{"type":738,"value":1250}," и удаление ветки.",{"type":733,"tag":734,"props":1252,"children":1253},{},[1254],{"type":738,"value":1255},"Схема:",{"type":733,"tag":1043,"props":1257,"children":1260},{"className":1258,"code":1259,"language":738},[1046],"main:      o----o----------------o------>\n               \\                /\nfeature/x:       o----o----o----\n",[1261],{"type":733,"tag":804,"props":1262,"children":1263},{"__ignoreMap":1051},[1264],{"type":738,"value":1259},{"type":733,"tag":734,"props":1266,"children":1267},{},[1268],{"type":738,"value":1269},"Преимущества:",{"type":733,"tag":836,"props":1271,"children":1272},{},[1273,1278],{"type":733,"tag":840,"props":1274,"children":1275},{},[1276],{"type":738,"value":1277},"Простые правила, легко начать применять в небольшой команде.",{"type":733,"tag":840,"props":1279,"children":1280},{},[1281],{"type":738,"value":1282},"Хорошо сочетается с CI/CD и частыми релизами.",{"type":733,"tag":734,"props":1284,"children":1285},{},[1286],{"type":738,"value":1287},"Ограничения:",{"type":733,"tag":836,"props":1289,"children":1290},{},[1291],{"type":733,"tag":840,"props":1292,"children":1293},{},[1294],{"type":738,"value":1295},"Если нужна параллельная поддержка множества версий, может потребоваться дополнительный слой правил (например, релизные ветки или теги плюс строгая политика backport).",{"data":1297,"body":1298},{},{"type":730,"children":1299},[1300],{"type":733,"tag":734,"props":1301,"children":1302},{},[1303],{"type":738,"value":50},{"data":1305,"body":1306},{},{"type":730,"children":1307},[1308,1325,1330,1360,1364],{"type":733,"tag":734,"props":1309,"children":1310},{},[1311,1313,1318,1320,1323],{"type":738,"value":1312},"Trunk-Based Development — подход, где основная ветка (",{"type":733,"tag":804,"props":1314,"children":1316},{"className":1315},[],[1317],{"type":738,"value":809},{"type":738,"value":1319},", “trunk”) является центром разработки: изменения вливаются туда часто, малыми порциями, а ветки живут недолго.",{"type":733,"tag":813,"props":1321,"children":1322},{},[],{"type":738,"value":1324},"\nГлавная цель — поддерживать непрерывную интеграцию: чем меньше и чаще изменения, тем легче их проверять, тем меньше конфликтов и тем быстрее обратная связь от тестов.",{"type":733,"tag":734,"props":1326,"children":1327},{},[1328],{"type":738,"value":1329},"Ключевые принципы TBD:",{"type":733,"tag":836,"props":1331,"children":1332},{},[1333,1343,1355],{"type":733,"tag":840,"props":1334,"children":1335},{},[1336,1341],{"type":733,"tag":804,"props":1337,"children":1339},{"className":1338},[],[1340],{"type":738,"value":809},{"type":738,"value":1342}," должен оставаться “зелёным”: сборка и тесты проходят, состояние пригодно для выпуска.",{"type":733,"tag":840,"props":1344,"children":1345},{},[1346,1348,1353],{"type":738,"value":1347},"Короткоживущие ветки (часто 1–2 дня) или даже коммиты напрямую в ",{"type":733,"tag":804,"props":1349,"children":1351},{"className":1350},[],[1352],{"type":738,"value":809},{"type":738,"value":1354}," при строгих правилах и автоматизации.",{"type":733,"tag":840,"props":1356,"children":1357},{},[1358],{"type":738,"value":1359},"Практика feature flags (флаги функций) помогает сливать код, который ещё не должен быть активен для пользователей.",{"type":733,"tag":734,"props":1361,"children":1362},{},[1363],{"type":738,"value":1255},{"type":733,"tag":1043,"props":1365,"children":1368},{"className":1366,"code":1367,"language":738},[1046],"main (trunk): o--o--o--o--o--o---------------->\n               \\        /\nshort branch:    o--o--o    (жизнь 1-2 дня)\n",[1369],{"type":733,"tag":804,"props":1370,"children":1371},{"__ignoreMap":1051},[1372],{"type":738,"value":1367},{"data":1374,"body":1375},{},{"type":730,"children":1376},[1377],{"type":733,"tag":734,"props":1378,"children":1379},{},[1380],{"type":738,"value":64},{"data":1382,"body":1383},{},{"type":730,"children":1384},[1385,1394,1399],{"type":733,"tag":1043,"props":1386,"children":1389},{"className":1387,"code":1388,"language":738},[1046],"# 1) Переход в основную ветку и обновление\ngit checkout main\ngit pull --ff-only\n\n# 2) Создание ветки под задачу\ngit checkout -b feature/add-login-form\n\n# 3) Работа и фиксация результата\ngit add .\ngit commit -m \"Add login form markup\"\n\n# 4) Отправка ветки на сервер\ngit push -u origin feature/add-login-form\n\n# 5) Далее создаётся Pull Request / Merge Request в интерфейсе платформы\n",[1390],{"type":733,"tag":804,"props":1391,"children":1392},{"__ignoreMap":1051},[1393],{"type":738,"value":1388},{"type":733,"tag":734,"props":1395,"children":1396},{},[1397],{"type":738,"value":1398},"Рекомендации к качеству изменений:",{"type":733,"tag":836,"props":1400,"children":1401},{},[1402,1407,1412],{"type":733,"tag":840,"props":1403,"children":1404},{},[1405],{"type":738,"value":1406},"Следует стремиться к небольшим Pull/Merge Request, чтобы ревью было быстрым и точным.",{"type":733,"tag":840,"props":1408,"children":1409},{},[1410],{"type":738,"value":1411},"Следует включать автоматические проверки (линтеры, тесты, сборка) как обязательные условия перед merge.",{"type":733,"tag":840,"props":1413,"children":1414},{},[1415,1417,1422],{"type":738,"value":1416},"Следует защищать ",{"type":733,"tag":804,"props":1418,"children":1420},{"className":1419},[],[1421],{"type":738,"value":809},{"type":738,"value":1423}," от прямых push, если команда работает через PR/MR.",{"data":1425,"body":1426},{},{"type":730,"children":1427},[1428],{"type":733,"tag":734,"props":1429,"children":1430},{},[1431,1433,1439],{"type":738,"value":1432},"Команда ",{"type":733,"tag":804,"props":1434,"children":1436},{"className":1435},[],[1437],{"type":738,"value":1438},"git tag -a v1.4.0 -m \"Release 1.4.0\"",{"type":738,"value":1440}," показывает, как фиксировать релиз “меткой”, чтобы можно было однозначно найти состояние кода релизной версии.",{"data":1442,"body":1443},{},{"type":730,"children":1444},[1445],{"type":733,"tag":1043,"props":1446,"children":1449},{"className":1447,"code":1448,"language":738},[1046],"# feature-ветка создаётся от develop\ngit checkout develop\ngit pull --ff-only\ngit checkout -b feature/payment-validation\n\n# после завершения feature вливается в develop\ngit checkout develop\ngit merge --no-ff feature/payment-validation\ngit push\n\n# создаётся релизная ветка\ngit checkout -b release/1.4.0\ngit push -u origin release/1.4.0\n\n# в релизной ветке выполняются только правки для релиза\ngit commit -am \"Fix release notes\"\ngit push\n\n# релиз: merge в main + тег версии\ngit checkout main\ngit merge --no-ff release/1.4.0\ngit tag -a v1.4.0 -m \"Release 1.4.0\"\ngit push --follow-tags\n\n# затем релизная ветка вливается обратно в develop\ngit checkout develop\ngit merge --no-ff release/1.4.0\ngit push\n",[1450],{"type":733,"tag":804,"props":1451,"children":1452},{"__ignoreMap":1051},[1453],{"type":738,"value":1448},{"data":1455,"body":1456},{},{"type":730,"children":1457},[1458,1467],{"type":733,"tag":1043,"props":1459,"children":1462},{"className":1460,"code":1461,"language":738},[1046],"// Пример feature flag (псевдокод)\nconst flags = {\n  newCheckout: false\n}\n\nfunction renderCheckout() {\n  if (flags.newCheckout) {\n    return renderNewCheckout()\n  }\n  return renderOldCheckout()\n}\n",[1463],{"type":733,"tag":804,"props":1464,"children":1465},{"__ignoreMap":1051},[1466],{"type":738,"value":1461},{"type":733,"tag":734,"props":1468,"children":1469},{},[1470,1472,1477],{"type":738,"value":1471},"Смысл: код новой функциональности может быть слит в ",{"type":733,"tag":804,"props":1473,"children":1475},{"className":1474},[],[1476],{"type":738,"value":809},{"type":738,"value":1478},", но для пользователей он остаётся выключенным до готовности, что облегчает частую интеграцию и уменьшает размер “опасных” релизов.",{"data":1480,"body":1481},{},{"type":730,"children":1482},[1483],{"type":733,"tag":734,"props":1484,"children":1485},{},[1486,1488,1493],{"type":738,"value":1487},"Если автоматические тесты отсутствуют или нестабильны, подходы с частыми слияниями (GitHub Flow, TBD) начинают приносить больше риска, чем пользы, так как ошибки быстрее попадают в ",{"type":733,"tag":804,"props":1489,"children":1491},{"className":1490},[],[1492],{"type":738,"value":809},{"type":738,"value":976},{"data":1495,"body":1496},{},{"type":730,"children":1497},[1498],{"type":733,"tag":734,"props":1499,"children":1500},{},[1501,1503,1508,1510,1515],{"type":738,"value":1502},"Итого: правильный вариант: 2, так как он перечисляет распространённые стратегии ветвления Git: Gitflow (ветки develop/release/hotfix), GitHub Flow (короткие ветки и PR в ",{"type":733,"tag":804,"props":1504,"children":1506},{"className":1505},[],[1507],{"type":738,"value":809},{"type":738,"value":1509},"), GitLab Flow (набор стратегий, включая ветки окружений) и Trunk-Based Development (частые небольшие слияния в ",{"type":733,"tag":804,"props":1511,"children":1513},{"className":1512},[],[1514],{"type":738,"value":809},{"type":738,"value":1516}," при опоре на CI и флаги функций).",{"data":1518,"body":1519},{},{"type":730,"children":1520},[1521,1526,1544,1549],{"type":733,"tag":734,"props":1522,"children":1523},{},[1524],{"type":738,"value":1525},"Выбор стратегии удобно делать по трём вопросам:",{"type":733,"tag":836,"props":1527,"children":1528},{},[1529,1534,1539],{"type":733,"tag":840,"props":1530,"children":1531},{},[1532],{"type":738,"value":1533},"Как часто происходят релизы (редко по расписанию или часто/непрерывно)?",{"type":733,"tag":840,"props":1535,"children":1536},{},[1537],{"type":738,"value":1538},"Нужно ли поддерживать несколько версий параллельно?",{"type":733,"tag":840,"props":1540,"children":1541},{},[1542],{"type":738,"value":1543},"Насколько сильна автоматизация проверок (тесты, сборка, статический анализ)?",{"type":733,"tag":734,"props":1545,"children":1546},{},[1547],{"type":738,"value":1548},"Таблица для выбора:",{"type":733,"tag":1550,"props":1551,"children":1552},"table",{},[1553,1582],{"type":733,"tag":1554,"props":1555,"children":1556},"thead",{},[1557],{"type":733,"tag":1558,"props":1559,"children":1560},"tr",{},[1561,1567,1572,1577],{"type":733,"tag":1562,"props":1563,"children":1564},"th",{},[1565],{"type":738,"value":1566},"Стратегия",{"type":733,"tag":1562,"props":1568,"children":1569},{},[1570],{"type":738,"value":1571},"Основная идея",{"type":733,"tag":1562,"props":1573,"children":1574},{},[1575],{"type":738,"value":1576},"Когда подходит",{"type":733,"tag":1562,"props":1578,"children":1579},{},[1580],{"type":738,"value":1581},"Типовые сложности",{"type":733,"tag":1583,"props":1584,"children":1585},"tbody",{},[1586,1635,1667,1690],{"type":733,"tag":1558,"props":1587,"children":1588},{},[1589,1595,1625,1630],{"type":733,"tag":1590,"props":1591,"children":1592},"td",{},[1593],{"type":738,"value":1594},"Gitflow",{"type":733,"tag":1590,"props":1596,"children":1597},{},[1598,1600,1605,1606,1611,1612,1617,1618,1623],{"type":738,"value":1599},"Отдельные роли веток (",{"type":733,"tag":804,"props":1601,"children":1603},{"className":1602},[],[1604],{"type":738,"value":809},{"type":738,"value":1138},{"type":733,"tag":804,"props":1607,"children":1609},{"className":1608},[],[1610],{"type":738,"value":950},{"type":738,"value":1138},{"type":733,"tag":804,"props":1613,"children":1615},{"className":1614},[],[1616],{"type":738,"value":896},{"type":738,"value":1138},{"type":733,"tag":804,"props":1619,"children":1621},{"className":1620},[],[1622],{"type":738,"value":1015},{"type":738,"value":1624},")",{"type":733,"tag":1590,"props":1626,"children":1627},{},[1628],{"type":738,"value":1629},"Релизы по расписанию, нужна фаза стабилизации, есть поддержка релизных линий",{"type":733,"tag":1590,"props":1631,"children":1632},{},[1633],{"type":738,"value":1634},"Больше правил и слияний между долгоживущими ветками",{"type":733,"tag":1558,"props":1636,"children":1637},{},[1638,1642,1652,1657],{"type":733,"tag":1590,"props":1639,"children":1640},{},[1641],{"type":738,"value":36},{"type":733,"tag":1590,"props":1643,"children":1644},{},[1645,1647],{"type":738,"value":1646},"Короткие ветки + PR + merge в ",{"type":733,"tag":804,"props":1648,"children":1650},{"className":1649},[],[1651],{"type":738,"value":809},{"type":733,"tag":1590,"props":1653,"children":1654},{},[1655],{"type":738,"value":1656},"Веб‑сервисы и приложения с частыми релизами, простой процесс",{"type":733,"tag":1590,"props":1658,"children":1659},{},[1660,1662],{"type":738,"value":1661},"Требуется дисциплина CI и защита ",{"type":733,"tag":804,"props":1663,"children":1665},{"className":1664},[],[1666],{"type":738,"value":809},{"type":733,"tag":1558,"props":1668,"children":1669},{},[1670,1675,1680,1685],{"type":733,"tag":1590,"props":1671,"children":1672},{},[1673],{"type":738,"value":1674},"GitLab Flow",{"type":733,"tag":1590,"props":1676,"children":1677},{},[1678],{"type":738,"value":1679},"От простого “feature → main” до веток окружений/релизов",{"type":733,"tag":1590,"props":1681,"children":1682},{},[1683],{"type":738,"value":1684},"Когда ветки должны отражать поставку через окружения или версионирование",{"type":733,"tag":1590,"props":1686,"children":1687},{},[1688],{"type":738,"value":1689},"Риск ручных переносов и расхождений между ветками окружений",{"type":733,"tag":1558,"props":1691,"children":1692},{},[1693,1698,1710,1715],{"type":733,"tag":1590,"props":1694,"children":1695},{},[1696],{"type":738,"value":1697},"Trunk-Based Development",{"type":733,"tag":1590,"props":1699,"children":1700},{},[1701,1703,1708],{"type":738,"value":1702},"Частые небольшие слияния в ",{"type":733,"tag":804,"props":1704,"children":1706},{"className":1705},[],[1707],{"type":738,"value":809},{"type":738,"value":1709},", короткие ветки",{"type":733,"tag":1590,"props":1711,"children":1712},{},[1713],{"type":738,"value":1714},"Нужны быстрые релизы и сильная CI‑культура",{"type":733,"tag":1590,"props":1716,"children":1717},{},[1718,1720,1725],{"type":738,"value":1719},"При слабых тестах и без флагов функций трудно держать ",{"type":733,"tag":804,"props":1721,"children":1723},{"className":1722},[],[1724],{"type":738,"value":809},{"type":738,"value":1726}," стабильным",1775735655417]