[{"data":1,"prerenderedAt":1402},["ShallowReactive",2],{"$f1G1mD5AKDU27gTK_QV7EiB24vDEyaMhaUdyRgbSIl3U":3,"$fMMUdSFktwQFqMVGPrTtt3EC5yheBp7PzwIqznamFcMo":105,"$f1Prj1xEczHja_-L7FyIGgRHd5_cSWHo7r6AE5aheAik":108,"$fc0LoAJgqXDLbKKd2JS_NpM4SuzBK8EycUXINSg09CKU":433,"$fM3ea55k6lKMPOTM84llDB26VSQDVVbxiQuSBFQw9P_c":436,"$fI5fDmvm-5tr9wcH0eHaKZa1j3y_FQIQaHHPqbZxAHJE":680,"mdc--d26nsf-key":700,"mdc--gr7a8a-key":712,"mdc-6pp5v5-key":746,"mdc-se1hul-key":755,"mdc--ni78qz-key":796,"mdc-sodoc7-key":804,"mdc--e5zgrt-key":843,"mdc--khc5kb-key":851,"mdc-3nx6ok-key":880,"mdc--mk4aie-key":897,"mdc-zaxuv4-key":906,"mdc-oirlh0-key":944,"mdc-jjlz5-key":993,"mdc--hcvzff-key":1006,"mdc--yvbelj-key":1020,"mdc--x4n4g8-key":1108,"mdc-tmq23d-key":1210,"mdc--i77u46-key":1246},{"content":4,"quizQuestionContent":75,"type":94,"pageMeta":95},[5,9,13,16,20,23,27,31,35,38,41,45,48,51,55,58,62,65,69,72],{"id":6,"value":7,"isTypeH1":8},"1924","Git: коммит запушен не в ту ветку — что делать",true,{"id":10,"value":11,"anchor":12,"isTypeH2":8},"4439","Теория: почему это случается","theory-why-it-happens",{"id":14,"value":15,"isTypeParagraph":8},"10211","Git хранит изменения как коммиты, а ветка — это указатель на последний коммит в цепочке.\nОшибка “закоммитил/запушил не в ту ветку” означает, что указатель неправильной ветки теперь указывает на коммит, который логически должен находиться в другой ветке.\n\nПрактически всегда задача распадается на две части:\n- Перенести “правильный” коммит в “правильную” ветку (без потери изменений).\n- Убрать этот коммит из “неправильной” ветки (безопасно для команды).",{"id":17,"value":18,"anchor":19,"isTypeH2":8},"4440","Теория: перенос коммита","theory-moving-commit",{"id":21,"value":22,"isTypeParagraph":8},"10212","Команда `git cherry-pick` берёт выбранный коммит и применяет его изменения поверх текущей ветки, создавая новый коммит.\nЭто подходит для ситуации “коммит сделан не в ту ветку”, потому что переносится один (или несколько) конкретных коммитов без слияния всей ветки.\n\n```git fetch origin\n# 1) Найти хэш коммита\ngit log --oneline --decorate --graph --all\n\n# допустим, нужный коммит: a1b2c3d\n\n# 2) Перейти в правильную ветку\ngit switch правильная-ветка\n# или: git checkout правильная-ветка\n\n# 3) Применить коммит поверх правильной ветки\ngit cherry-pick a1b2c3d\n\n# 4) Отправить правильную ветку на сервер\ngit push origin правильная-ветка\n```",{"id":24,"description":25,"titleAlert":26,"isTypeAlertInfo":8},"667","При cherry-pick создаётся новый коммит с новым хэшем, даже если изменения совпадают (это ожидаемо, так как история веток различается).\n",null,{"id":28,"value":29,"anchor":30,"isTypeH2":8},"4441","Теория: как убрать коммит из неправильной ветки","theory-remove-from-wrong-branch",{"id":32,"value":33,"anchor":34,"isTypeH3":8},"4452","Вариант 1 (безопасный для общей ветки): revert","variant-1-revert",{"id":36,"value":37,"isTypeParagraph":8},"10213","`git revert` не удаляет коммит из истории, а создаёт новый коммит, который “отменяет” изменения выбранного коммита.\nИз-за этого `git revert` обычно безопаснее на ветках, которые уже могли забрать другие участники: история не переписывается, а дополняется “коммитом-отменой”.\n\nПример (отменить один ошибочный коммит в неправильной ветке):\n```\n# перейти в неправильную ветку\ngit switch неправильная-ветка\n\n# создать коммит, отменяющий изменения коммита a1b2c3d\ngit revert a1b2c3d\n\n# отправить в удалённую неправильную ветку\ngit push origin неправильная-ветка\n```",{"id":39,"description":40,"titleAlert":26,"isTypeAlertWarning":8},"726","Если ошибочный коммит был merge-коммитом, для revert может потребоваться указание “главной линии” через опцию `-m`, так как при откате merge необходимо выбрать родительскую линию.",{"id":42,"value":43,"anchor":44,"isTypeH3":8},"4453","Вариант 2 (переписывание истории): reset + force-with-lease","variant-2-reset-force-with-lease",{"id":46,"value":47,"isTypeParagraph":8},"10214","`git reset` может переместить указатель `HEAD` на другой коммит, тем самым “убрав” коммиты из текущей ветки (для локальной истории).\nЕсли такой “откат” уже был отправлен на сервер, то для синхронизации удалённой ветки потребуется принудительная отправка; более безопасным вариантом считается `--force-with-lease`, так как выполняется проверка, что удалённая ветка не изменилась неожиданным образом.\n\nЭтот сценарий допустим только если точно известно, что никто не успел взять себе ветку, либо есть явная договорённость в команде переписать историю.\n\nПример (удалить последний коммит из неправильной ветки):\n```\n# перейти в неправильную ветку\ngit switch неправильная-ветка\n\n# посмотреть историю и выбрать коммит, на который нужно откатиться\ngit log --oneline\n\n# откатить ветку на 1 коммит назад (пример)\ngit reset --hard HEAD~1\n\n# принудительно обновить удалённую ветку с защитной проверкой\ngit push --force-with-lease origin неправильная-ветка\n```",{"id":49,"description":50,"titleAlert":26,"isTypeAlertWarning":8},"727","`git reset --hard` уничтожает незакоммиченные изменения в рабочей директории, поэтому перед выполнением необходимо убедиться, что несохранённой работы нет (или она сохранена отдельно).\n",{"id":52,"value":53,"anchor":54,"isTypeH2":8},"4442","Мини-схема: что происходит с историей","history-scheme",{"id":56,"value":57,"isTypeParagraph":8},"10215","```\n# Было (ошибка: коммит X попал в wrong):\nmain:   A---B---C\nwrong:          \\\n                X\n\n# Цель:\nmain:   A---B---C---X'    (X' создан через cherry-pick)\nwrong:  A---B---C---R     (R создан через revert X)\n# или wrong: A---B---C    (через reset + force-with-lease, если допустимо)\n```\n",{"id":59,"value":60,"anchor":61,"isTypeH2":8},"4443","Таблица: revert vs reset","table-revert-vs-reset",{"id":63,"value":64,"isTypeParagraph":8},"10216","| Команда | Что делает | Когда уместно |\n|---|---|---|\n| `git revert \u003Ccommit>` | Создаёт новый коммит, который отменяет изменения указанного коммита | Когда ветка общая/опубликована и нельзя переписывать историю |\n| `git reset --hard \u003Ccommit>` | Перемещает `HEAD` на указанный коммит, фактически “убирая” коммиты из текущей ветки локально | Когда переписывание истории разрешено и согласовано; для удалённой ветки обычно требуется принудительный push |\n",{"id":66,"value":67,"anchor":68,"isTypeH2":8},"4444","Подробный “правильный” алгоритм","correct-step-by-step",{"id":70,"value":71,"isTypeParagraph":8},"10217","1) Зафиксировать хэш ошибочного коммита: достаточно `git log --oneline --decorate --graph --all`.\n2) Перенести коммит в правильную ветку через `git cherry-pick \u003Chash>`.\n3) Удалить эффект коммита из неправильной ветки:\n- Если ветка общая, необходимо выполнить `git revert \u003Chash>` и запушить результат (появится новый коммит-отмена).\n- Если ветка личная и переписывание истории допустимо, можно сделать `git reset --hard` на “правильный” базовый коммит и затем `git push --force-with-lease`.\n4) На случай ошибок (например, выполнен reset не на тот коммит) полезно помнить про reflog: reflog хранит локальную “историю перемещений” `HEAD` и ссылок и помогает найти предыдущее состояние.\n\nПример с reflog (восстановление точки, если был выполнен неверный reset):\n```\n# показать, куда раньше указывал HEAD\ngit reflog\n\n# допустим, нужно вернуться к состоянию HEAD@{3}\ngit reset --hard HEAD@{3}\n```",{"id":73,"value":74,"isTypeParagraph":8},"10218","Итого: наиболее корректно перенести изменения в нужную ветку через `git cherry-pick`, а в неправильной ветке на опубликованной истории отменить через `git revert`; переписывание истории через `git reset --hard` и `git push --force-with-lease` допустимо только при согласовании и отсутствии чужих изменений.",{"id":76,"options":77,"hint":91,"solution":92,"description":93},"1158",[78,82,85,88],{"id":79,"label":80,"isCorrect":81},"4776","Переключиться на правильную ветку, выполнить `git merge` ветки с ошибочным коммитом в правильную, затем откатить merge через `git reset --hard` и сделать принудительную отправку `git push --force` в обе ветки.",false,{"id":83,"label":84,"isCorrect":81},"4777","Удалить удалённую ветку, в которую попал коммит, затем заново запушить её из локального состояния и после этого вручную скопировать изменённые файлы в правильную ветку (без сохранения истории коммитов).\n",{"id":86,"label":87,"isCorrect":8},"4778","Найти хэш ошибочного коммита, перейти в правильную ветку и перенести коммит командой `git cherry-pick`, затем в неправильной ветке отменить изменения через `git revert` (или, если ветка точно не использовалась другими, переписать историю через `git reset` и `git push --force-with-lease`).",{"id":89,"label":90,"isCorrect":81},"4779","Оставить всё как есть в неправильной ветке, а в правильной ветке повторить изменения новым коммитом (например, через повторное редактирование файлов), чтобы не трогать историю и не выполнять команды отмены.","Для выбора корректных действий сначала необходимо определить, является ли ошибочная ветка общей (кто-то мог уже забрать изменения) или личной (изменения точно только у одного автора).","**Правильный ответ: 3** - Найти хэш ошибочного коммита, перейти в правильную ветку и перенести коммит командой `git cherry-pick`, затем в неправильной ветке отменить изменения через `git revert` (или, если ветка точно не использовалась другими, переписать историю через `git reset` и `git push --force-with-lease`).","Разрабатывал, взял закоммитил, запушил. Оказалось, что запушил не в ту ветку, точнее, коммит не в ту ветку. Какие действия?","quizQuestion",{"title":96,"description":97,"ogTitle":7,"ogDescription":97,"ogImageUrl":98,"canonical":26,"ogLocale":99,"ogSiteName":100,"ogImageType":101,"ogImageWidth":102,"ogImageHeight":103,"ogType":104,"ogUrl":26},"Исправление коммита в неправильной ветке Git","Перенос коммита, безопасная отмена, когда нужен reset и force-with-lease.","/og-image.png","ru_RU","goodwebjob.ru","image_jpeg","1200","630","article",{"siteName":106,"siteUrl":107},"GOOD WEB JOB!","https://goodwebjob.ru",{"slugs":109},[110,113,116,119,122,125,128,131,134,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,376,379,382,385,388,391,394,397,400,403,406,409,412,415,418,421,424,427,430],{"name":111,"value":112},"Теоретические задания","theoretical-tasks",{"name":114,"value":115},"Что вернёт этот код: typeof (function(){})()","what-this-code-will-return-typeof-function",{"name":117,"value":118},"С чего начать?","where-to-begin",{"name":120,"value":121},"Почему опасно писать прямо в прототипы базовых типов?","why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":123,"value":124},"Backend","backend",{"name":126,"value":127},"Frontend","frontend",{"name":129,"value":130},"Какие логические значения в console.log будут получены?","prototype-what-logical-values-will-be-received-in-console-log",{"name":132,"value":133},"Нечётные числа должны отсортироваться по возрастанию, а чётные должны остаться на своих местах","odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":135,"value":136}," Найти в массиве неповторяющиеся числа","find-non-repeating-numbers-in-an-array",{"name":138,"value":139},"arr.push(0) повлияет на массив так же, как если бы мы выполнили...","arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":141,"value":142},"Дана строка: '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":144,"value":145},"Реализовать функцию, похоже как в Jquery","implement-a-function-similar-to-jquery",{"name":147,"value":148},"Для каждого вложенного объекта нужно добавить свойство level, которое равняется числу - номер вложенности","for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":150,"value":151},"Какое значение выведет консоль с object.property?","what-value-will-the-console-output-with-object-property",{"name":153,"value":154},"Что выведется в console.log([arr[0](), arr[0]()])?","what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":156,"value":157},"Вернуть массив от 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":159,"value":160},"Необходимо проверить, являются ли две строки анаграммами друг друга","checks-whether-two-strings-are-anagrams-of-each-other",{"name":162,"value":163},"Определить, является ли слово палиндромом","determines-whether-a-word-is-a-palindrome",{"name":165,"value":166},"Есть массив, в котором лежат объекты с датами, необходимо отсортировать даты по возрастанию","there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":168,"value":169},"Реализовать функцию, принимающую аргументы \"*\", \"1\", \"b\", \"1c\" и возвращающую строку \"1*b*1c\"","implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":171,"value":172},"Дано дерево (вложенный объект), надо найти сумму всех вершин","given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":174,"value":175},"Для каждой ветви дерева записать номер вложенности данной ветви","for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":177,"value":178},"Есть слова в массиве, необходимо определить, состоят ли они из одних и тех же букв","there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":180,"value":181},"Числа от 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":183,"value":184},"Есть строка, состоящая из разных скобок, необходимо проверить, закрыты ли все","there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":186,"value":187},"Напишите функцию, который сделает из массива объект","write-a-function-that-will-make-an-object-out-of-an-array",{"name":189,"value":190},"Что выведет console.log в результате выполнения цикла while?","what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":192,"value":193},"Есть функция и объект. Напишите все известные вам способы, чтобы вывести в консоли значение 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":195,"value":196},"Что выведет консоль в случае присвоения свойства массиву по строковому отрицательному индексу?","what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":198,"value":199},"Что выведет консоль в случае удаления элемента массива с помощью оператора delete?","what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":201,"value":202},"Уникализация значений в массиве","unifying-values-in-an-array",{"name":204,"value":205},"«Расплющивание» массива","flattening-the-array",{"name":207,"value":208},"Что вернёт метод book.getUpperName()?","what-will-the-book-get-upper-name-method-return",{"name":210,"value":211},"Сжатие строк","string-compression",{"name":213,"value":214},"Что выведет консоль в случае присвоения свойства массиву по строковому положительному индексу?","what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":216,"value":217},"Что получится в результате передачи объекта как аргумента в функцию и выполнения кода?","what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":219,"value":220},"Как браузер после ввода домена понимает, откуда брать сайт?","how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":222,"value":223},"Как домен попадает в DNS в таблицу соответствия: домен – ip","how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":225,"value":226},"Как браузер решает, какое соединение ему открывать, TCP или UDP?","how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":228,"value":229},"Ключевые отличия TCP и UDP","key-differences-between-tcp-and-udp",{"name":231,"value":232},"\"TCP/IP\" - кем является TCP, а кем IP в данном случае?","tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":234,"value":235},"Что такое HTTP и из чего состоит?","what-is-http-and-what-does-it-consist-of",{"name":237,"value":238},"Что такое заголовки в HTTP и зачем они нужны?","what-are-http-headers-and-why-do-we-need-them",{"name":240,"value":241},"Что такое параметры в HTTP?","what-are-http-parameters",{"name":243,"value":244},"Где находится HTML-код в структуре HTTP-ответа?","where-is-the-html-code-located-in-the-http-response-structure",{"name":246,"value":247},"Что такое HTML?","what-is-html",{"name":249,"value":250},"Чем отличаются 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":252,"value":253},"Пользователь авторизован на сайте. Как сервер узнает об этом с последующими другими заходами, что «я – авторизованный пользователь»?","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":255,"value":256},"Что такое cookie?","what-is-a-cookie",{"name":258,"value":259},"Кто является инициатором записи cookie в браузере?","who-initiates-the-cookie-recording-in-the-browser",{"name":261,"value":262},"Есть ли возможность с клиента (с браузера) управлять cookie?","is-it-possible-to-manage-cookies-from-the-client-browser",{"name":264,"value":265},"Лайвкодинг","livecoding",{"name":267,"value":268},"Что вернёт следующий код? Object.create(null).hasOwnProperty('toString')","what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":270,"value":271},"Всё, что идет по HTTPS – оно защищено?","is-everything-that-goes-through-https-secure",{"name":273,"value":274},"Все данные зашифрованы, используется 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":276,"value":277},"Есть веб-приложение. Помимо 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":279,"value":280},"Как браузер парсит JavaScript и изображения при рендеринге?","how-the-browser-parses-javascript-and-images-when-rendering",{"name":282,"value":283},"Что происходит, когда HTTP прислал HTML? Что браузер дальше делает c HTML с учетом того, что она валидная?","what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":285,"value":286},"Что в браузере блокирует рендеринг страницы?","what-is-blocking-the-page-rendering-in-the-browser",{"name":288,"value":289},"Что такое DOM в браузере? Что такое CSSOM?","what-is-dom-in-a-browser-what-is-cssom",{"name":291,"value":292},"Что является узлами в DOM?","what-are-nodes-in-the-dom",{"name":294,"value":295},"Из чего состоит CSSOM?","what-does-cssom-consist-of",{"name":297,"value":298},"Дан HTML-код. Какой будет цвет у текста «Some dummy text»?","the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":300,"value":301},"Есть шаблон HTML и CSS кода. Какой будет цвет у текста «Таким образом, постоянное»?","there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":303,"value":304},"Есть шаблон вложенного 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":306,"value":307},"Есть шаблон вложенного HTML кода. Будет ли display:block у body влиять на span?","there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":309,"value":310},"Есть HTML код. Будет ли font-weight на span влиять?","there-is-an-html-code-will-font-weight-affect-span",{"name":312,"value":313},"Flexbox и Grid, чем отличаются друг от друга?","what-are-the-differences-between-flexbox-and-grid",{"name":315,"value":316},"Заменяют ли Flexbox и Grid друг друга?","do-flexbox-and-grid-replace-each-other",{"name":318,"value":319},"Есть CSS и JS анимация. Какая между ними разница, что быстрее, что более удобно?","there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"name":321,"value":322},"Сборник задач","tasks",{"name":324,"value":325},"Какие способы объявления функции есть в JavaScript?","what-are-the-ways-to-declare-a-function-in-javascript",{"name":327,"value":328},"Что такое this в JavaScript?","what-is-this-in-javascript",{"name":330,"value":331},"Что такое Event Loop, как работает?","what-is-an-event-loop-and-how-does-it-work",{"name":333,"value":334},"Что будет, если вызвать typeof на необъявленной переменной?","what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":336,"value":337},"Что показывает оператор typeof в JavaScript?","what-does-the-typeof-operator-show-in-javascript",{"name":339,"value":340},"Какие типы данных существует в JavaScript?","what-types-of-data-exist-in-javascript",{"name":342,"value":343},"Какую структуру использовать для хранения упорядоченного списка строк в JavaScript?","what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":345,"value":346},"Что вернет typeof для массива?","what-will-typeof-return-for-an-array",{"name":348,"value":349},"Почему оператор typeof, применённый к массиву, возвращает объект?","why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":351,"value":352},"Если нужно хранить список уникальных строк, какую структуру данных выбрать?","if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":354,"value":355},"Что возвращает typeof для new Set в JavaScript?","what-does-typeof-return-for-new-set-in-javascript",{"name":357,"value":358},"Для чего нужен React, какие он решает проблемы?","what-is-react-used-for-and-what-problems-does-it-solve",{"name":360,"value":361},"Если убрать в React VDOM/Fiber, и вручную изменять DOM, разве это не оптимально?","if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":363,"value":364},"Есть блок кода. Что в реальном DOM изменится после нажатия на кнопку?","there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":366,"value":367},"Есть код, в котором список и кнопка. Что в реальном 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":369,"value":370},"Зачем нужен Redux (Mobx/Effector)? Зачем нужен менеджер состояния? Какие проблемы решает?","why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":372,"value":373},"Как диагностировать и исправить нежелательное изменение цвета фона по клику на кнопку, если исходный код сайта запутан и недоступен для прямого чтения?","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":93,"value":375},"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":377,"value":378},"В git есть несколько вариантов слияния веток, какие? Чем отличаются?","git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":380,"value":381},"Какие существуют стратегии ветвления для работы команды? Что это такое?","what-are-the-branching-strategies-for-the-team-what-is-it",{"name":383,"value":384},"По каким характеристикам, ревьюер понимает, что данный код - хороший, а этот код - плохой?","how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"name":386,"value":387},"Дан фрагмент bash-скрипта: cd ~; mkdir foo... Что в нем происходит?","here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":389,"value":390},"Дан фрагмент 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":392,"value":393},"Что такое алгоритмическая сложность?","what-is-algorithmic-complexity",{"name":395,"value":396},"Какая алгоритмическая сложность у \"быстрой сортировки\"?","what-is-the-algorithmic-complexity-of-quick-sort",{"name":398,"value":399},"Почему в JavaScript два объекта с одинаковым содержимым при сравнении возвращают false?","why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":401,"value":402},"Каким способом может выполняться авторизация пользователя на сайте?","how-can-a-user-be-authorized-on-a-website",{"name":404,"value":405},"В чем разница между микро- и макро-тасками в JavaScript?","what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":407,"value":408},"В комнате три человека. Какова вероятность того, что хотя бы двое из них одного пола? То есть два и более.","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":410,"value":411},"Есть монета. Ее подбрасывают пять раз подряд. Каждый раз записывается, что выпало - орел или решка. Сколько разных последовательностей орлов и решек может при этом получиться?","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":413,"value":414},"Как гарантированно найти лёгкую фальшивую монету среди 8 за минимальное число взвешиваний на чашечных весах?","how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"name":416,"value":417},"Подготовка к тех.интервью","technical-interview",{"name":419,"value":420},"Верно ли утверждение, что злоумышленник, контролирующий роутер и прослушивающий трафик, может получить логины и пароли от сайтов, на которые заходит клиент?","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":422,"value":423},"Что такое DNS, как DNS находит нужный IP-адрес?","what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":425,"value":426},"Переменные объявлены следующим образом: a=3; b=«hello»;. Укажите правильное утверждение","variables-are-declared-as-follows-specify-the-correct-statement",{"name":428,"value":429},"Какой механизм лежит в основе оптимизации обновлений DOM в React?","what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":431,"value":432},"Что мешает организовать централизованное состояние без менеджера состояния? Если организовать состояние механизмами реакта: контекстом, стейтом, в чем проблема? Что менеджеры состояния привносят?","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",[434],{"label":416,"slug":417,"to":435},"/technical-interview/where-to-begin",{"navigationList":437,"navigationSublist":443},[438,440],{"path":435,"isActive":81,"name":117,"icon":439,"isNavbarMobileDisabled":8},"material-symbols:visibility-outline-rounded",{"path":441,"isActive":8,"name":321,"icon":442,"isNavbarMobileDisabled":81},"/technical-interview/tasks","material-symbols:task-outline",[444,451,470,479,484,579,596,603,608,651,666,671],{"title":445,"list":446,"isOpened":81},"Bash",[447,449],{"name":386,"path":448,"isActive":81},"/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":389,"path":450,"isActive":81},"/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"title":452,"list":453,"isOpened":81},"CSS",[454,456,458,460,462,464,466,468],{"name":297,"path":455,"isActive":81},"/technical-interview/tasks/the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":300,"path":457,"isActive":81},"/technical-interview/tasks/there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":303,"path":459,"isActive":81},"/technical-interview/tasks/there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":306,"path":461,"isActive":81},"/technical-interview/tasks/there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":309,"path":463,"isActive":81},"/technical-interview/tasks/there-is-an-html-code-will-font-weight-affect-span",{"name":312,"path":465,"isActive":81},"/technical-interview/tasks/what-are-the-differences-between-flexbox-and-grid",{"name":315,"path":467,"isActive":81},"/technical-interview/tasks/do-flexbox-and-grid-replace-each-other",{"name":318,"path":469,"isActive":81},"/technical-interview/tasks/there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"title":471,"list":472,"isOpened":81},"Git",[473,475,477],{"name":93,"path":474,"isActive":81},"/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":377,"path":476,"isActive":81},"/technical-interview/tasks/git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":380,"path":478,"isActive":81},"/technical-interview/tasks/what-are-the-branching-strategies-for-the-team-what-is-it",{"title":480,"list":481,"isOpened":81},"HTML",[482],{"name":246,"path":483,"isActive":81},"/technical-interview/tasks/what-is-html",{"title":485,"list":486,"isOpened":81},"JavaScript",[487,489,491,493,495,497,499,501,503,505,507,509,511,513,515,517,519,521,523,525,527,529,531,533,535,537,539,541,543,545,547,549,551,553,555,557,559,561,563,565,567,569,571,573,575,577],{"name":129,"path":488,"isActive":81},"/technical-interview/tasks/prototype-what-logical-values-will-be-received-in-console-log",{"name":120,"path":490,"isActive":81},"/technical-interview/tasks/why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":267,"path":492,"isActive":81},"/technical-interview/tasks/what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":150,"path":494,"isActive":81},"/technical-interview/tasks/what-value-will-the-console-output-with-object-property",{"name":153,"path":496,"isActive":81},"/technical-interview/tasks/what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":189,"path":498,"isActive":81},"/technical-interview/tasks/what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":192,"path":500,"isActive":81},"/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":207,"path":502,"isActive":81},"/technical-interview/tasks/what-will-the-book-get-upper-name-method-return",{"name":425,"path":504,"isActive":81},"/technical-interview/tasks/variables-are-declared-as-follows-specify-the-correct-statement",{"name":213,"path":506,"isActive":81},"/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":195,"path":508,"isActive":81},"/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":198,"path":510,"isActive":81},"/technical-interview/tasks/what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":114,"path":512,"isActive":81},"/technical-interview/tasks/what-this-code-will-return-typeof-function",{"name":216,"path":514,"isActive":81},"/technical-interview/tasks/what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":324,"path":516,"isActive":81},"/technical-interview/tasks/what-are-the-ways-to-declare-a-function-in-javascript",{"name":327,"path":518,"isActive":81},"/technical-interview/tasks/what-is-this-in-javascript",{"name":330,"path":520,"isActive":81},"/technical-interview/tasks/what-is-an-event-loop-and-how-does-it-work",{"name":333,"path":522,"isActive":81},"/technical-interview/tasks/what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":336,"path":524,"isActive":81},"/technical-interview/tasks/what-does-the-typeof-operator-show-in-javascript",{"name":339,"path":526,"isActive":81},"/technical-interview/tasks/what-types-of-data-exist-in-javascript",{"name":342,"path":528,"isActive":81},"/technical-interview/tasks/what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":345,"path":530,"isActive":81},"/technical-interview/tasks/what-will-typeof-return-for-an-array",{"name":348,"path":532,"isActive":81},"/technical-interview/tasks/why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":351,"path":534,"isActive":81},"/technical-interview/tasks/if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":354,"path":536,"isActive":81},"/technical-interview/tasks/what-does-typeof-return-for-new-set-in-javascript",{"name":398,"path":538,"isActive":81},"/technical-interview/tasks/why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":404,"path":540,"isActive":81},"/technical-interview/tasks/what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":138,"path":542,"isActive":81},"/technical-interview/tasks/arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":156,"path":544,"isActive":81},"/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":141,"path":546,"isActive":81},"/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":171,"path":548,"isActive":81},"/technical-interview/tasks/given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":147,"path":550,"isActive":81},"/technical-interview/tasks/for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":174,"path":552,"isActive":81},"/technical-interview/tasks/for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":165,"path":554,"isActive":81},"/technical-interview/tasks/there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":177,"path":556,"isActive":81},"/technical-interview/tasks/there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":183,"path":558,"isActive":81},"/technical-interview/tasks/there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":135,"path":560,"isActive":81},"/technical-interview/tasks/find-non-repeating-numbers-in-an-array",{"name":186,"path":562,"isActive":81},"/technical-interview/tasks/write-a-function-that-will-make-an-object-out-of-an-array",{"name":159,"path":564,"isActive":81},"/technical-interview/tasks/checks-whether-two-strings-are-anagrams-of-each-other",{"name":132,"path":566,"isActive":81},"/technical-interview/tasks/odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":162,"path":568,"isActive":81},"/technical-interview/tasks/determines-whether-a-word-is-a-palindrome",{"name":204,"path":570,"isActive":81},"/technical-interview/tasks/flattening-the-array",{"name":168,"path":572,"isActive":81},"/technical-interview/tasks/implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":210,"path":574,"isActive":81},"/technical-interview/tasks/string-compression",{"name":201,"path":576,"isActive":81},"/technical-interview/tasks/unifying-values-in-an-array",{"name":180,"path":578,"isActive":81},"/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":580,"list":581,"isOpened":81},"React",[582,584,586,588,590,592,594],{"name":357,"path":583,"isActive":81},"/technical-interview/tasks/what-is-react-used-for-and-what-problems-does-it-solve",{"name":428,"path":585,"isActive":81},"/technical-interview/tasks/what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":360,"path":587,"isActive":81},"/technical-interview/tasks/if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":363,"path":589,"isActive":81},"/technical-interview/tasks/there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":366,"path":591,"isActive":81},"/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":369,"path":593,"isActive":81},"/technical-interview/tasks/why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":431,"path":595,"isActive":81},"/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":597,"list":598,"isOpened":81},"Алгоритмы",[599,601],{"name":392,"path":600,"isActive":81},"/technical-interview/tasks/what-is-algorithmic-complexity",{"name":395,"path":602,"isActive":81},"/technical-interview/tasks/what-is-the-algorithmic-complexity-of-quick-sort",{"title":604,"list":605,"isOpened":81},"Дебаггинг",[606],{"name":372,"path":607,"isActive":81},"/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":609,"list":610,"isOpened":81},"Компьютерные сети",[611,613,615,617,619,621,623,625,627,629,631,633,635,637,639,641,643,645,647,649],{"name":219,"path":612,"isActive":81},"/technical-interview/tasks/how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":422,"path":614,"isActive":81},"/technical-interview/tasks/what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":222,"path":616,"isActive":81},"/technical-interview/tasks/how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":225,"path":618,"isActive":81},"/technical-interview/tasks/how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":228,"path":620,"isActive":81},"/technical-interview/tasks/key-differences-between-tcp-and-udp",{"name":231,"path":622,"isActive":81},"/technical-interview/tasks/tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":234,"path":624,"isActive":81},"/technical-interview/tasks/what-is-http-and-what-does-it-consist-of",{"name":237,"path":626,"isActive":81},"/technical-interview/tasks/what-are-http-headers-and-why-do-we-need-them",{"name":240,"path":628,"isActive":81},"/technical-interview/tasks/what-are-http-parameters",{"name":243,"path":630,"isActive":81},"/technical-interview/tasks/where-is-the-html-code-located-in-the-http-response-structure",{"name":249,"path":632,"isActive":81},"/technical-interview/tasks/what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":252,"path":634,"isActive":81},"/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":255,"path":636,"isActive":81},"/technical-interview/tasks/what-is-a-cookie",{"name":258,"path":638,"isActive":81},"/technical-interview/tasks/who-initiates-the-cookie-recording-in-the-browser",{"name":261,"path":640,"isActive":81},"/technical-interview/tasks/is-it-possible-to-manage-cookies-from-the-client-browser",{"name":419,"path":642,"isActive":81},"/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":270,"path":644,"isActive":81},"/technical-interview/tasks/is-everything-that-goes-through-https-secure",{"name":273,"path":646,"isActive":81},"/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":276,"path":648,"isActive":81},"/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":401,"path":650,"isActive":81},"/technical-interview/tasks/how-can-a-user-be-authorized-on-a-website",{"title":652,"list":653,"isOpened":81},"Отрисовка в браузере",[654,656,658,660,662,664],{"name":282,"path":655,"isActive":81},"/technical-interview/tasks/what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":279,"path":657,"isActive":81},"/technical-interview/tasks/how-the-browser-parses-javascript-and-images-when-rendering",{"name":285,"path":659,"isActive":81},"/technical-interview/tasks/what-is-blocking-the-page-rendering-in-the-browser",{"name":288,"path":661,"isActive":81},"/technical-interview/tasks/what-is-dom-in-a-browser-what-is-cssom",{"name":291,"path":663,"isActive":81},"/technical-interview/tasks/what-are-nodes-in-the-dom",{"name":294,"path":665,"isActive":81},"/technical-interview/tasks/what-does-cssom-consist-of",{"title":667,"list":668,"isOpened":81},"Ревью кода",[669],{"name":383,"path":670,"isActive":81},"/technical-interview/tasks/how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"title":672,"list":673,"isOpened":81},"Теория вероятности",[674,676,678],{"name":407,"path":675,"isActive":81},"/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":410,"path":677,"isActive":81},"/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":413,"path":679,"isActive":81},"/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":681,"copyright":684,"reportError":685,"socialNetwork":687},{"link":682,"title":683},"https://t.me/baurinanton","Сотрудничество","© “GOOD WEB JOB!”",{"label":686,"link":682},"Сообщить об ошибке",{"label":688,"socialNetworkList":689},"Мы в соцсетях:",[690,693,696],{"icon":26,"link":691,"title":692},"https://max.ru/u/f9LHodD0cOKMaukdnnahTeL5pwvjrPfUaZ4S8_1rsNy9I9qsmc9Ar3kP_y8","Max",{"icon":694,"link":682,"title":695},"ic:baseline-telegram","Telegram",{"icon":697,"link":698,"title":699},"ri:vk-fill","https://vk.com/baurinanton","VK",{"data":701,"body":702},{},{"type":703,"children":704},"root",[705],{"type":706,"tag":707,"props":708,"children":709},"element","p",{},[710],{"type":711,"value":93},"text",{"data":713,"body":714},{},{"type":703,"children":715},[716],{"type":706,"tag":707,"props":717,"children":718},{},[719,721,728,730,736,738,744],{"type":711,"value":720},"Переключиться на правильную ветку, выполнить ",{"type":706,"tag":722,"props":723,"children":725},"code",{"className":724},[],[726],{"type":711,"value":727},"git merge",{"type":711,"value":729}," ветки с ошибочным коммитом в правильную, затем откатить merge через ",{"type":706,"tag":722,"props":731,"children":733},{"className":732},[],[734],{"type":711,"value":735},"git reset --hard",{"type":711,"value":737}," и сделать принудительную отправку ",{"type":706,"tag":722,"props":739,"children":741},{"className":740},[],[742],{"type":711,"value":743},"git push --force",{"type":711,"value":745}," в обе ветки.",{"data":747,"body":748},{},{"type":703,"children":749},[750],{"type":706,"tag":707,"props":751,"children":752},{},[753],{"type":711,"value":754},"Удалить удалённую ветку, в которую попал коммит, затем заново запушить её из локального состояния и после этого вручную скопировать изменённые файлы в правильную ветку (без сохранения истории коммитов).",{"data":756,"body":757},{},{"type":703,"children":758},[759],{"type":706,"tag":707,"props":760,"children":761},{},[762,764,770,772,778,780,786,788,794],{"type":711,"value":763},"Найти хэш ошибочного коммита, перейти в правильную ветку и перенести коммит командой ",{"type":706,"tag":722,"props":765,"children":767},{"className":766},[],[768],{"type":711,"value":769},"git cherry-pick",{"type":711,"value":771},", затем в неправильной ветке отменить изменения через ",{"type":706,"tag":722,"props":773,"children":775},{"className":774},[],[776],{"type":711,"value":777},"git revert",{"type":711,"value":779}," (или, если ветка точно не использовалась другими, переписать историю через ",{"type":706,"tag":722,"props":781,"children":783},{"className":782},[],[784],{"type":711,"value":785},"git reset",{"type":711,"value":787}," и ",{"type":706,"tag":722,"props":789,"children":791},{"className":790},[],[792],{"type":711,"value":793},"git push --force-with-lease",{"type":711,"value":795},").",{"data":797,"body":798},{},{"type":703,"children":799},[800],{"type":706,"tag":707,"props":801,"children":802},{},[803],{"type":711,"value":90},{"data":805,"body":806},{},{"type":703,"children":807},[808],{"type":706,"tag":707,"props":809,"children":810},{},[811,817,819,824,825,830,831,836,837,842],{"type":706,"tag":812,"props":813,"children":814},"strong",{},[815],{"type":711,"value":816},"Правильный ответ: 3",{"type":711,"value":818}," - Найти хэш ошибочного коммита, перейти в правильную ветку и перенести коммит командой ",{"type":706,"tag":722,"props":820,"children":822},{"className":821},[],[823],{"type":711,"value":769},{"type":711,"value":771},{"type":706,"tag":722,"props":826,"children":828},{"className":827},[],[829],{"type":711,"value":777},{"type":711,"value":779},{"type":706,"tag":722,"props":832,"children":834},{"className":833},[],[835],{"type":711,"value":785},{"type":711,"value":787},{"type":706,"tag":722,"props":838,"children":840},{"className":839},[],[841],{"type":711,"value":793},{"type":711,"value":795},{"data":844,"body":845},{},{"type":703,"children":846},[847],{"type":706,"tag":707,"props":848,"children":849},{},[850],{"type":711,"value":91},{"data":852,"body":853},{},{"type":703,"children":854},[855,860,865],{"type":706,"tag":707,"props":856,"children":857},{},[858],{"type":711,"value":859},"Git хранит изменения как коммиты, а ветка — это указатель на последний коммит в цепочке.\nОшибка “закоммитил/запушил не в ту ветку” означает, что указатель неправильной ветки теперь указывает на коммит, который логически должен находиться в другой ветке.",{"type":706,"tag":707,"props":861,"children":862},{},[863],{"type":711,"value":864},"Практически всегда задача распадается на две части:",{"type":706,"tag":866,"props":867,"children":868},"ul",{},[869,875],{"type":706,"tag":870,"props":871,"children":872},"li",{},[873],{"type":711,"value":874},"Перенести “правильный” коммит в “правильную” ветку (без потери изменений).",{"type":706,"tag":870,"props":876,"children":877},{},[878],{"type":711,"value":879},"Убрать этот коммит из “неправильной” ветки (безопасно для команды).",{"data":881,"body":882},{},{"type":703,"children":883},[884],{"type":706,"tag":707,"props":885,"children":886},{},[887,889,895],{"type":711,"value":888},"Если ошибочный коммит был merge-коммитом, для revert может потребоваться указание “главной линии” через опцию ",{"type":706,"tag":722,"props":890,"children":892},{"className":891},[],[893],{"type":711,"value":894},"-m",{"type":711,"value":896},", так как при откате merge необходимо выбрать родительскую линию.",{"data":898,"body":899},{},{"type":703,"children":900},[901],{"type":706,"tag":707,"props":902,"children":903},{},[904],{"type":711,"value":905},"При cherry-pick создаётся новый коммит с новым хэшем, даже если изменения совпадают (это ожидаемо, так как история веток различается).",{"data":907,"body":908},{},{"type":703,"children":909},[910,927,932],{"type":706,"tag":707,"props":911,"children":912},{},[913,918,920,925],{"type":706,"tag":722,"props":914,"children":916},{"className":915},[],[917],{"type":711,"value":777},{"type":711,"value":919}," не удаляет коммит из истории, а создаёт новый коммит, который “отменяет” изменения выбранного коммита.\nИз-за этого ",{"type":706,"tag":722,"props":921,"children":923},{"className":922},[],[924],{"type":711,"value":777},{"type":711,"value":926}," обычно безопаснее на ветках, которые уже могли забрать другие участники: история не переписывается, а дополняется “коммитом-отменой”.",{"type":706,"tag":707,"props":928,"children":929},{},[930],{"type":711,"value":931},"Пример (отменить один ошибочный коммит в неправильной ветке):",{"type":706,"tag":933,"props":934,"children":938},"pre",{"className":935,"code":937,"language":711},[936],"language-text","# перейти в неправильную ветку\ngit switch неправильная-ветка\n\n# создать коммит, отменяющий изменения коммита a1b2c3d\ngit revert a1b2c3d\n\n# отправить в удалённую неправильную ветку\ngit push origin неправильная-ветка\n",[939],{"type":706,"tag":722,"props":940,"children":942},{"__ignoreMap":941},"",[943],{"type":711,"value":937},{"data":945,"body":946},{},{"type":703,"children":947},[948,974,979,984],{"type":706,"tag":707,"props":949,"children":950},{},[951,956,958,964,966,972],{"type":706,"tag":722,"props":952,"children":954},{"className":953},[],[955],{"type":711,"value":785},{"type":711,"value":957}," может переместить указатель ",{"type":706,"tag":722,"props":959,"children":961},{"className":960},[],[962],{"type":711,"value":963},"HEAD",{"type":711,"value":965}," на другой коммит, тем самым “убрав” коммиты из текущей ветки (для локальной истории).\nЕсли такой “откат” уже был отправлен на сервер, то для синхронизации удалённой ветки потребуется принудительная отправка; более безопасным вариантом считается ",{"type":706,"tag":722,"props":967,"children":969},{"className":968},[],[970],{"type":711,"value":971},"--force-with-lease",{"type":711,"value":973},", так как выполняется проверка, что удалённая ветка не изменилась неожиданным образом.",{"type":706,"tag":707,"props":975,"children":976},{},[977],{"type":711,"value":978},"Этот сценарий допустим только если точно известно, что никто не успел взять себе ветку, либо есть явная договорённость в команде переписать историю.",{"type":706,"tag":707,"props":980,"children":981},{},[982],{"type":711,"value":983},"Пример (удалить последний коммит из неправильной ветки):",{"type":706,"tag":933,"props":985,"children":988},{"className":986,"code":987,"language":711},[936],"# перейти в неправильную ветку\ngit switch неправильная-ветка\n\n# посмотреть историю и выбрать коммит, на который нужно откатиться\ngit log --oneline\n\n# откатить ветку на 1 коммит назад (пример)\ngit reset --hard HEAD~1\n\n# принудительно обновить удалённую ветку с защитной проверкой\ngit push --force-with-lease origin неправильная-ветка\n",[989],{"type":706,"tag":722,"props":990,"children":991},{"__ignoreMap":941},[992],{"type":711,"value":987},{"data":994,"body":995},{},{"type":703,"children":996},[997],{"type":706,"tag":933,"props":998,"children":1001},{"className":999,"code":1000,"language":711},[936],"# Было (ошибка: коммит X попал в wrong):\nmain:   A---B---C\nwrong:          \\\n                X\n\n# Цель:\nmain:   A---B---C---X'    (X' создан через cherry-pick)\nwrong:  A---B---C---R     (R создан через revert X)\n# или wrong: A---B---C    (через reset + force-with-lease, если допустимо)\n",[1002],{"type":706,"tag":722,"props":1003,"children":1004},{"__ignoreMap":941},[1005],{"type":711,"value":1000},{"data":1007,"body":1008},{},{"type":703,"children":1009},[1010],{"type":706,"tag":707,"props":1011,"children":1012},{},[1013,1018],{"type":706,"tag":722,"props":1014,"children":1016},{"className":1015},[],[1017],{"type":711,"value":735},{"type":711,"value":1019}," уничтожает незакоммиченные изменения в рабочей директории, поэтому перед выполнением необходимо убедиться, что несохранённой работы нет (или она сохранена отдельно).",{"data":1021,"body":1022},{},{"type":703,"children":1023},[1024],{"type":706,"tag":1025,"props":1026,"children":1027},"table",{},[1028,1052],{"type":706,"tag":1029,"props":1030,"children":1031},"thead",{},[1032],{"type":706,"tag":1033,"props":1034,"children":1035},"tr",{},[1036,1042,1047],{"type":706,"tag":1037,"props":1038,"children":1039},"th",{},[1040],{"type":711,"value":1041},"Команда",{"type":706,"tag":1037,"props":1043,"children":1044},{},[1045],{"type":711,"value":1046},"Что делает",{"type":706,"tag":1037,"props":1048,"children":1049},{},[1050],{"type":711,"value":1051},"Когда уместно",{"type":706,"tag":1053,"props":1054,"children":1055},"tbody",{},[1056,1079],{"type":706,"tag":1033,"props":1057,"children":1058},{},[1059,1069,1074],{"type":706,"tag":1060,"props":1061,"children":1062},"td",{},[1063],{"type":706,"tag":722,"props":1064,"children":1066},{"className":1065},[],[1067],{"type":711,"value":1068},"git revert \u003Ccommit>",{"type":706,"tag":1060,"props":1070,"children":1071},{},[1072],{"type":711,"value":1073},"Создаёт новый коммит, который отменяет изменения указанного коммита",{"type":706,"tag":1060,"props":1075,"children":1076},{},[1077],{"type":711,"value":1078},"Когда ветка общая/опубликована и нельзя переписывать историю",{"type":706,"tag":1033,"props":1080,"children":1081},{},[1082,1091,1103],{"type":706,"tag":1060,"props":1083,"children":1084},{},[1085],{"type":706,"tag":722,"props":1086,"children":1088},{"className":1087},[],[1089],{"type":711,"value":1090},"git reset --hard \u003Ccommit>",{"type":706,"tag":1060,"props":1092,"children":1093},{},[1094,1096,1101],{"type":711,"value":1095},"Перемещает ",{"type":706,"tag":722,"props":1097,"children":1099},{"className":1098},[],[1100],{"type":711,"value":963},{"type":711,"value":1102}," на указанный коммит, фактически “убирая” коммиты из текущей ветки локально",{"type":706,"tag":1060,"props":1104,"children":1105},{},[1106],{"type":711,"value":1107},"Когда переписывание истории разрешено и согласовано; для удалённой ветки обычно требуется принудительный push",{"data":1109,"body":1110},{},{"type":703,"children":1111},[1112,1146,1180,1196,1201],{"type":706,"tag":1113,"props":1114,"children":1115},"ol",{},[1116,1129,1141],{"type":706,"tag":870,"props":1117,"children":1118},{},[1119,1121,1127],{"type":711,"value":1120},"Зафиксировать хэш ошибочного коммита: достаточно ",{"type":706,"tag":722,"props":1122,"children":1124},{"className":1123},[],[1125],{"type":711,"value":1126},"git log --oneline --decorate --graph --all",{"type":711,"value":1128},".",{"type":706,"tag":870,"props":1130,"children":1131},{},[1132,1134,1140],{"type":711,"value":1133},"Перенести коммит в правильную ветку через ",{"type":706,"tag":722,"props":1135,"children":1137},{"className":1136},[],[1138],{"type":711,"value":1139},"git cherry-pick \u003Chash>",{"type":711,"value":1128},{"type":706,"tag":870,"props":1142,"children":1143},{},[1144],{"type":711,"value":1145},"Удалить эффект коммита из неправильной ветки:",{"type":706,"tag":866,"props":1147,"children":1148},{},[1149,1162],{"type":706,"tag":870,"props":1150,"children":1151},{},[1152,1154,1160],{"type":711,"value":1153},"Если ветка общая, необходимо выполнить ",{"type":706,"tag":722,"props":1155,"children":1157},{"className":1156},[],[1158],{"type":711,"value":1159},"git revert \u003Chash>",{"type":711,"value":1161}," и запушить результат (появится новый коммит-отмена).",{"type":706,"tag":870,"props":1163,"children":1164},{},[1165,1167,1172,1174,1179],{"type":711,"value":1166},"Если ветка личная и переписывание истории допустимо, можно сделать ",{"type":706,"tag":722,"props":1168,"children":1170},{"className":1169},[],[1171],{"type":711,"value":735},{"type":711,"value":1173}," на “правильный” базовый коммит и затем ",{"type":706,"tag":722,"props":1175,"children":1177},{"className":1176},[],[1178],{"type":711,"value":793},{"type":711,"value":1128},{"type":706,"tag":1113,"props":1181,"children":1183},{"start":1182},4,[1184],{"type":706,"tag":870,"props":1185,"children":1186},{},[1187,1189,1194],{"type":711,"value":1188},"На случай ошибок (например, выполнен reset не на тот коммит) полезно помнить про reflog: reflog хранит локальную “историю перемещений” ",{"type":706,"tag":722,"props":1190,"children":1192},{"className":1191},[],[1193],{"type":711,"value":963},{"type":711,"value":1195}," и ссылок и помогает найти предыдущее состояние.",{"type":706,"tag":707,"props":1197,"children":1198},{},[1199],{"type":711,"value":1200},"Пример с reflog (восстановление точки, если был выполнен неверный reset):",{"type":706,"tag":933,"props":1202,"children":1205},{"className":1203,"code":1204,"language":711},[936],"# показать, куда раньше указывал HEAD\ngit reflog\n\n# допустим, нужно вернуться к состоянию HEAD@{3}\ngit reset --hard HEAD@{3}\n",[1206],{"type":706,"tag":722,"props":1207,"children":1208},{"__ignoreMap":941},[1209],{"type":711,"value":1204},{"data":1211,"body":1212},{},{"type":703,"children":1213},[1214],{"type":706,"tag":707,"props":1215,"children":1216},{},[1217,1219,1224,1226,1231,1233,1238,1239,1244],{"type":711,"value":1218},"Итого: наиболее корректно перенести изменения в нужную ветку через ",{"type":706,"tag":722,"props":1220,"children":1222},{"className":1221},[],[1223],{"type":711,"value":769},{"type":711,"value":1225},", а в неправильной ветке на опубликованной истории отменить через ",{"type":706,"tag":722,"props":1227,"children":1229},{"className":1228},[],[1230],{"type":711,"value":777},{"type":711,"value":1232},"; переписывание истории через ",{"type":706,"tag":722,"props":1234,"children":1236},{"className":1235},[],[1237],{"type":711,"value":735},{"type":711,"value":787},{"type":706,"tag":722,"props":1240,"children":1242},{"className":1241},[],[1243],{"type":711,"value":793},{"type":711,"value":1245}," допустимо только при согласовании и отсутствии чужих изменений.",{"data":1247,"body":1248},{},{"type":703,"children":1249},[1250,1262,1396],{"type":706,"tag":707,"props":1251,"children":1252},{},[1253,1255,1260],{"type":711,"value":1254},"Команда ",{"type":706,"tag":722,"props":1256,"children":1258},{"className":1257},[],[1259],{"type":711,"value":769},{"type":711,"value":1261}," берёт выбранный коммит и применяет его изменения поверх текущей ветки, создавая новый коммит.\nЭто подходит для ситуации “коммит сделан не в ту ветку”, потому что переносится один (или несколько) конкретных коммитов без слияния всей ветки.",{"type":706,"tag":933,"props":1263,"children":1268},{"className":1264,"code":1265,"language":1266,"meta":1267,"style":941},"language-git shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# 1) Найти хэш коммита\ngit log --oneline --decorate --graph --all\n\n# допустим, нужный коммит: a1b2c3d\n\n# 2) Перейти в правильную ветку\ngit switch правильная-ветка\n# или: git checkout правильная-ветка\n\n# 3) Применить коммит поверх правильной ветки\ngit cherry-pick a1b2c3d\n\n# 4) Отправить правильную ветку на сервер\ngit push origin правильная-ветка\n","git","fetch origin",[1269],{"type":706,"tag":722,"props":1270,"children":1271},{"__ignoreMap":941},[1272,1283,1292,1301,1309,1317,1326,1335,1344,1352,1361,1370,1378,1387],{"type":706,"tag":1273,"props":1274,"children":1277},"span",{"class":1275,"line":1276},"line",1,[1278],{"type":706,"tag":1273,"props":1279,"children":1280},{},[1281],{"type":711,"value":1282},"# 1) Найти хэш коммита\n",{"type":706,"tag":1273,"props":1284,"children":1286},{"class":1275,"line":1285},2,[1287],{"type":706,"tag":1273,"props":1288,"children":1289},{},[1290],{"type":711,"value":1291},"git log --oneline --decorate --graph --all\n",{"type":706,"tag":1273,"props":1293,"children":1295},{"class":1275,"line":1294},3,[1296],{"type":706,"tag":1273,"props":1297,"children":1298},{"emptyLinePlaceholder":8},[1299],{"type":711,"value":1300},"\n",{"type":706,"tag":1273,"props":1302,"children":1303},{"class":1275,"line":1182},[1304],{"type":706,"tag":1273,"props":1305,"children":1306},{},[1307],{"type":711,"value":1308},"# допустим, нужный коммит: a1b2c3d\n",{"type":706,"tag":1273,"props":1310,"children":1312},{"class":1275,"line":1311},5,[1313],{"type":706,"tag":1273,"props":1314,"children":1315},{"emptyLinePlaceholder":8},[1316],{"type":711,"value":1300},{"type":706,"tag":1273,"props":1318,"children":1320},{"class":1275,"line":1319},6,[1321],{"type":706,"tag":1273,"props":1322,"children":1323},{},[1324],{"type":711,"value":1325},"# 2) Перейти в правильную ветку\n",{"type":706,"tag":1273,"props":1327,"children":1329},{"class":1275,"line":1328},7,[1330],{"type":706,"tag":1273,"props":1331,"children":1332},{},[1333],{"type":711,"value":1334},"git switch правильная-ветка\n",{"type":706,"tag":1273,"props":1336,"children":1338},{"class":1275,"line":1337},8,[1339],{"type":706,"tag":1273,"props":1340,"children":1341},{},[1342],{"type":711,"value":1343},"# или: git checkout правильная-ветка\n",{"type":706,"tag":1273,"props":1345,"children":1347},{"class":1275,"line":1346},9,[1348],{"type":706,"tag":1273,"props":1349,"children":1350},{"emptyLinePlaceholder":8},[1351],{"type":711,"value":1300},{"type":706,"tag":1273,"props":1353,"children":1355},{"class":1275,"line":1354},10,[1356],{"type":706,"tag":1273,"props":1357,"children":1358},{},[1359],{"type":711,"value":1360},"# 3) Применить коммит поверх правильной ветки\n",{"type":706,"tag":1273,"props":1362,"children":1364},{"class":1275,"line":1363},11,[1365],{"type":706,"tag":1273,"props":1366,"children":1367},{},[1368],{"type":711,"value":1369},"git cherry-pick a1b2c3d\n",{"type":706,"tag":1273,"props":1371,"children":1373},{"class":1275,"line":1372},12,[1374],{"type":706,"tag":1273,"props":1375,"children":1376},{"emptyLinePlaceholder":8},[1377],{"type":711,"value":1300},{"type":706,"tag":1273,"props":1379,"children":1381},{"class":1275,"line":1380},13,[1382],{"type":706,"tag":1273,"props":1383,"children":1384},{},[1385],{"type":711,"value":1386},"# 4) Отправить правильную ветку на сервер\n",{"type":706,"tag":1273,"props":1388,"children":1390},{"class":1275,"line":1389},14,[1391],{"type":706,"tag":1273,"props":1392,"children":1393},{},[1394],{"type":711,"value":1395},"git push origin правильная-ветка\n",{"type":706,"tag":1397,"props":1398,"children":1399},"style",{},[1400],{"type":711,"value":1401},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",1775735655417]