[{"data":1,"prerenderedAt":3325},["ShallowReactive",2],{"docs:submission":3},{"id":4,"title":5,"body":6,"description":17,"extension":3319,"meta":3320,"navigation":1384,"path":3321,"seo":3322,"stem":3323,"__hash__":3324},"docs\u002Fdocs\u002Fsubmission.md","Порядок сдачи отчётов",{"type":7,"value":8,"toc":3262},"minimark",[9,14,18,30,35,46,51,57,70,81,84,88,98,122,133,139,143,161,166,187,191,194,204,234,245,249,258,284,298,303,347,361,364,370,373,377,386,401,404,460,464,473,484,502,505,509,525,531,534,538,542,545,590,596,615,622,626,633,715,718,775,780,796,799,803,810,821,825,828,918,921,925,928,999,1002,1006,1030,1033,1046,1050,1056,1060,1063,1082,1085,1089,1253,1259,1263,1266,1270,1276,1279,1336,1340,1350,1361,1368,1549,1552,1567,1577,1581,1585,1588,1687,1694,1701,1711,1717,1723,1749,1762,1766,1772,1836,1842,1846,1849,1853,1859,1902,1905,1932,1936,1939,2039,2044,2055,2061,2065,2068,2099,2113,2118,2129,2133,2218,2222,2229,2233,2312,2316,2322,2376,2387,2390,2412,2416,2423,2437,2440,2444,2447,2451,2459,2514,2521,2525,2528,2579,2583,2931,2935,3143,3147,3150,3154,3204,3213,3255,3258],[10,11,13],"h1",{"id":12},"сдача-работ-через-gitlab-регламент-и-справочник-по-git","Сдача работ через GitLab: регламент и справочник по git",[15,16,17],"p",{},"Документ описывает процесс сдачи лабораторных, курсовых и домашних работ по дисциплинам кафедры ИИЦТ и даёт справочник по git и GitLab для тех, кто раньше с ними не работал. Регламент единый для всех дисциплин кафедры — и для магистратуры, и для бакалавриата. Прочитайте один раз внимательно перед первой сдачей — дальше документ пригодится как справочник.",[15,19,20,21,25,26,29],{},"Конкретные детали курса (название, слаг проекта, список работ, логин преподавателя) уточняет преподаватель на первом занятии. В этом регламенте такие места обозначены заглушками в угловых скобках: ",[22,23,24],"code",{},"\u003Ccourse-slug>",", ",[22,27,28],{},"\u003Cлогин-преподавателя>"," и т. п.",[31,32,34],"h2",{"id":33},"_1-ключевые-понятия","1. Ключевые понятия",[15,36,37,38,25,42,45],{},"Перед тем как что-то делать, нужно понимать ",[39,40,41],"strong",{},"что такое git",[39,43,44],{},"что такое GitLab",", и чем они отличаются. Путаница между этими двумя понятиями — главный источник недоразумений у новичков.",[47,48,50],"h3",{"id":49},"_11-что-такое-git","1.1. Что такое git",[15,52,53,56],{},[39,54,55],{},"Git"," — программа, которая ведёт историю изменений файлов в папке с проектом. Её задачи простыми словами:",[58,59,60,64,67],"ul",{},[61,62,63],"li",{},"запоминать, кто и что менял в файлах проекта;",[61,65,66],{},"позволять откатиться на любое прошлое состояние, если в коде что-то сломалось;",[61,68,69],{},"позволять нескольким людям работать над одним проектом, не переписывая друг другу правки.",[15,71,72,73,76,77,80],{},"Git — это ",[39,74,75],{},"консольная программа",", которая живёт на вашем компьютере. Она работает с папкой, внутри которой лежит ваш проект. Никакого «сервера» для работы git как таковой не требуется. Весь механизм запоминания истории работает локально, в скрытом каталоге ",[22,78,79],{},".git\u002F"," внутри папки проекта.",[15,82,83],{},"Аналогия из жизни: git — это как Word с постоянно включённой функцией «История изменений», только на стероидах. Она запоминает не одну версию документа, а всю цепочку правок — от создания файла до сегодняшнего дня.",[47,85,87],{"id":86},"_12-что-такое-gitlab","1.2. Что такое GitLab",[15,89,90,93,94,97],{},[39,91,92],{},"GitLab"," — это ",[39,95,96],{},"веб-сайт"," (и сервер за ним), куда можно положить копию своего проекта, чтобы она хранилась в интернете, а не только у вас на ноутбуке. GitLab:",[58,99,100,103,106,113,119],{},[61,101,102],{},"хранит копии репозиториев — как «облако» для кода;",[61,104,105],{},"показывает их в веб-интерфейсе: можно читать файлы, смотреть историю, искать;",[61,107,108,109,112],{},"умеет показывать изменения, которые один разработчик предлагает внести, чтобы другой их прочитал и утвердил (это называется ",[39,110,111],{},"Merge Request",");",[61,114,115,116,112],{},"умеет запускать автоматические проверки (тесты, линтеры) при каждом изменении (",[39,117,118],{},"CI\u002FCD",[61,120,121],{},"управляет доступами: кто имеет право читать и менять проект.",[15,123,124,125,132],{},"Аналоги GitLab — GitHub (самый известный), Bitbucket. На нашей кафедре используется собственный экземпляр GitLab: ",[126,127,131],"a",{"href":128,"rel":129},"https:\u002F\u002Fgit.aidt.online",[130],"nofollow","git.aidt.online",".",[15,134,135,138],{},[39,136,137],{},"Важное различие:"," git — это программа, которая запускается у вас локально. GitLab — это веб-сервис, через который копии ваших проектов становятся доступны преподавателю и одногруппникам. Можно использовать git без GitLab (например, для личных заметок), но не наоборот.",[47,140,142],{"id":141},"_13-репозиторий","1.3. Репозиторий",[15,144,145,148,149,153,154,157,158,160],{},[39,146,147],{},"Репозиторий"," (англ. ",[150,151,152],"em",{},"repository",", сокращённо — ",[39,155,156],{},"репо",") — папка с проектом, в которой git ведёт историю. Снаружи — обычная папка с файлами вашего кода. Внутри — скрытый каталог ",[22,159,79],{},", где git хранит всю историю изменений. Туда лучше руками не лазать.",[15,162,163],{},[39,164,165],{},"Два способа создать репозиторий:",[58,167,168,178],{},[61,169,170,173,174,177],{},[39,171,172],{},"С нуля, на пустом месте."," Команда ",[22,175,176],{},"git init"," превращает обычную папку в репозиторий. Нужна, если вы начинаете проект с чистого листа.",[61,179,180,173,183,186],{},[39,181,182],{},"Клонированием с сервера.",[22,184,185],{},"git clone \u003CURL>"," скачивает копию существующего репозитория с GitLab на ваш компьютер. Нужна, когда проект уже создан на сервере (в наших курсах — это основной способ).",[47,188,190],{"id":189},"_14-рабочая-папка-индекс-история","1.4. Рабочая папка, индекс, история",[15,192,193],{},"Когда вы меняете файлы в репозитории, правки проходят через три условные зоны:",[195,196,201],"pre",{"className":197,"code":199,"language":200},[198],"language-text","1. Рабочая папка  →  2. Индекс (staging)  →  3. История (commits)\n      редактирование       git add                 git commit\n      файлов               добавить в              зафиксировать\n                           «пачку»                 «пачку»\n","text",[22,202,199],{"__ignoreMap":203},"",[205,206,207,216,228],"ol",{},[61,208,209,148,212,215],{},[39,210,211],{},"Рабочая папка",[150,213,214],{},"working directory",") — это привычные файлы, которые вы открываете и правите в редакторе.",[61,217,218,148,221,25,224,227],{},[39,219,220],{},"Индекс",[150,222,223],{},"staging area",[150,225,226],{},"index",") — промежуточный буфер, куда вы явно кладёте готовые изменения, которые хотите закрепить. Это как «корзина перед кассой»: вы собрали в неё товары, но чек ещё не пробили. Индекс нужен, чтобы разбить много разных правок на несколько осмысленных коммитов, а не заталкивать их в один.",[61,229,230,233],{},[39,231,232],{},"История"," — последовательность коммитов. Каждый коммит — это снимок состояния всех файлов проекта на момент фиксации, с сообщением и подписью автора.",[15,235,236,237,240,241,244],{},"Команда ",[22,238,239],{},"git add \u003Cфайл>"," переносит правку из рабочей папки в индекс. Команда ",[22,242,243],{},"git commit"," берёт всё, что лежит в индексе, и делает новый коммит в историю. После этого индекс пустеет — пока вы не положите в него следующую порцию правок.",[47,246,248],{"id":247},"_15-коммит","1.5. Коммит",[15,250,251,148,254,257],{},[39,252,253],{},"Коммит",[150,255,256],{},"commit",") — единица истории. Один коммит содержит:",[58,259,260,266,272,278],{},[61,261,262,265],{},[39,263,264],{},"снапшот"," состояния всех файлов проекта на момент коммита;",[61,267,268,271],{},[39,269,270],{},"сообщение"," — текстовое описание, что и зачем поменялось;",[61,273,274,277],{},[39,275,276],{},"автора и время"," — ФИО, email, дата;",[61,279,280,283],{},[39,281,282],{},"ссылку на предыдущий коммит"," (так коммиты связаны в цепочку).",[15,285,286,287,290,291,294,295,132],{},"У каждого коммита есть уникальный ",[39,288,289],{},"хэш"," — строка вида ",[22,292,293],{},"a3f7b1c9d2e5f80a…"," длиной 40 символов. Обычно достаточно первых 7–8 символов, чтобы однозначно на него сослаться. Хэш генерируется автоматически; его видно в команде ",[22,296,297],{},"git log",[15,299,300],{},[39,301,302],{},"Правила для сообщений коммитов:",[205,304,305,311,317],{},[61,306,307,310],{},[39,308,309],{},"Повелительное наклонение",", без точки в конце: «Добавить разметку дашборда», не «Добавил», не «Добавление», не «Добавлен каркас».",[61,312,313,316],{},[39,314,315],{},"Одно логическое изменение — один коммит",". Если вы одновременно добавили разметку, исправили опечатку и переименовали файл — это три разных коммита, а не один.",[61,318,319,322,323,25,326,25,329,25,331,25,334,25,337,25,340,25,343,346],{},[39,320,321],{},"Запрещённые формулировки",", которые будут снижать баллы: ",[22,324,325],{},"wip",[22,327,328],{},"fix",[22,330,132],{},[22,332,333],{},"update",[22,335,336],{},"правки",[22,338,339],{},"ещё",[22,341,342],{},"lab1",[22,344,345],{},"коммит",", пустая строка. По сообщению коммита должно быть понятно, что именно было сделано, без необходимости открывать diff.",[15,348,349,352,353,356,357,360],{},[39,350,351],{},"Почему именно повелительное наклонение"," — это не прихоть, а общепринятая в индустрии конвенция (она же используется и самим git — автогенерируемые сообщения вроде ",[22,354,355],{},"Merge branch 'x'"," и ",[22,358,359],{},"Revert \"...\""," написаны в повелительном). Работает простое правило: коммит отвечает на вопрос «что произойдёт, если я применю этот коммит?», и ответ естественно звучит как команда — «Добавить X», «Исправить Y», «Удалить Z». Повелительная форма короче, единообразна по виду (все коммиты выглядят одинаково, независимо от рода автора и времени) и читается как список действий, а не как отчёт «кто что сделал». Приходя в любой промышленный проект, вы встретите тот же стиль — привыкать к нему лучше сразу.",[15,362,363],{},"Пример хорошей истории из шести коммитов:",[195,365,368],{"className":366,"code":367,"language":200},[198],"Добавить каркас HTML-документа и Open Graph-метатеги\nРазметить шапку и главную навигацию\nРазметить секцию «Расписание на сегодня»\nРазметить карточки дисциплин\nИсправить вложенность \u003Caddress> в футере\nДобавить отчёт lab-01\u002Freport.md\n",[22,369,367],{"__ignoreMap":203},[15,371,372],{},"По этому списку уже видно структуру работы, не глядя в diff.",[47,374,376],{"id":375},"_16-ветка","1.6. Ветка",[15,378,379,148,382,385],{},[39,380,381],{},"Ветка",[150,383,384],{},"branch",") — именованный указатель на один из коммитов истории. Ветки нужны, чтобы вести несколько параллельных линий разработки в одном репозитории, не мешая друг другу.",[15,387,388,389,392,393,396,397,400],{},"На практике: у вас есть основная ветка с «официальной» версией проекта (",[22,390,391],{},"main","). Когда вы начинаете новую задачу, вы создаёте от неё ",[39,394,395],{},"отдельную ветку"," — отводите в сторону свою временную копию истории. В ней вы коммитите свои правки. Когда работа закончена, эту ветку ",[39,398,399],{},"сливают"," обратно в основную.",[15,402,403],{},"В курсе используются только две роли веток:",[58,405,406,420],{},[61,407,408,412,413,419],{},[39,409,410],{},[22,411,391],{}," — главная ветка проекта. В неё попадают только готовые, проверенные преподавателем работы через Merge Request. ",[39,414,415,416,418],{},"Прямой push в ",[22,417,391],{}," запрещён"," настройкой protected branch.",[61,421,422,427,428,430,431,433,434,437,438,25,441,444,445,448,449,452,453,456,457,132],{},[39,423,424],{},[22,425,426],{},"lab-{xx}\u002Fv1"," — рабочая ветка для конкретной лабораторной или домашней работы. Создаётся от актуального ",[22,429,391],{},", в ней вы коммитите свои правки, потом она сливается в ",[22,432,391],{}," через Merge Request. Номер ",[22,435,436],{},"xx"," — номер работы: ",[22,439,440],{},"lab-01\u002Fv1",[22,442,443],{},"lab-02\u002Fv1",", и так далее. Суффикс ",[22,446,447],{},"v1"," оставлен на случай, если работу придётся переделывать: тогда вторая попытка будет в ",[22,450,451],{},"lab-01\u002Fv2",". Для домашних работ по аналогии — ",[22,454,455],{},"homework-01\u002Fv1",", для курсовой — ",[22,458,459],{},"coursework\u002Fv1",[47,461,463],{"id":462},"_17-удалённый-репозиторий","1.7. Удалённый репозиторий",[15,465,466,148,469,472],{},[39,467,468],{},"Удалённый репозиторий",[150,470,471],{},"remote",") — копия репозитория на сервере, куда вы отправляете свои коммиты из локальной копии. В нашем случае это проект на git.aidt.online.",[15,474,475,476,479,480,483],{},"Когда вы клонируете проект с сервера командой ",[22,477,478],{},"git clone",", git автоматически запоминает адрес удалённого репозитория под именем ",[22,481,482],{},"origin",". Дальше две главные команды:",[58,485,486,494],{},[61,487,488,493],{},[39,489,490],{},[22,491,492],{},"git push"," — отправить ваши локальные коммиты на сервер;",[61,495,496,501],{},[39,497,498],{},[22,499,500],{},"git pull"," — забрать с сервера коммиты, которых у вас локально нет.",[15,503,504],{},"«Локально поработали → отправили на сервер через push» — это основной цикл работы с GitLab.",[47,506,508],{"id":507},"_18-merge-request","1.8. Merge Request",[15,510,511,513,514,516,517,519,520,522,523,132],{},[39,512,111],{}," (MR) — способ «предложить» слияние своей ветки в основную и получить review от преподавателя. Когда вы закончили работу над лабораторной в ветке ",[22,515,440],{}," и запушили её, вы открываете в GitLab Merge Request «из ",[22,518,440],{}," в ",[22,521,391],{},"». Преподаватель видит все ваши изменения, оставляет замечания построчно, вы правите и отвечаете. Когда всё устраивает — преподаватель ставит Approve, вы нажимаете кнопку Merge, ветка сливается с ",[22,524,391],{},[15,526,527,530],{},[39,528,529],{},"Merge Request = способ сдать работу."," Без него сдача не засчитывается технически.",[15,532,533],{},"На GitHub этот же процесс называется Pull Request; смысл идентичный.",[31,535,537],{"id":536},"_2-установка-и-настройка-git","2. Установка и настройка git",[47,539,541],{"id":540},"_21-установка","2.1. Установка",[15,543,544],{},"Git нужно установить один раз на свой компьютер.",[58,546,547,559,581],{},[61,548,549,552,553,558],{},[39,550,551],{},"Windows:"," скачать установщик ",[126,554,557],{"href":555,"rel":556},"https:\u002F\u002Fgit-scm.com\u002Fdownload\u002Fwin",[130],"Git for Windows",". В установщике жмите «Next» по всем пунктам (дефолтные настройки безопасны). В комплекте идут: сам git, консоль Git Bash (удобная для Windows), минимальный редактор.",[61,560,561,564,565,568,569,572,573,576,577,580],{},[39,562,563],{},"macOS:"," ",[22,566,567],{},"git"," обычно уже установлен. Проверьте командой ",[22,570,571],{},"git --version"," в Терминале. Если нет — поставьте Xcode Command Line Tools: ",[22,574,575],{},"xcode-select --install",". Альтернативно: ",[22,578,579],{},"brew install git",", если установлен Homebrew.",[61,582,583,564,586,589],{},[39,584,585],{},"Linux (Ubuntu\u002FDebian):",[22,587,588],{},"sudo apt install git"," в терминале.",[15,591,592,595],{},[39,593,594],{},"Проверка:"," в терминале (Git Bash на Windows, Terminal.app на macOS, любой — на Linux) выполните:",[195,597,601],{"className":598,"code":599,"language":600,"meta":203,"style":203},"language-bash shiki shiki-themes github-light github-dark","git --version\n","bash",[22,602,603],{"__ignoreMap":203},[604,605,608,611],"span",{"class":606,"line":607},"line",1,[604,609,567],{"class":610},"sScJk",[604,612,614],{"class":613},"sj4cs"," --version\n",[15,616,617,618,621],{},"Должно вывести что-то вроде ",[22,619,620],{},"git version 2.43.0",". Версия 2.40+ — норма; более старая может тоже подойти, но лучше обновить.",[47,623,625],{"id":624},"_22-базовая-настройка-git","2.2. Базовая настройка git",[15,627,628,629,632],{},"Выполняется ",[39,630,631],{},"один раз"," после установки. Эти команды нужно запустить в терминале один за другим:",[195,634,636],{"className":598,"code":635,"language":600,"meta":203,"style":203},"git config --global user.name \"Иван Иванов\"\ngit config --global user.email \"i_ivanov@aidt.online\"\ngit config --global init.defaultBranch main\ngit config --global pull.rebase false\ngit config --global core.autocrlf input\n",[22,637,638,655,670,685,700],{"__ignoreMap":203},[604,639,640,642,646,649,652],{"class":606,"line":607},[604,641,567],{"class":610},[604,643,645],{"class":644},"sZZnC"," config",[604,647,648],{"class":613}," --global",[604,650,651],{"class":644}," user.name",[604,653,654],{"class":644}," \"Иван Иванов\"\n",[604,656,658,660,662,664,667],{"class":606,"line":657},2,[604,659,567],{"class":610},[604,661,645],{"class":644},[604,663,648],{"class":613},[604,665,666],{"class":644}," user.email",[604,668,669],{"class":644}," \"i_ivanov@aidt.online\"\n",[604,671,673,675,677,679,682],{"class":606,"line":672},3,[604,674,567],{"class":610},[604,676,645],{"class":644},[604,678,648],{"class":613},[604,680,681],{"class":644}," init.defaultBranch",[604,683,684],{"class":644}," main\n",[604,686,688,690,692,694,697],{"class":606,"line":687},4,[604,689,567],{"class":610},[604,691,645],{"class":644},[604,693,648],{"class":613},[604,695,696],{"class":644}," pull.rebase",[604,698,699],{"class":613}," false\n",[604,701,703,705,707,709,712],{"class":606,"line":702},5,[604,704,567],{"class":610},[604,706,645],{"class":644},[604,708,648],{"class":613},[604,710,711],{"class":644}," core.autocrlf",[604,713,714],{"class":644}," input\n",[15,716,717],{},"Разбор каждой команды:",[58,719,720,741,756,767],{},[61,721,722,356,727,732,733,736,737,740],{},[39,723,724],{},[22,725,726],{},"user.name",[39,728,729],{},[22,730,731],{},"user.email"," — подписываются в каждом вашем коммите. Укажите ",[39,734,735],{},"своё реальное ФИО"," (как в зачётной книжке) и ",[39,738,739],{},"ту же почту, которая привязана к вашей учётной записи на git.aidt.online",". Если email будет не тот, GitLab не свяжет коммиты с вашим профилем, и в web-интерфейсе коммиты будут без аватара.",[61,742,743,748,749,751,752,755],{},[39,744,745],{},[22,746,747],{},"init.defaultBranch main"," — новые репозитории сразу получают ветку ",[22,750,391],{}," (а не устаревшее имя ",[22,753,754],{},"master",").",[61,757,758,763,764,766],{},[39,759,760],{},[22,761,762],{},"pull.rebase false"," — при ",[22,765,500],{}," использовать merge, а не rebase. Для новичков это безопаснее.",[61,768,769,774],{},[39,770,771],{},[22,772,773],{},"core.autocrlf input"," (важно для Windows) — не портит переводы строк в текстовых файлах при push\u002Fpull. Без этой настройки Windows-пользователи часто ломают файлы.",[15,776,777],{},[39,778,779],{},"Проверка настроек:",[195,781,783],{"className":598,"code":782,"language":600,"meta":203,"style":203},"git config --global --list\n",[22,784,785],{"__ignoreMap":203},[604,786,787,789,791,793],{"class":606,"line":607},[604,788,567],{"class":610},[604,790,645],{"class":644},[604,792,648],{"class":613},[604,794,795],{"class":613}," --list\n",[15,797,798],{},"Увидите список того, что настроили. Если где-то опечатка — повторите соответствующую команду с правильным значением, она перезапишет прежнее.",[31,800,802],{"id":801},"_3-доступ-к-gitaidtonline-по-https","3. Доступ к git.aidt.online по HTTPS",[15,804,805,806,809],{},"На git.aidt.online настроен ",[39,807,808],{},"только HTTPS","-доступ. SSH не поддерживается.",[15,811,812,813,816,817,820],{},"При каждом push\u002Fpull git будет спрашивать ваши учётные данные: логин с git.aidt.online и ",[39,814,815],{},"Personal Access Token"," (PAT) вместо пароля. Использовать обычный пароль от аккаунта ",[39,818,819],{},"нельзя"," — GitLab по соображениям безопасности требует токен.",[47,822,824],{"id":823},"_31-создание-personal-access-token","3.1. Создание Personal Access Token",[15,826,827],{},"Токен создаётся один раз и дальше живёт на вашей машине. Шаги:",[205,829,830,837,847,895,901,911],{},[61,831,832,833,836],{},"Войти на ",[126,834,131],{"href":128,"rel":835},[130]," своим корпоративным аккаунтом.",[61,838,839,840,843,844,132],{},"Правый верхний угол → щёлкнуть по аватару → ",[39,841,842],{},"Preferences"," (в левом меню) → ",[39,845,846],{},"Access Tokens",[61,848,849,852,853],{},[39,850,851],{},"Add new token",". Параметры:\n",[58,854,855,865,871],{},[61,856,857,860,861,864],{},[150,858,859],{},"Token name"," — любое понятное имя, например ",[22,862,863],{},"cli-ноутбук",";",[61,866,867,870],{},[150,868,869],{},"Expiration date"," — дата истечения. Ставьте дату конца учебного года (или максимум на 1 год — GitLab не даст больше). Когда токен истечёт, создадите новый.",[61,872,873,876,877],{},[150,874,875],{},"Select scopes"," — отметить галочками:\n",[58,878,879,886,892],{},[61,880,881,882,885],{},"✅ ",[22,883,884],{},"read_repository"," — читать код из репозиториев;",[61,887,881,888,891],{},[22,889,890],{},"write_repository"," — пушить изменения.",[61,893,894],{},"Остальные scopes не нужны.",[61,896,897,898,132],{},"Нажать ",[39,899,900],{},"Create personal access token",[61,902,903,906,907,910],{},[39,904,905],{},"Скопировать показанный токен"," — длинная строка вида ",[22,908,909],{},"glpat-XXXXXXXXXXXXXXXXXXXX",". GitLab покажет его только один раз; если потеряете — придётся создавать новый.",[61,912,913,914,917],{},"Сохранить в надёжном месте: менеджер паролей (Bitwarden, 1Password, KeePass), или временно — в заметки. ",[39,915,916],{},"Не коммитьте токен в репозиторий",", это утечка учётки.",[15,919,920],{},"Токен используется как замена пароля при любых операциях git с git.aidt.online.",[47,922,924],{"id":923},"_32-настройка-credential-helper-чтобы-не-вводить-токен-каждый-раз","3.2. Настройка credential helper — чтобы не вводить токен каждый раз",[15,926,927],{},"Чтобы не вбивать логин и токен при каждом push\u002Fpull, включите кеширование учёток:",[58,929,930,939,964],{},[61,931,932,934,935,938],{},[39,933,551],{}," ничего делать не нужно — Git for Windows по умолчанию использует ",[39,936,937],{},"Git Credential Manager",", который хранит токен в Credential Manager Windows. При первом push откроется окно «Sign in to your account» — введите логин и токен, дальше git их запомнит.",[61,940,941,943,944,963],{},[39,942,563],{}," включить встроенный keychain-хелпер:\n",[195,945,947],{"className":598,"code":946,"language":600,"meta":203,"style":203},"git config --global credential.helper osxkeychain\n",[22,948,949],{"__ignoreMap":203},[604,950,951,953,955,957,960],{"class":606,"line":607},[604,952,567],{"class":610},[604,954,645],{"class":644},[604,956,648],{"class":613},[604,958,959],{"class":644}," credential.helper",[604,961,962],{"class":644}," osxkeychain\n","\nПри первом push Terminal попросит логин и токен, дальше они лягут в Keychain.",[61,965,966,969,970,988,989,994,995,998],{},[39,967,968],{},"Linux:"," включить кеширование в памяти на 12 часов (достаточно на учебный день):\n",[195,971,973],{"className":598,"code":972,"language":600,"meta":203,"style":203},"git config --global credential.helper 'cache --timeout=43200'\n",[22,974,975],{"__ignoreMap":203},[604,976,977,979,981,983,985],{"class":606,"line":607},[604,978,567],{"class":610},[604,980,645],{"class":644},[604,982,648],{"class":613},[604,984,959],{"class":644},[604,986,987],{"class":644}," 'cache --timeout=43200'\n","\nДля постоянного хранения поставьте ",[126,990,993],{"href":991,"rel":992},"https:\u002F\u002Fgit-scm.com\u002Fdocs\u002Fgit-credential-libsecret",[130],"libsecret credential helper"," или используйте ",[22,996,997],{},"store"," (менее безопасно — токен в открытом виде в файле, годится только на личной машине).",[15,1000,1001],{},"После настройки — первый push спросит учётку, все следующие пройдут без вопросов.",[47,1003,1005],{"id":1004},"_33-что-вводить-в-поле-логин-и-пароль","3.3. Что вводить в поле «логин» и «пароль»",[58,1007,1008,1017],{},[61,1009,1010,1013,1014,755],{},[39,1011,1012],{},"Username \u002F Логин:"," ваш логин на git.aidt.online (тот, что вы используете при входе на сайт — например, ",[22,1015,1016],{},"i_ivanov",[61,1018,1019,1022,1023,1026,1027,132],{},[39,1020,1021],{},"Password \u002F Пароль:"," Personal Access Token (",[22,1024,1025],{},"glpat-…","), ",[39,1028,1029],{},"не пароль от аккаунта",[15,1031,1032],{},"Если git пишет «authentication failed» — 99 % случаев это:",[205,1034,1035,1038,1041],{},[61,1036,1037],{},"Введён пароль вместо токена.",[61,1039,1040],{},"Токен истёк.",[61,1042,1043,1044,132],{},"У токена не отмечен scope ",[22,1045,890],{},[31,1047,1049],{"id":1048},"_4-создание-проекта-в-gitlab","4. Создание проекта в GitLab",[15,1051,628,1052,1055],{},[39,1053,1054],{},"один раз на весь курс",". Один личный проект используется для всех лабораторных и домашних работ по одной дисциплине — ветки разделяют задания внутри.",[47,1057,1059],{"id":1058},"_41-имя-проекта","4.1. Имя проекта",[15,1061,1062],{},"Имя проекта задаёт преподаватель на первом занятии — в виде короткого слага латиницей, одинакового для всех студентов, сдающих этот курс. Это важно: одинаковое имя у всех облегчает преподавателю навигацию по десяткам студенческих проектов, а студенту — поиск своего проекта по прямой ссылке.",[15,1064,1065,1066,1068,1069,25,1072,25,1075,1078,1079,132],{},"Формат: ",[22,1067,24],{},", например ",[22,1070,1071],{},"web-frontend",[22,1073,1074],{},"databases",[22,1076,1077],{},"nodejs",". Полный путь к вашему проекту получится такой: ",[22,1080,1081],{},"git.aidt.online\u002F\u003Cваш-логин>\u002F\u003Ccourse-slug>",[15,1083,1084],{},"Если преподаватель не назвал слаг — уточните до первой сдачи; не придумывайте название самостоятельно.",[47,1086,1088],{"id":1087},"_42-создание-проекта","4.2. Создание проекта",[205,1090,1091,1096,1102,1165,1170,1211],{},[61,1092,832,1093,132],{},[126,1094,131],{"href":128,"rel":1095},[130],[61,1097,1098,1099,132],{},"Верхнее меню → ",[39,1100,1101],{},"+ (New) → New project → Create blank project",[61,1103,1104,1105],{},"Заполнить поля:",[58,1106,1107,1115,1136,1142,1152],{},[61,1108,1109,1112,1113,755],{},[39,1110,1111],{},"Project name"," — слаг курса, который дал преподаватель (",[22,1114,24],{},[61,1116,1117,1120,1121,1124,1125,1128,1129,1132,1133,1135],{},[39,1118,1119],{},"Project URL"," — выбрать ",[39,1122,1123],{},"ваш личный нэймспейс"," (",[22,1126,1127],{},"git.aidt.online\u002F\u003Cваш-логин>","). ",[39,1130,1131],{},"НЕ"," группу курса, ",[39,1134,1131],{}," командную подгруппу. Проект должен лежать в вашем собственном аккаунте.",[61,1137,1138,1141],{},[39,1139,1140],{},"Project slug"," — автоматически подставится из Project name, трогать не нужно.",[61,1143,1144,1147,1148,1151],{},[39,1145,1146],{},"Visibility Level"," — ",[39,1149,1150],{},"Private",". Никто, кроме вас и приглашённого преподавателя, не увидит содержимое.",[61,1153,1154,1157,1158,1161,1162,1164],{},[39,1155,1156],{},"Initialize repository with a README"," — ✅ ",[39,1159,1160],{},"поставить галочку",". Это создаст ветку ",[22,1163,391],{}," с первым пустым коммитом; без неё клонирование будет выдавать ошибку «empty repository».",[61,1166,897,1167,132],{},[39,1168,1169],{},"Create project",[61,1171,1172,1175,1176,1179,1180,1207,1210],{},[39,1173,1174],{},"Пригласить преподавателя."," Слева в меню проекта → ",[39,1177,1178],{},"Manage → Members → Invite members",":",[58,1181,1182,1188,1196,1202],{},[61,1183,1184,1187],{},[150,1185,1186],{},"Select members to invite"," — начните вводить ФИО или логин преподавателя курса, выберите из выпадающего списка;",[61,1189,1190,1147,1193,864],{},[150,1191,1192],{},"Select a role",[39,1194,1195],{},"Developer",[61,1197,1198,1201],{},[150,1199,1200],{},"Access expiration date"," — можно оставить пустым или поставить дату конца семестра;",[61,1203,1204,132],{},[39,1205,1206],{},"Invite",[1208,1209],"br",{},"Без этого шага сдача технически невозможна: преподаватель не увидит ни проект, ни Merge Request. Логин преподавателя узнайте на первом занятии.",[61,1212,1213,1218,1219,1179,1222],{},[39,1214,1215,1216,132],{},"Защитить ветку ",[22,1217,391],{}," Слева: ",[39,1220,1221],{},"Settings → Repository → Protected branches → Add protected branch",[58,1223,1224,1231,1239,1248],{},[61,1225,1226,1147,1229,864],{},[150,1227,1228],{},"Branch",[22,1230,391],{},[61,1232,1233,1147,1236,864],{},[150,1234,1235],{},"Allowed to merge",[39,1237,1238],{},"Developers + Maintainers",[61,1240,1241,1147,1244,1247],{},[150,1242,1243],{},"Allowed to push and merge",[39,1245,1246],{},"Maintainers"," (то есть только вы; преподаватель не будет сам пушить в вашу ветку).",[61,1249,1250,132],{},[39,1251,1252],{},"Protect",[15,1254,1255,1256,1258],{},"Теперь настройки готовы. Любое изменение в ",[22,1257,391],{}," возможно только через Merge Request. Это спасает от случайного прямого push, который мог бы испортить историю.",[31,1260,1262],{"id":1261},"_5-структура-проекта-и-отчёты","5. Структура проекта и отчёты",[15,1264,1265],{},"Чтобы преподавателю было одинаково удобно искать работы у всех студентов, структура папок в репозитории — единая.",[47,1267,1269],{"id":1268},"_51-структура-папок","5.1. Структура папок",[195,1271,1274],{"className":1272,"code":1273,"language":200},[198],"\u003Ccourse-slug>\u002F\n├── README.md                # короткое описание репозитория: ФИО, группа, курс\n├── .gitignore\n├── lab-01\u002F                  # папка с лабораторной 1\n│   ├── \u003Cфайлы решения>      # index.html, styles\u002F, src\u002F, ... — как требует задание\n│   └── report.md            # отчёт по лабораторной (см. 5.2)\n├── lab-02\u002F\n│   └── ...\n├── homework-01\u002F             # домашние задания (если предусмотрены курсом)\n│   └── ...\n└── coursework\u002F              # курсовая работа (если предусмотрена курсом)\n    └── ...\n",[22,1275,1273],{"__ignoreMap":203},[15,1277,1278],{},"Правила:",[58,1280,1281,1295,1309,1322],{},[61,1282,1283,1286,1287,1290,1291,1294],{},[39,1284,1285],{},"Одна работа — одна папка верхнего уровня."," Номер двузначный с ведущим нулём (",[22,1288,1289],{},"lab-01",", а не ",[22,1292,1293],{},"lab-1","), чтобы сортировка в файловом менеджере и на GitLab шла по-человечески.",[61,1296,1297,1300,1301,1304,1305,1308],{},[39,1298,1299],{},"Отчёт лежит внутри папки работы"," под именем ",[22,1302,1303],{},"report.md",", а не в отдельном дереве ",[22,1306,1307],{},"reports\u002F",". Так задание и отчёт про него всегда рядом.",[61,1310,1311,1314,1315,1318,1319,132],{},[39,1312,1313],{},"Имена папок и файлов — латиницей, в нижнем регистре, через дефис."," Без пробелов, без кириллицы, без заглавных. Примеры: ",[22,1316,1317],{},"lab-03-semantic-markup\u002F"," допустимо, если преподаватель просит уточнять тематику в имени; иначе хватит ",[22,1320,1321],{},"lab-03\u002F",[61,1323,1324,1327,1328,1331,1332,1335],{},[39,1325,1326],{},"Не плодите лишние уровни вложенности."," Исходники задания — прямо в ",[22,1329,1330],{},"lab-XX\u002F",", а не в ",[22,1333,1334],{},"lab-XX\u002Fsrc\u002F",", если в задании нет сборки. Решение «папка внутри папки ради папки» только мешает ревью.",[47,1337,1339],{"id":1338},"_52-отчёт-по-работе-формат-и-структура","5.2. Отчёт по работе: формат и структура",[15,1341,1342,1343,1124,1346,1349],{},"Отчёты сдаются в формате ",[39,1344,1345],{},"Markdown",[22,1347,1348],{},".md","), не Word, не PDF. Причины:",[58,1351,1352,1355,1358],{},[61,1353,1354],{},"Markdown отображается GitLab прямо в веб-интерфейсе — преподаватель читает отчёт там же, где смотрит код, без скачивания файлов.",[61,1356,1357],{},"Markdown — это обычный текст, он корректно мёрджится и diff-ится в git; Word и PDF — бинарники, в них git видит только «файл изменился целиком».",[61,1359,1360],{},"Писать Markdown учишься за 15 минут, этот навык пригодится везде: GitLab, GitHub, Notion, большинство вики, документация опенсорсных проектов.",[15,1362,1363],{},[39,1364,1365,1366,1179],{},"Обязательная структура ",[22,1367,1303],{},[195,1369,1373],{"className":1370,"code":1371,"language":1372,"meta":203,"style":203},"language-markdown shiki shiki-themes github-light github-dark","# Лабораторная \u003CNN>. \u003CНазвание работы>\n\n**Студент:** Иванов Иван Иванович, группа \u003CХХХ-123>\n**Дата сдачи:** 2026-04-15\n\n## Цель работы\n\nОдно-два предложения: что именно осваивается на этой работе.\n\n## Задание\n\nКраткий пересказ задания своими словами — чтобы отчёт был понятен без открытия методички.\n\n## Ход выполнения\n\nОписание того, как вы решали задание, в хронологическом порядке. По шагам: что сделали, чем пользовались, какие трудности встретили и как решали. Сюда же — фрагменты кода (в ``` блоках ```), ссылки на файлы решения, скриншоты (кладите в `lab-XX\u002Fscreenshots\u002F` и вставляйте как `![подпись](screenshots\u002Fимя.png)`).\n\n## Результаты\n\nЧто получилось в итоге. Ссылки на ключевые файлы решения. Если задание требовало запустить что-то и увидеть результат — скриншот итогового состояния.\n\n## Ответы на контрольные вопросы\n\nЕсли в задании есть контрольные вопросы — ответьте на них по порядку, списком. Без этого раздела работа не защищается.\n\n## Выводы\n\nДва-три предложения: чему научились, какой инструмент освоили, где это пригодится.\n\n## Источники\n\nСписок материалов, которыми пользовались помимо методички: статьи, документация, видео. С прямыми ссылками.\n","markdown",[22,1374,1375,1380,1386,1391,1396,1400,1406,1411,1417,1422,1428,1433,1439,1444,1450,1455,1461,1466,1472,1477,1483,1488,1494,1499,1505,1510,1516,1521,1527,1532,1538,1543],{"__ignoreMap":203},[604,1376,1377],{"class":606,"line":607},[604,1378,1379],{},"# Лабораторная \u003CNN>. \u003CНазвание работы>\n",[604,1381,1382],{"class":606,"line":657},[604,1383,1385],{"emptyLinePlaceholder":1384},true,"\n",[604,1387,1388],{"class":606,"line":672},[604,1389,1390],{},"**Студент:** Иванов Иван Иванович, группа \u003CХХХ-123>\n",[604,1392,1393],{"class":606,"line":687},[604,1394,1395],{},"**Дата сдачи:** 2026-04-15\n",[604,1397,1398],{"class":606,"line":702},[604,1399,1385],{"emptyLinePlaceholder":1384},[604,1401,1403],{"class":606,"line":1402},6,[604,1404,1405],{},"## Цель работы\n",[604,1407,1409],{"class":606,"line":1408},7,[604,1410,1385],{"emptyLinePlaceholder":1384},[604,1412,1414],{"class":606,"line":1413},8,[604,1415,1416],{},"Одно-два предложения: что именно осваивается на этой работе.\n",[604,1418,1420],{"class":606,"line":1419},9,[604,1421,1385],{"emptyLinePlaceholder":1384},[604,1423,1425],{"class":606,"line":1424},10,[604,1426,1427],{},"## Задание\n",[604,1429,1431],{"class":606,"line":1430},11,[604,1432,1385],{"emptyLinePlaceholder":1384},[604,1434,1436],{"class":606,"line":1435},12,[604,1437,1438],{},"Краткий пересказ задания своими словами — чтобы отчёт был понятен без открытия методички.\n",[604,1440,1442],{"class":606,"line":1441},13,[604,1443,1385],{"emptyLinePlaceholder":1384},[604,1445,1447],{"class":606,"line":1446},14,[604,1448,1449],{},"## Ход выполнения\n",[604,1451,1453],{"class":606,"line":1452},15,[604,1454,1385],{"emptyLinePlaceholder":1384},[604,1456,1458],{"class":606,"line":1457},16,[604,1459,1460],{},"Описание того, как вы решали задание, в хронологическом порядке. По шагам: что сделали, чем пользовались, какие трудности встретили и как решали. Сюда же — фрагменты кода (в ``` блоках ```), ссылки на файлы решения, скриншоты (кладите в `lab-XX\u002Fscreenshots\u002F` и вставляйте как `![подпись](screenshots\u002Fимя.png)`).\n",[604,1462,1464],{"class":606,"line":1463},17,[604,1465,1385],{"emptyLinePlaceholder":1384},[604,1467,1469],{"class":606,"line":1468},18,[604,1470,1471],{},"## Результаты\n",[604,1473,1475],{"class":606,"line":1474},19,[604,1476,1385],{"emptyLinePlaceholder":1384},[604,1478,1480],{"class":606,"line":1479},20,[604,1481,1482],{},"Что получилось в итоге. Ссылки на ключевые файлы решения. Если задание требовало запустить что-то и увидеть результат — скриншот итогового состояния.\n",[604,1484,1486],{"class":606,"line":1485},21,[604,1487,1385],{"emptyLinePlaceholder":1384},[604,1489,1491],{"class":606,"line":1490},22,[604,1492,1493],{},"## Ответы на контрольные вопросы\n",[604,1495,1497],{"class":606,"line":1496},23,[604,1498,1385],{"emptyLinePlaceholder":1384},[604,1500,1502],{"class":606,"line":1501},24,[604,1503,1504],{},"Если в задании есть контрольные вопросы — ответьте на них по порядку, списком. Без этого раздела работа не защищается.\n",[604,1506,1508],{"class":606,"line":1507},25,[604,1509,1385],{"emptyLinePlaceholder":1384},[604,1511,1513],{"class":606,"line":1512},26,[604,1514,1515],{},"## Выводы\n",[604,1517,1519],{"class":606,"line":1518},27,[604,1520,1385],{"emptyLinePlaceholder":1384},[604,1522,1524],{"class":606,"line":1523},28,[604,1525,1526],{},"Два-три предложения: чему научились, какой инструмент освоили, где это пригодится.\n",[604,1528,1530],{"class":606,"line":1529},29,[604,1531,1385],{"emptyLinePlaceholder":1384},[604,1533,1535],{"class":606,"line":1534},30,[604,1536,1537],{},"## Источники\n",[604,1539,1541],{"class":606,"line":1540},31,[604,1542,1385],{"emptyLinePlaceholder":1384},[604,1544,1546],{"class":606,"line":1545},32,[604,1547,1548],{},"Список материалов, которыми пользовались помимо методички: статьи, документация, видео. С прямыми ссылками.\n",[15,1550,1551],{},"Разделы, которые не применимы к конкретной работе (например, в задании нет контрольных вопросов), можно опускать — но не переименовывать и не путать порядок.",[15,1553,1554,1555,25,1558,1561,1562,1566],{},"Если вы раньше не писали в Markdown — освойте за один вечер. Минимум, которым нужно владеть: заголовки (",[22,1556,1557],{},"#",[22,1559,1560],{},"##","), списки, ссылки, изображения, блоки кода, таблицы, выделение жирным\u002Fкурсивом. Справочники и спецификации — в ",[126,1563,1565],{"href":1564},"#12-%D1%87%D1%82%D0%BE-%D1%87%D0%B8%D1%82%D0%B0%D1%82%D1%8C-%D0%B4%D0%B0%D0%BB%D1%8C%D1%88%D0%B5","разделе 12","; начать проще всего с Markdown Guide и «Доки», остальное пригодится, когда столкнётесь с нюансами.",[15,1568,1569,1570,1573,1574,755],{},"Проверяйте отчёт ",[39,1571,1572],{},"на GitLab",", а не только в редакторе: именно так его увидит преподаватель. Для локального предпросмотра — встроенный Markdown Preview в VS Code (",[22,1575,1576],{},"Ctrl+Shift+V",[31,1578,1580],{"id":1579},"_6-клонирование-проекта-и-первый-коммит","6. Клонирование проекта и первый коммит",[47,1582,1584],{"id":1583},"_61-клонирование","6.1. Клонирование",[15,1586,1587],{},"Получить копию только что созданного проекта на свой компьютер:",[205,1589,1590,1600,1674],{},[61,1591,1592,1593,1596,1597,132],{},"На странице проекта в GitLab в правом верхнем углу нажать ",[39,1594,1595],{},"Code → Clone with HTTPS"," → кнопка копирования. Получите URL вида ",[22,1598,1599],{},"https:\u002F\u002Fgit.aidt.online\u002F\u003Cваш-логин>\u002F\u003Ccourse-slug>.git",[61,1601,1602,1603,1606,1607],{},"В терминале перейти в папку, где вы храните учебные проекты (не прямо в Documents, а в отдельную папку, например ",[22,1604,1605],{},"~\u002Fprojects\u002F","):\n",[195,1608,1610],{"className":598,"code":1609,"language":600,"meta":203,"style":203},"cd ~\u002Fprojects\ngit clone https:\u002F\u002Fgit.aidt.online\u002F\u003Cваш-логин>\u002F\u003Ccourse-slug>.git\ncd \u003Ccourse-slug>\n",[22,1611,1612,1620,1660],{"__ignoreMap":203},[604,1613,1614,1617],{"class":606,"line":607},[604,1615,1616],{"class":613},"cd",[604,1618,1619],{"class":644}," ~\u002Fprojects\n",[604,1621,1622,1624,1627,1630,1634,1637,1641,1644,1647,1649,1652,1655,1657],{"class":606,"line":657},[604,1623,567],{"class":610},[604,1625,1626],{"class":644}," clone",[604,1628,1629],{"class":644}," https:\u002F\u002Fgit.aidt.online\u002F",[604,1631,1633],{"class":1632},"szBVR","\u003C",[604,1635,1636],{"class":644},"ваш-логи",[604,1638,1640],{"class":1639},"sVt8B","н",[604,1642,1643],{"class":1632},">",[604,1645,1646],{"class":644},"\u002F",[604,1648,1633],{"class":1632},[604,1650,1651],{"class":644},"course-slu",[604,1653,1654],{"class":1639},"g",[604,1656,1643],{"class":1632},[604,1658,1659],{"class":644},".git\n",[604,1661,1662,1664,1667,1669,1671],{"class":606,"line":672},[604,1663,1616],{"class":613},[604,1665,1666],{"class":1632}," \u003C",[604,1668,1651],{"class":644},[604,1670,1654],{"class":1639},[604,1672,1673],{"class":1632},">\n",[61,1675,1676,1677,1680,1681,1684,1685,755],{},"Git попросит логин и токен (в первый раз); введите их. После — команда завершится и в папке ",[22,1678,1679],{},"\u003Ccourse-slug>\u002F"," появятся файлы проекта (пока только ",[22,1682,1683],{},"README.md"," и скрытый ",[22,1686,79],{},[15,1688,1689,1690,132],{},"Если клонирование падает с ошибкой — см. ",[126,1691,1693],{"href":1692},"#10-%D1%87%D0%B0%D1%81%D1%82%D1%8B%D0%B5-%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B8-%D0%B8-%D0%BA%D0%B0%D0%BA-%D0%B8%D1%85-%D0%B8%D0%B7%D0%B1%D0%B5%D0%B6%D0%B0%D1%82%D1%8C","раздел 10",[47,1695,1697,1698],{"id":1696},"_62-файл-gitignore","6.2. Файл ",[22,1699,1700],{},".gitignore",[15,1702,1703,1704,1706,1707,1710],{},"Создайте в корне проекта файл ",[22,1705,1700],{}," — список путей, которые git должен ",[39,1708,1709],{},"игнорировать",". Без него в репозиторий попадут системные и редакторские файлы, которые там не нужны.",[15,1712,1713,1714,1716],{},"Универсальное содержимое ",[22,1715,1700],{},", подходящее для большинства курсов:",[195,1718,1721],{"className":1719,"code":1720,"language":200},[198],"# Операционная система\n.DS_Store\nThumbs.db\n\n# Редакторы и IDE\n.vscode\u002F\n.idea\u002F\n*.swp\n*~\n\n# Зависимости и сборки (для курсов с Node.js\u002Fфронтендом)\nnode_modules\u002F\ndist\u002F\nbuild\u002F\n.cache\u002F\n\n# Переменные окружения — часто содержат секреты\n.env\n.env.local\n",[22,1722,1720],{"__ignoreMap":203},[15,1724,1725,1726,25,1729,1732,1733,1736,1737,25,1740,1743,1744,132],{},"Если в вашем курсе используются другие языки и инструменты — добавьте соответствующие строки (например, ",[22,1727,1728],{},"__pycache__\u002F",[22,1730,1731],{},"*.pyc"," для Python; ",[22,1734,1735],{},"target\u002F"," для Rust\u002FMaven; ",[22,1738,1739],{},"bin\u002F",[22,1741,1742],{},"obj\u002F"," для .NET). Готовые шаблоны для разных экосистем — на ",[126,1745,1748],{"href":1746,"rel":1747},"https:\u002F\u002Fgithub.com\u002Fgithub\u002Fgitignore",[130],"github.com\u002Fgithub\u002Fgitignore",[15,1750,1751,1754,1755,1757,1758,1761],{},[39,1752,1753],{},"Что делать, если эти файлы уже закоммичены:"," добавьте их в ",[22,1756,1700],{},", потом удалите из индекса командой ",[22,1759,1760],{},"git rm --cached \u003Cпуть>",", закоммитьте удаление.",[47,1763,1765],{"id":1764},"_63-первая-попытка-коммита","6.3. Первая попытка коммита",[15,1767,1768,1769,1771],{},"Создайте ",[22,1770,1700],{}," содержимым из предыдущего пункта и сделайте первый коммит:",[195,1773,1775],{"className":598,"code":1774,"language":600,"meta":203,"style":203},"git status                              # посмотреть, что git видит — увидите .gitignore в untracked\ngit add .gitignore                      # добавить в индекс\ngit status                              # теперь файл в staging\ngit commit -m \"Добавить .gitignore\"     # зафиксировать в историю\ngit push                                # отправить на сервер\n",[22,1776,1777,1788,1801,1810,1826],{"__ignoreMap":203},[604,1778,1779,1781,1784],{"class":606,"line":607},[604,1780,567],{"class":610},[604,1782,1783],{"class":644}," status",[604,1785,1787],{"class":1786},"sJ8bj","                              # посмотреть, что git видит — увидите .gitignore в untracked\n",[604,1789,1790,1792,1795,1798],{"class":606,"line":657},[604,1791,567],{"class":610},[604,1793,1794],{"class":644}," add",[604,1796,1797],{"class":644}," .gitignore",[604,1799,1800],{"class":1786},"                      # добавить в индекс\n",[604,1802,1803,1805,1807],{"class":606,"line":672},[604,1804,567],{"class":610},[604,1806,1783],{"class":644},[604,1808,1809],{"class":1786},"                              # теперь файл в staging\n",[604,1811,1812,1814,1817,1820,1823],{"class":606,"line":687},[604,1813,567],{"class":610},[604,1815,1816],{"class":644}," commit",[604,1818,1819],{"class":613}," -m",[604,1821,1822],{"class":644}," \"Добавить .gitignore\"",[604,1824,1825],{"class":1786},"     # зафиксировать в историю\n",[604,1827,1828,1830,1833],{"class":606,"line":702},[604,1829,567],{"class":610},[604,1831,1832],{"class":644}," push",[604,1834,1835],{"class":1786},"                                # отправить на сервер\n",[15,1837,1838,1839,1841],{},"После ",[22,1840,492],{}," обновите страницу проекта в GitLab — увидите новый коммит в истории.",[31,1843,1845],{"id":1844},"_7-работа-над-заданием","7. Работа над заданием",[15,1847,1848],{},"Дальнейший цикл повторяется для каждой лабораторной \u002F домашней работы.",[47,1850,1852],{"id":1851},"_71-начать-новую-ветку","7.1. Начать новую ветку",[15,1854,1855,1856,1858],{},"Перед началом любой работы — обновить локальный ",[22,1857,391],{}," и создать от него рабочую ветку:",[195,1860,1862],{"className":598,"code":1861,"language":600,"meta":203,"style":203},"git switch main                 # переключиться на main\ngit pull                        # подтянуть последние изменения с сервера\ngit switch -c lab-01\u002Fv1         # создать новую ветку и сразу на неё перейти\n",[22,1863,1864,1877,1887],{"__ignoreMap":203},[604,1865,1866,1868,1871,1874],{"class":606,"line":607},[604,1867,567],{"class":610},[604,1869,1870],{"class":644}," switch",[604,1872,1873],{"class":644}," main",[604,1875,1876],{"class":1786},"                 # переключиться на main\n",[604,1878,1879,1881,1884],{"class":606,"line":657},[604,1880,567],{"class":610},[604,1882,1883],{"class":644}," pull",[604,1885,1886],{"class":1786},"                        # подтянуть последние изменения с сервера\n",[604,1888,1889,1891,1893,1896,1899],{"class":606,"line":672},[604,1890,567],{"class":610},[604,1892,1870],{"class":644},[604,1894,1895],{"class":613}," -c",[604,1897,1898],{"class":644}," lab-01\u002Fv1",[604,1900,1901],{"class":1786},"         # создать новую ветку и сразу на неё перейти\n",[15,1903,1904],{},"Разбор:",[58,1906,1907,1913,1918],{},[61,1908,1909,1912],{},[22,1910,1911],{},"git switch main"," — переключение между ветками.",[61,1914,1915,1917],{},[22,1916,500],{}," — скачивает свежее состояние с сервера. Актуально, если вы принимали чужие правки или сливали прошлые работы с другого устройства.",[61,1919,1920,1923,1924,1927,1928,1931],{},[22,1921,1922],{},"git switch -c \u003Cимя>"," — флаг ",[22,1925,1926],{},"-c"," означает ",[150,1929,1930],{},"create",": создать новую ветку от текущего коммита и сразу переключиться на неё.",[47,1933,1935],{"id":1934},"_72-цикл-правка-коммит","7.2. Цикл «правка — коммит»",[15,1937,1938],{},"Пока вы пишете код, повторяется этот цикл:",[195,1940,1942],{"className":598,"code":1941,"language":600,"meta":203,"style":203},"# 1. Редактируете файлы в редакторе (VS Code, WebStorm, любой)\n\n# 2. Посмотреть, что изменилось\ngit status                      # списком\ngit diff                        # построчно (q — выход)\n\n# 3. Добавить конкретные изменения в индекс\ngit add lab-01\u002Findex.html       # только этот файл\ngit add .                       # ВСЁ изменённое сразу (осторожно — может подхватить лишнее)\n\n# 4. Зафиксировать\ngit commit -m \"Добавить разметку карточек дисциплин\"\n\n# 5. Повторять шаги 1–4 после каждой смысловой порции работы\n",[22,1943,1944,1949,1953,1958,1967,1977,1981,1986,1998,2010,2014,2019,2030,2034],{"__ignoreMap":203},[604,1945,1946],{"class":606,"line":607},[604,1947,1948],{"class":1786},"# 1. Редактируете файлы в редакторе (VS Code, WebStorm, любой)\n",[604,1950,1951],{"class":606,"line":657},[604,1952,1385],{"emptyLinePlaceholder":1384},[604,1954,1955],{"class":606,"line":672},[604,1956,1957],{"class":1786},"# 2. Посмотреть, что изменилось\n",[604,1959,1960,1962,1964],{"class":606,"line":687},[604,1961,567],{"class":610},[604,1963,1783],{"class":644},[604,1965,1966],{"class":1786},"                      # списком\n",[604,1968,1969,1971,1974],{"class":606,"line":702},[604,1970,567],{"class":610},[604,1972,1973],{"class":644}," diff",[604,1975,1976],{"class":1786},"                        # построчно (q — выход)\n",[604,1978,1979],{"class":606,"line":1402},[604,1980,1385],{"emptyLinePlaceholder":1384},[604,1982,1983],{"class":606,"line":1408},[604,1984,1985],{"class":1786},"# 3. Добавить конкретные изменения в индекс\n",[604,1987,1988,1990,1992,1995],{"class":606,"line":1413},[604,1989,567],{"class":610},[604,1991,1794],{"class":644},[604,1993,1994],{"class":644}," lab-01\u002Findex.html",[604,1996,1997],{"class":1786},"       # только этот файл\n",[604,1999,2000,2002,2004,2007],{"class":606,"line":1419},[604,2001,567],{"class":610},[604,2003,1794],{"class":644},[604,2005,2006],{"class":644}," .",[604,2008,2009],{"class":1786},"                       # ВСЁ изменённое сразу (осторожно — может подхватить лишнее)\n",[604,2011,2012],{"class":606,"line":1424},[604,2013,1385],{"emptyLinePlaceholder":1384},[604,2015,2016],{"class":606,"line":1430},[604,2017,2018],{"class":1786},"# 4. Зафиксировать\n",[604,2020,2021,2023,2025,2027],{"class":606,"line":1435},[604,2022,567],{"class":610},[604,2024,1816],{"class":644},[604,2026,1819],{"class":613},[604,2028,2029],{"class":644}," \"Добавить разметку карточек дисциплин\"\n",[604,2031,2032],{"class":606,"line":1441},[604,2033,1385],{"emptyLinePlaceholder":1384},[604,2035,2036],{"class":606,"line":1446},[604,2037,2038],{"class":1786},"# 5. Повторять шаги 1–4 после каждой смысловой порции работы\n",[15,2040,2041],{},[39,2042,2043],{},"Почему часто коммитить — хорошо:",[58,2045,2046,2049,2052],{},[61,2047,2048],{},"Каждый коммит — точка, к которой вы можете откатиться, если следующая идея не сработает.",[61,2050,2051],{},"По журналу легко вспомнить, что и когда вы делали.",[61,2053,2054],{},"Преподавателю проще ревьюить маленькие осмысленные коммиты, чем один большой «всё подряд».",[15,2056,2057,2060],{},[39,2058,2059],{},"Как часто коммитить"," — по каждому смысловому шагу. Разметили шапку — коммит. Разметили секцию дисциплин — коммит. Поправили вложенность тегов — отдельный коммит.",[47,2062,2064],{"id":2063},"_73-отправка-на-сервер","7.3. Отправка на сервер",[15,2066,2067],{},"Периодически (минимум — в конце каждого учебного дня) отправляйте свои коммиты на сервер:",[195,2069,2071],{"className":598,"code":2070,"language":600,"meta":203,"style":203},"git push -u origin lab-01\u002Fv1    # первый push новой ветки, флаг -u привязывает её к серверу\ngit push                         # все следующие — просто git push\n",[22,2072,2073,2090],{"__ignoreMap":203},[604,2074,2075,2077,2079,2082,2085,2087],{"class":606,"line":607},[604,2076,567],{"class":610},[604,2078,1832],{"class":644},[604,2080,2081],{"class":613}," -u",[604,2083,2084],{"class":644}," origin",[604,2086,1898],{"class":644},[604,2088,2089],{"class":1786},"    # первый push новой ветки, флаг -u привязывает её к серверу\n",[604,2091,2092,2094,2096],{"class":606,"line":657},[604,2093,567],{"class":610},[604,2095,1832],{"class":644},[604,2097,2098],{"class":1786},"                         # все следующие — просто git push\n",[15,2100,2101,2102,2105,2106,2108,2109,2112],{},"После первого ",[22,2103,2104],{},"git push -u"," git запоминает, что локальная ветка ",[22,2107,440],{}," связана с одноимённой веткой на сервере. Это называется ",[39,2110,2111],{},"upstream",". Следующие push и pull этой ветки работают без уточнений.",[15,2114,2115],{},[39,2116,2117],{},"Почему пушить важно не только перед сдачей:",[58,2119,2120,2123,2126],{},[61,2121,2122],{},"Если ноутбук сломается — работа не пропадёт.",[61,2124,2125],{},"Преподаватель может посмотреть промежуточное состояние и подсказать раньше, чем вы вообще откроете MR.",[61,2127,2128],{},"Вы сможете продолжить работать с другого устройства, просто клонировав проект.",[47,2130,2132],{"id":2131},"_74-полезные-команды","7.4. Полезные команды",[58,2134,2135,2147,2155,2163,2171,2182,2190,2202,2210],{},[61,2136,2137,2142,2143,2146],{},[39,2138,2139],{},[22,2140,2141],{},"git log --oneline"," — история коммитов в виде одной строки на коммит. ",[22,2144,2145],{},"q"," — выйти из пейджера.",[61,2148,2149,2154],{},[39,2150,2151],{},[22,2152,2153],{},"git log --oneline --graph --all"," — то же, но с визуальным графом веток. Полезно, когда не понимаете, где вы в истории.",[61,2156,2157,2162],{},[39,2158,2159],{},[22,2160,2161],{},"git diff"," — что изменилось в рабочей папке против последнего коммита.",[61,2164,2165,2170],{},[39,2166,2167],{},[22,2168,2169],{},"git diff --staged"," — что лежит в индексе и попадёт в следующий коммит.",[61,2172,2173,1147,2178,2181],{},[39,2174,2175],{},[22,2176,2177],{},"git restore \u003Cфайл>",[39,2179,2180],{},"необратимо"," откатить изменения в файле до последнего коммита. Осторожно, несохранённая работа пропадёт.",[61,2183,2184,2189],{},[39,2185,2186],{},[22,2187,2188],{},"git restore --staged \u003Cфайл>"," — убрать файл из индекса (не трогает содержимое, просто «разстейджит»).",[61,2191,2192,2197,2198,2201],{},[39,2193,2194],{},[22,2195,2196],{},"git commit --amend"," — изменить последний коммит (сообщение или добавить забытый файл). ",[39,2199,2200],{},"Только"," если коммит ещё не запушен на сервер. После push — нельзя.",[61,2203,2204,2209],{},[39,2205,2206],{},[22,2207,2208],{},"git switch \u003Cветка>"," — переключиться на существующую ветку.",[61,2211,2212,2217],{},[39,2213,2214],{},[22,2215,2216],{},"git branch"," — список локальных веток. Текущая помечена звёздочкой.",[31,2219,2221],{"id":2220},"_8-merge-request-и-защита","8. Merge Request и защита",[15,2223,2224,2225,2228],{},"Когда работа в ветке закончена, все коммиты запушены, отчёт лежит в ",[22,2226,2227],{},"lab-XX\u002Freport.md"," — пора открывать Merge Request.",[47,2230,2232],{"id":2231},"_81-открыть-mr","8.1. Открыть MR",[205,2234,2235,2240,2252,2307],{},[61,2236,2237,2238,132],{},"Убедитесь, что ветка актуальна на сервере: ",[22,2239,492],{},[61,2241,2242,2243,2245,2246,2248,2249,132],{},"Открыть проект в GitLab. Сверху часто всплывает баннер «You pushed to ",[22,2244,440],{}," just now. Create merge request». Кликнуть — сразу попадёте в форму создания MR.",[1208,2247],{},"Альтернативно: слева ",[39,2250,2251],{},"Merge Requests → New merge request",[61,2253,2254,2255],{},"Параметры MR:",[58,2256,2257,2264,2271,2280,2290,2296],{},[61,2258,2259,1147,2262,132],{},[39,2260,2261],{},"Source branch",[22,2263,440],{},[61,2265,2266,1147,2269,132],{},[39,2267,2268],{},"Target branch",[22,2270,391],{},[61,2272,2273,1147,2276,2279],{},[39,2274,2275],{},"Title",[22,2277,2278],{},"Лабораторная 01. \u003CКороткое название задания>"," (формат: номер + короткое название задания).",[61,2281,2282,2285,2286,2289],{},[39,2283,2284],{},"Description"," — одно-два предложения о составе изменений, ссылка на ",[22,2287,2288],{},"lab-01\u002Freport.md",", если требуется приложить скриншот (например, валидатора) — перетащите файл прямо в поле описания, GitLab загрузит и вставит ссылку.",[61,2291,2292,2295],{},[39,2293,2294],{},"Reviewers"," — преподаватель курса (начните вводить, выберите из списка).",[61,2297,2298,2301,2302,2304,2305,132],{},[39,2299,2300],{},"Delete source branch when merge request is accepted"," — ✅ оставить галочку. После merge ветка ",[22,2303,440],{}," удалится с сервера — это нормально, её история уже в ",[22,2306,391],{},[61,2308,2309,132],{},[39,2310,2311],{},"Create merge request",[47,2313,2315],{"id":2314},"_82-защита-в-обсуждениях","8.2. Защита в обсуждениях",[15,2317,2318,2319,1179],{},"Дальше начинается ",[39,2320,2321],{},"code review",[58,2323,2324,2331,2342,2366],{},[61,2325,2326,2327,2330],{},"Преподаватель открывает вкладку ",[39,2328,2329],{},"Changes"," в MR, читает diff.",[61,2332,2333,2334,2337,2338,2341],{},"Оставляет ",[39,2335,2336],{},"inline-замечания"," — комментарии, привязанные к конкретным строкам кода. Каждое замечание становится отдельной ",[39,2339,2340],{},"дискуссией"," (thread).",[61,2343,2344,2345,2348,2349,2351,2352],{},"Вы видите замечания во вкладке ",[39,2346,2347],{},"Overview"," или ",[39,2350,2329],{},". На каждое нужно ответить:\n",[58,2353,2354,2360],{},[61,2355,2356,2359],{},[39,2357,2358],{},"Коммитом",", исправляющим проблему. Закоммитили → запушили → коммит автоматически появляется в MR, дискуссия обновляется.",[61,2361,2362,2365],{},[39,2363,2364],{},"Текстом",", если вы не согласны или хотите обсудить.",[61,2367,2368,2369,2372,2373,132],{},"Когда замечание закрыто, преподаватель помечает дискуссию ",[39,2370,2371],{},"Resolve thread",". Когда все дискуссии Resolved — преподаватель ставит ",[39,2374,2375],{},"Approve",[15,2377,2378,2379,2382,2383,2386],{},"После Approve кнопка ",[39,2380,2381],{},"Merge"," становится активной. ",[39,2384,2385],{},"Мёрджит MR сам студент"," — это часть сдачи, осознанное подтверждение, что работа завершена.",[15,2388,2389],{},"После Merge:",[58,2391,2392,2398,2407],{},[61,2393,2394,2395,2397],{},"ветка ",[22,2396,440],{}," удаляется автоматически;",[61,2399,2400,2401,2403,2404,2406],{},"ваши коммиты появляются в ",[22,2402,391],{}," (в веб-интерфейсе и после ",[22,2405,500],{}," у вас локально);",[61,2408,2409,2410,132],{},"вы готовы начинать ",[22,2411,443],{},[47,2413,2415],{"id":2414},"_83-очная-защита","8.3. Очная защита",[15,2417,2418,2419,2422],{},"Часть замечаний и контрольные вопросы разбираются ",[39,2420,2421],{},"очно"," на практическом занятии. К защите студент приходит:",[58,2424,2425,2428,2431,2434],{},[61,2426,2427],{},"с открытой страницей в браузере;",[61,2429,2430],{},"с открытым проектом в GitLab;",[61,2432,2433],{},"готовым отвечать на контрольные вопросы по материалам соответствующей темы;",[61,2435,2436],{},"готовым показать своё решение, обосновать выбор подхода, продемонстрировать работу в браузере\u002Fинструменте, если применимо.",[15,2438,2439],{},"После очной защиты преподаватель ставит Approve в MR, студент мёрджит.",[31,2441,2443],{"id":2442},"_9-доработка-после-ревью","9. Доработка после ревью",[15,2445,2446],{},"Если MR вернули на доработку — спокойно. Это стандартная часть процесса, не двойка.",[47,2448,2450],{"id":2449},"_91-обычная-доработка","9.1. Обычная доработка",[15,2452,2453,2454,564,2457,1179],{},"Правки замечаний делаются ",[39,2455,2456],{},"в той же ветке",[22,2458,440],{},[195,2460,2462],{"className":598,"code":2461,"language":600,"meta":203,"style":203},"git switch lab-01\u002Fv1            # вернуться в свою ветку (если вдруг ушли)\n# правите файлы по замечаниям\ngit add \u003Cфайлы>\ngit commit -m \"Исправить уровни заголовков по замечаниям ревью\"\ngit push\n",[22,2463,2464,2475,2480,2496,2507],{"__ignoreMap":203},[604,2465,2466,2468,2470,2472],{"class":606,"line":607},[604,2467,567],{"class":610},[604,2469,1870],{"class":644},[604,2471,1898],{"class":644},[604,2473,2474],{"class":1786},"            # вернуться в свою ветку (если вдруг ушли)\n",[604,2476,2477],{"class":606,"line":657},[604,2478,2479],{"class":1786},"# правите файлы по замечаниям\n",[604,2481,2482,2484,2486,2488,2491,2494],{"class":606,"line":672},[604,2483,567],{"class":610},[604,2485,1794],{"class":644},[604,2487,1666],{"class":1632},[604,2489,2490],{"class":644},"файл",[604,2492,2493],{"class":1639},"ы",[604,2495,1673],{"class":1632},[604,2497,2498,2500,2502,2504],{"class":606,"line":687},[604,2499,567],{"class":610},[604,2501,1816],{"class":644},[604,2503,1819],{"class":613},[604,2505,2506],{"class":644}," \"Исправить уровни заголовков по замечаниям ревью\"\n",[604,2508,2509,2511],{"class":606,"line":702},[604,2510,567],{"class":610},[604,2512,2513],{"class":644}," push\n",[15,2515,2516,2517,2520],{},"Merge Request автоматически подхватит новые коммиты. В дискуссиях GitLab покажет, что добавились коммиты ",[22,2518,2519],{},"X, Y, Z"," с прошлого push. Ответьте на замечания в тех тредах, которые правили, и попросите преподавателя посмотреть ещё раз.",[47,2522,2524],{"id":2523},"_92-глубокая-переделка-с-нуля","9.2. Глубокая переделка с нуля",[15,2526,2527],{},"Если работа не принимается в принципе и нужно переделывать с чистого листа:",[205,2529,2530,2537,2574],{},[61,2531,2532,2533,2536],{},"Закрыть старый MR без мёрджа кнопкой ",[39,2534,2535],{},"Close merge request",". В комментарии указать: «Отзываю, переделываю, открою v2».",[61,2538,2539,2540,2542,2543],{},"Завести новую ветку от актуального ",[22,2541,391],{},":\n",[195,2544,2546],{"className":598,"code":2545,"language":600,"meta":203,"style":203},"git switch main\ngit pull\ngit switch -c lab-01\u002Fv2\n",[22,2547,2548,2556,2563],{"__ignoreMap":203},[604,2549,2550,2552,2554],{"class":606,"line":607},[604,2551,567],{"class":610},[604,2553,1870],{"class":644},[604,2555,684],{"class":644},[604,2557,2558,2560],{"class":606,"line":657},[604,2559,567],{"class":610},[604,2561,2562],{"class":644}," pull\n",[604,2564,2565,2567,2569,2571],{"class":606,"line":672},[604,2566,567],{"class":610},[604,2568,1870],{"class":644},[604,2570,1895],{"class":613},[604,2572,2573],{"class":644}," lab-01\u002Fv2\n",[61,2575,2576,2577,132],{},"Работать как обычно, в итоге открыть новый MR в ",[22,2578,391],{},[31,2580,2582],{"id":2581},"_10-частые-ошибки-и-как-их-избежать","10. Частые ошибки и как их избежать",[58,2584,2585,2656,2695,2725,2790,2835,2892,2898,2916],{},[61,2586,2587,2590,2591,2593,2594,2597,2598],{},[39,2588,2589],{},"«Push отклонён: protected branch main»."," Вы пытаетесь запушить прямо в ",[22,2592,391],{},". Это запрещено настройкой. Правильно: создайте ветку ",[22,2595,2596],{},"lab-XX\u002Fv1",", коммитьте туда, пушьте, открывайте MR. Команда «вернуть всё в свою ветку»:",[195,2599,2601],{"className":598,"code":2600,"language":600,"meta":203,"style":203},"git switch -c lab-XX\u002Fv1        # создать ветку из текущего состояния\ngit push -u origin lab-XX\u002Fv1   # запушить уже сюда\ngit switch main\ngit reset --hard origin\u002Fmain   # ОСТОРОЖНО: откатить main к серверному состоянию\n",[22,2602,2603,2617,2632,2640],{"__ignoreMap":203},[604,2604,2605,2607,2609,2611,2614],{"class":606,"line":607},[604,2606,567],{"class":610},[604,2608,1870],{"class":644},[604,2610,1895],{"class":613},[604,2612,2613],{"class":644}," lab-XX\u002Fv1",[604,2615,2616],{"class":1786},"        # создать ветку из текущего состояния\n",[604,2618,2619,2621,2623,2625,2627,2629],{"class":606,"line":657},[604,2620,567],{"class":610},[604,2622,1832],{"class":644},[604,2624,2081],{"class":613},[604,2626,2084],{"class":644},[604,2628,2613],{"class":644},[604,2630,2631],{"class":1786},"   # запушить уже сюда\n",[604,2633,2634,2636,2638],{"class":606,"line":672},[604,2635,567],{"class":610},[604,2637,1870],{"class":644},[604,2639,684],{"class":644},[604,2641,2642,2644,2647,2650,2653],{"class":606,"line":687},[604,2643,567],{"class":610},[604,2645,2646],{"class":644}," reset",[604,2648,2649],{"class":613}," --hard",[604,2651,2652],{"class":644}," origin\u002Fmain",[604,2654,2655],{"class":1786},"   # ОСТОРОЖНО: откатить main к серверному состоянию\n",[61,2657,2658,2661,2662,2666,2667],{},[39,2659,2660],{},"«Authentication failed»."," Неправильный токен (см. ",[126,2663,2665],{"href":2664},"#3-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF-%D0%BA-gitaidtonline-%D0%BF%D0%BE-https","раздел 3","). Вариант 99%: вы ввели пароль от аккаунта вместо Personal Access Token. Перечитайте 3.3 и попробуйте снова. Если credential helper уже сохранил неправильные данные — их нужно очистить:",[58,2668,2669,2676,2685],{},[61,2670,2671,2672,2675],{},"Windows: Control Panel → Credential Manager → найти запись ",[22,2673,2674],{},"git:https:\u002F\u002Fgit.aidt.online"," → удалить.",[61,2677,2678,2679,2682,2683,2675],{},"macOS: ",[22,2680,2681],{},"Keychain Access"," → найти ",[22,2684,131],{},[61,2686,2687,2688,2691,2692,132],{},"Linux с ",[22,2689,2690],{},"credential.helper=store",": удалить запись из ",[22,2693,2694],{},"~\u002F.git-credentials",[61,2696,2697,2702,2703],{},[39,2698,2699,2700,132],{},"«Divergent branches» при ",[22,2701,500],{}," Возникает, если на сервере ветка ушла вперёд одним способом, а у вас локально — другим. Обычно значит, что кто-то (или вы сами с другого устройства) запушил коммиты, и у вас своих локальных есть параллельно. Решение:",[195,2704,2706],{"className":598,"code":2705,"language":600,"meta":203,"style":203},"git pull --no-rebase         # сделает merge, git попросит ввести сообщение merge-коммита\n# :wq в редакторе vim, или Ctrl+X → Y → Enter в nano — подтвердить и выйти\n",[22,2707,2708,2720],{"__ignoreMap":203},[604,2709,2710,2712,2714,2717],{"class":606,"line":607},[604,2711,567],{"class":610},[604,2713,1883],{"class":644},[604,2715,2716],{"class":613}," --no-rebase",[604,2718,2719],{"class":1786},"         # сделает merge, git попросит ввести сообщение merge-коммита\n",[604,2721,2722],{"class":606,"line":657},[604,2723,2724],{"class":1786},"# :wq в редакторе vim, или Ctrl+X → Y → Enter в nano — подтвердить и выйти\n",[61,2726,2727,2739,2740,2742,2743,2787,2789],{},[39,2728,2729,2730,25,2733,25,2736,132],{},"Попавшие в репозиторий ",[22,2731,2732],{},".DS_Store",[22,2734,2735],{},"node_modules",[22,2737,2738],{},".vscode\u002F"," Добавьте их в ",[22,2741,1700],{},", потом удалите из репозитория командой:",[195,2744,2746],{"className":598,"code":2745,"language":600,"meta":203,"style":203},"git rm -r --cached .DS_Store node_modules .vscode\ngit commit -m \"Удалить системные и редакторские файлы из репозитория\"\ngit push\n",[22,2747,2748,2770,2781],{"__ignoreMap":203},[604,2749,2750,2752,2755,2758,2761,2764,2767],{"class":606,"line":607},[604,2751,567],{"class":610},[604,2753,2754],{"class":644}," rm",[604,2756,2757],{"class":613}," -r",[604,2759,2760],{"class":613}," --cached",[604,2762,2763],{"class":644}," .DS_Store",[604,2765,2766],{"class":644}," node_modules",[604,2768,2769],{"class":644}," .vscode\n",[604,2771,2772,2774,2776,2778],{"class":606,"line":657},[604,2773,567],{"class":610},[604,2775,1816],{"class":644},[604,2777,1819],{"class":613},[604,2779,2780],{"class":644}," \"Удалить системные и редакторские файлы из репозитория\"\n",[604,2782,2783,2785],{"class":606,"line":672},[604,2784,567],{"class":610},[604,2786,2513],{"class":644},[1208,2788],{},"Из истории прошлых коммитов они не исчезнут, но новые коммиты попадать не будут.",[61,2791,2792,2795,2796,2799,2800,2814,2816,2817,2832,2834],{},[39,2793,2794],{},"Коммит с чужим email."," Если вы клонировали чужой репо или работаете с нескольких машин, возможно ",[22,2797,2798],{},"git config user.email"," настроен глобально на другой email. Проверьте в папке проекта:",[195,2801,2803],{"className":598,"code":2802,"language":600,"meta":203,"style":203},"git config user.email\n",[22,2804,2805],{"__ignoreMap":203},[604,2806,2807,2809,2811],{"class":606,"line":607},[604,2808,567],{"class":610},[604,2810,645],{"class":644},[604,2812,2813],{"class":644}," user.email\n",[1208,2815],{},"Если не ваш — поправьте глобально (раздел 2.2) или локально для этого проекта:",[195,2818,2820],{"className":598,"code":2819,"language":600,"meta":203,"style":203},"git config user.email \"i_ivanov@aidt.online\"\n",[22,2821,2822],{"__ignoreMap":203},[604,2823,2824,2826,2828,2830],{"class":606,"line":607},[604,2825,567],{"class":610},[604,2827,645],{"class":644},[604,2829,666],{"class":644},[604,2831,669],{"class":644},[1208,2833],{},"Прошлые коммиты останутся с чужим email (исправлять их — больная тема, не трогайте), но новые будут корректными.",[61,2836,2837,2844,2845,2848,2849,2885,2887,2888,2891],{},[39,2838,2839,2840,2843],{},"Забыли ",[22,2841,2842],{},"git add"," перед коммитом, закоммитили пусто \u002F не то."," Если ",[39,2846,2847],{},"ещё не запушили"," — поправьте последний коммит:",[195,2850,2852],{"className":598,"code":2851,"language":600,"meta":203,"style":203},"git add \u003Cнужный файл>\ngit commit --amend --no-edit\n",[22,2853,2854,2873],{"__ignoreMap":203},[604,2855,2856,2858,2860,2862,2865,2868,2871],{"class":606,"line":607},[604,2857,567],{"class":610},[604,2859,1794],{"class":644},[604,2861,1666],{"class":1632},[604,2863,2864],{"class":644},"нужный",[604,2866,2867],{"class":644}," фай",[604,2869,2870],{"class":1639},"л",[604,2872,1673],{"class":1632},[604,2874,2875,2877,2879,2882],{"class":606,"line":657},[604,2876,567],{"class":610},[604,2878,1816],{"class":644},[604,2880,2881],{"class":613}," --amend",[604,2883,2884],{"class":613}," --no-edit\n",[1208,2886],{},"Если уже запушили — не используйте ",[22,2889,2890],{},"--amend",", сделайте новый коммит с нужными файлами.",[61,2893,2894,2897],{},[39,2895,2896],{},"Большие коммиты «всё сразу»."," Не ругаемся: отмотать уже не получится, но следующие коммиты делайте осмысленнее. История чинится постепенно.",[61,2899,2900,2907,2908,2911,2912,2915],{},[39,2901,2902,2903,2906],{},"Работа пропала при ",[22,2904,2905],{},"git restore"," или переключении ветки."," Если закоммичены — найдутся через ",[22,2909,2910],{},"git reflog"," (показывает вообще все движения указателя ",[22,2913,2914],{},"HEAD","), но это не для новичков. Золотое правило: коммитьте часто и пушьте в конце дня.",[61,2917,2918,2921,2922,2924,2925,2928,2929,132],{},[39,2919,2920],{},"«Nothing to commit, working tree clean», хотя файлы менялись."," Убедитесь, что вы в правильной ветке (",[22,2923,2216],{},") и в правильной папке (",[22,2926,2927],{},"pwd","). Часто — файлы изменены в папке, которая в ",[22,2930,1700],{},[31,2932,2934],{"id":2933},"_11-краткий-глоссарий","11. Краткий глоссарий",[2936,2937,2938,2951],"table",{},[2939,2940,2941],"thead",{},[2942,2943,2944,2948],"tr",{},[2945,2946,2947],"th",{},"Термин",[2945,2949,2950],{},"Значение",[2952,2953,2954,2965,2975,2985,2994,3003,3013,3023,3033,3043,3053,3063,3075,3085,3095,3104,3114,3124,3133],"tbody",{},[2942,2955,2956,2962],{},[2957,2958,2959,2961],"td",{},[39,2960,147],{}," (repo)",[2957,2963,2964],{},"Папка с проектом, в которой git ведёт историю.",[2942,2966,2967,2972],{},[2957,2968,2969,2971],{},[39,2970,253],{}," (commit)",[2957,2973,2974],{},"Единица истории: снапшот файлов + сообщение + автор.",[2942,2976,2977,2982],{},[2957,2978,2979,2981],{},[39,2980,381],{}," (branch)",[2957,2983,2984],{},"Именованная параллельная линия истории.",[2942,2986,2987,2991],{},[2957,2988,2989],{},[39,2990,391],{},[2957,2992,2993],{},"Главная ветка проекта, куда попадают готовые работы.",[2942,2995,2996,3000],{},[2957,2997,2998],{},[39,2999,2381],{},[2957,3001,3002],{},"Слияние одной ветки в другую.",[2942,3004,3005,3010],{},[2957,3006,3007,3009],{},[39,3008,111],{}," (MR)",[2957,3011,3012],{},"Предложение слить ветку в другую + процесс ревью. На GitHub — Pull Request.",[2942,3014,3015,3020],{},[2957,3016,3017],{},[39,3018,3019],{},"Push",[2957,3021,3022],{},"Отправка локальных коммитов на сервер.",[2942,3024,3025,3030],{},[2957,3026,3027],{},[39,3028,3029],{},"Pull",[2957,3031,3032],{},"Получение коммитов с сервера к себе.",[2942,3034,3035,3040],{},[2957,3036,3037],{},[39,3038,3039],{},"Clone",[2957,3041,3042],{},"Создание локальной копии серверного репозитория.",[2942,3044,3045,3050],{},[2957,3046,3047],{},[39,3048,3049],{},"Origin",[2957,3051,3052],{},"Стандартное имя удалённого репозитория (сервера).",[2942,3054,3055,3060],{},[2957,3056,3057],{},[39,3058,3059],{},"Upstream",[2957,3061,3062],{},"Серверная ветка, связанная с локальной.",[2942,3064,3065,3070],{},[2957,3066,3067],{},[39,3068,3069],{},"Protected branch",[2957,3071,3072,3073,132],{},"Ветка с ограничениями на прямой push — например, ",[22,3074,391],{},[2942,3076,3077,3082],{},[2957,3078,3079],{},[39,3080,3081],{},"Review",[2957,3083,3084],{},"Чтение чужих изменений с замечаниями; в курсе — защита через MR.",[2942,3086,3087,3092],{},[2957,3088,3089],{},[39,3090,3091],{},"Reviewer",[2957,3093,3094],{},"Тот, кто читает MR и оставляет замечания (в курсе — преподаватель).",[2942,3096,3097,3101],{},[2957,3098,3099],{},[39,3100,2375],{},[2957,3102,3103],{},"Решение reviewer'а: «можно мёрджить».",[2942,3105,3106,3111],{},[2957,3107,3108],{},[39,3109,3110],{},"Staging \u002F Index",[2957,3112,3113],{},"Промежуточная зона между рабочей папкой и историей.",[2942,3115,3116,3121],{},[2957,3117,3118],{},[39,3119,3120],{},"Diff",[2957,3122,3123],{},"Построчное сравнение двух версий файла.",[2942,3125,3126,3130],{},[2957,3127,3128],{},[39,3129,2914],{},[2957,3131,3132],{},"Указатель «где вы сейчас находитесь» в истории.",[2942,3134,3135,3140],{},[2957,3136,3137,3139],{},[39,3138,815],{}," (PAT)",[2957,3141,3142],{},"Одноразовый ключ вместо пароля для HTTPS-доступа к GitLab.",[31,3144,3146],{"id":3145},"_12-что-читать-дальше","12. Что читать дальше",[15,3148,3149],{},"Документ даёт необходимый минимум. Если хочется глубже:",[47,3151,3153],{"id":3152},"по-git-и-gitlab","По git и GitLab",[58,3155,3156,3164,3172,3180,3188,3196],{},[61,3157,3158,3163],{},[126,3159,3162],{"href":3160,"rel":3161},"https:\u002F\u002Fgit-scm.com\u002Fbook\u002Fru\u002Fv2",[130],"Pro Git book — русский перевод",". Каноническая бесплатная книга по git. Главы 1–3 покрывают всё, что нужно в первый год работы.",[61,3165,3166,3171],{},[126,3167,3170],{"href":3168,"rel":3169},"https:\u002F\u002Flearngitbranching.js.org\u002F?locale=ru_RU",[130],"Learn Git Branching (learngitbranching.js.org)",". Интерактивный тренажёр: даёт задачи с визуализацией графа коммитов, решаете командами git в браузере. Лучший способ «увидеть» ветки и merge.",[61,3173,3174,3179],{},[126,3175,3178],{"href":3176,"rel":3177},"https:\u002F\u002Feducation.github.com\u002Fgit-cheat-sheet-education.pdf",[130],"Git cheat sheet от GitHub Education",". Одностраничная шпаргалка с командами; распечатайте и положите рядом с ноутбуком.",[61,3181,3182,3187],{},[126,3183,3186],{"href":3184,"rel":3185},"https:\u002F\u002Fohshitgit.com\u002Fru",[130],"Oh Shit, Git!? (ohshitgit.com\u002Fru)",". Короткие рецепты «я всё сломал, как откатить». На удивление полезно в первый месяц.",[61,3189,3190,3195],{},[126,3191,3194],{"href":3192,"rel":3193},"https:\u002F\u002Fdoka.guide\u002Ftools\u002Fgit\u002F",[130],"Дока: git",". Русскоязычный справочник от сообщества, хорошо объясняет основы.",[61,3197,3198,3203],{},[126,3199,3202],{"href":3200,"rel":3201},"https:\u002F\u002Fdocs.gitlab.com\u002Fee\u002Fuser\u002Fproject\u002Fmerge_requests\u002F",[130],"Руководство по Merge Requests (GitLab docs)",". Официальная документация, если хочется знать все возможности MR-интерфейса.",[47,3205,3207,3208,3212],{"id":3206},"по-markdown-для-оформления-отчётов-см-52","По Markdown (для оформления отчётов, см. ",[126,3209,3211],{"href":3210},"#52-%D0%BE%D1%82%D1%87%D1%91%D1%82-%D0%BF%D0%BE-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B5-%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82-%D0%B8-%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0","5.2",")",[58,3214,3215,3223,3231,3239,3247],{},[61,3216,3217,3222],{},[126,3218,3221],{"href":3219,"rel":3220},"https:\u002F\u002Fwww.markdownguide.org\u002Fru\u002F",[130],"Markdown Guide (русский перевод)"," — основы и расширенный синтаксис; начать лучше с «Basic Syntax».",[61,3224,3225,3230],{},[126,3226,3229],{"href":3227,"rel":3228},"https:\u002F\u002Fdoka.guide\u002Ftools\u002Fmd\u002F",[130],"Дока: Markdown"," — краткий русскоязычный справочник от сообщества, с интерактивными примерами.",[61,3232,3233,3238],{},[126,3234,3237],{"href":3235,"rel":3236},"https:\u002F\u002Fspec.commonmark.org\u002Fcurrent\u002F",[130],"CommonMark Spec"," — эталонная спецификация языка; полезна, когда рендер повёл себя неожиданно и хочется понять «а как правильно».",[61,3240,3241,3246],{},[126,3242,3245],{"href":3243,"rel":3244},"https:\u002F\u002Fgithub.github.com\u002Fgfm\u002F",[130],"GitHub Flavored Markdown Spec"," — расширения базового Markdown (таблицы, чекбоксы, зачёркивание, подсветка кода). GitLab поддерживает GFM, то есть всё оттуда у вас работает.",[61,3248,3249,3254],{},[126,3250,3253],{"href":3251,"rel":3252},"https:\u002F\u002Fdocs.gitlab.com\u002Fee\u002Fuser\u002Fmarkdown.html",[130],"GitLab Flavored Markdown"," — что GitLab умеет поверх GFM (ссылки на issues, MR, упоминания пользователей, mermaid-диаграммы).",[15,3256,3257],{},"Всё, что не покрыто этим документом — ищется в первых трёх ссылках раздела про git.",[3259,3260,3261],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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);}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":203,"searchDepth":657,"depth":657,"links":3263},[3264,3274,3278,3283,3287,3291,3297,3303,3308,3312,3313,3314],{"id":33,"depth":657,"text":34,"children":3265},[3266,3267,3268,3269,3270,3271,3272,3273],{"id":49,"depth":672,"text":50},{"id":86,"depth":672,"text":87},{"id":141,"depth":672,"text":142},{"id":189,"depth":672,"text":190},{"id":247,"depth":672,"text":248},{"id":375,"depth":672,"text":376},{"id":462,"depth":672,"text":463},{"id":507,"depth":672,"text":508},{"id":536,"depth":657,"text":537,"children":3275},[3276,3277],{"id":540,"depth":672,"text":541},{"id":624,"depth":672,"text":625},{"id":801,"depth":657,"text":802,"children":3279},[3280,3281,3282],{"id":823,"depth":672,"text":824},{"id":923,"depth":672,"text":924},{"id":1004,"depth":672,"text":1005},{"id":1048,"depth":657,"text":1049,"children":3284},[3285,3286],{"id":1058,"depth":672,"text":1059},{"id":1087,"depth":672,"text":1088},{"id":1261,"depth":657,"text":1262,"children":3288},[3289,3290],{"id":1268,"depth":672,"text":1269},{"id":1338,"depth":672,"text":1339},{"id":1579,"depth":657,"text":1580,"children":3292},[3293,3294,3296],{"id":1583,"depth":672,"text":1584},{"id":1696,"depth":672,"text":3295},"6.2. Файл .gitignore",{"id":1764,"depth":672,"text":1765},{"id":1844,"depth":657,"text":1845,"children":3298},[3299,3300,3301,3302],{"id":1851,"depth":672,"text":1852},{"id":1934,"depth":672,"text":1935},{"id":2063,"depth":672,"text":2064},{"id":2131,"depth":672,"text":2132},{"id":2220,"depth":657,"text":2221,"children":3304},[3305,3306,3307],{"id":2231,"depth":672,"text":2232},{"id":2314,"depth":672,"text":2315},{"id":2414,"depth":672,"text":2415},{"id":2442,"depth":657,"text":2443,"children":3309},[3310,3311],{"id":2449,"depth":672,"text":2450},{"id":2523,"depth":672,"text":2524},{"id":2581,"depth":657,"text":2582},{"id":2933,"depth":657,"text":2934},{"id":3145,"depth":657,"text":3146,"children":3315},[3316,3317],{"id":3152,"depth":672,"text":3153},{"id":3206,"depth":672,"text":3318},"По Markdown (для оформления отчётов, см. 5.2)","md",{},"\u002Fdocs\u002Fsubmission",{"title":5,"description":17},"docs\u002Fsubmission","XyEdV2y64lzb4oDCosba4djlrBRVfJQ8dfLn7WanY9c",1779455410464]