Git (или «гит») – система контроля версий, помогающая отслеживать историю изменений в документах и различных проектах. Этот инструмент используется разработчиками для того, чтобы совместно трудиться над разнообразными приложениями. Далее его предстоит изучить более подробно. Внимание необходимо уделить команде Commit. Она является одной из важнейших, особенно для тех, кто планирует работать над тем или иным проектом большой командой.
Представленная ниже информация объяснит, что такое Git, а также как работает этот инструмент. С ее помощью получится разобраться не только с системой контроля версий, но и с управляющими командами. А еще – познакомиться с несколькими ключевыми понятиями, которые помогут лучше разобраться в Git. Предложенная информация подойдет для изучения как разработчиками-новичками, так и уже более опытными программистами.
Система контроля версий – это…
Система контроля версий (или система управления версиями) – это программное обеспечение, предназначенное для облегчения работы с регулярно меняющейся информацией. На английском термин звучит как «version control system» или VCS.
С помощью системы управления версиями получится хранить несколько версий (сборок) одного и того же документа, а при необходимости – возвращаться к более ранним «наработкам». Соответствующее программное обеспечение позволяет определить, кто и когда внес те или иные корректировки в документ.
Подобные системы активно используются в разработке программного обеспечения. Они помогают хранить исходные коды программируемых проектов. В других областях деятельности VCS тоже находит применение. Такие приложения используются там, где ведется работа с большим количеством непрерывно изменяющихся документов в электронном формате.
Git – система управления версиями с распределенной архитектурой. Здесь каждая рабочая копия кода представлена репозиторием. За счет такого подхода разработчики смогут хранить историю изменений в полном объеме.
Разработка Git была начала в 2005 году Линусом Торвальдсом – создателем Linux. Среди базовых возможностей этого программного обеспечения можно выделить:
- возврат к любой из предыдущих версий исходного кода проекта;
- просмотр истории внесения изменений;
- параллельную работу над проектом;
- backup выбранного кода.
Далее предстоит познакомиться с основными элементами этой системы управления версиями, а затем – с командами, которые пригодятся каждому разработчику. Особое внимание будет уделено commit.
Понятие репозитория
Репозиторий – это своеобразное облачное хранение проекта на сервере. Так описываются все файлы, находящиеся под контролем версий, включая историю их изменения и иной служебной информацией.
Git-репозиторий может быть создан несколькими способами – путем выбора необходимой папки на устройстве (компьютере) или за счет копирования себе уже существующего репозитория.
Работая с Git, каждый разработчик имеет право на создание бесконечного числа репозиториев – по одному на каждый проект. Также все написанные программы могут вестись в пределах одного «облачного хранилища», но это не очень удобно. Рано или поздно репозиторий превратится в нечто непонятное. Поэтому разработчики взяли за правило принцип «один проект = одно отдельное хранилище».
В репозиториях допустимо хранить:
- графики;
- картинки;
- текстовые документы;
- базы данных;
- файлы с исходными кодами приложений;
- прочие материалы в электронном виде, необходимые для работы над проектом.
С Git репозиториями при использовании соответствующей системы контроля версий придется взаимодействовать постоянно.
Где хранятся репозитории
Существуют различные способы хранения и использования репозитория. Можно выделить локальные, централизованные, а также распределенные системы контроля версий. Они имеют определенные различия, знать о которых должен каждый программист.
Локальные системы контроля версий хранят и используют репозитории на одном устройстве. Работать с соответствующей системой имеет право только один программист. При использовании централизованной системы репозиторий получится обнаружить на одном «рабочем» сервере.
Лучшим вариантом для разработчиков, особенно если их в команде много, станут распределенные системы контроля версий. Именно в их число входит рассматриваемое приложение Git. Это своеобразное облачное хранилище. Именно там будет размещаться репозиторий. Каждый пользователь будет хранить соответствующий элемент на своем устройстве целиком. По мере необходимости (внесения изменений) данные в репозиториях будут синхронизироваться друг с другом.
Бранч
Чтобы понять, что собой представляет Git Commit, необходимо сначала разобраться с особенностями рассматриваемой системы контроля версий. Она включает в себя несколько ключевых элементов. Кроме репозитория значение имеет Git branch. Это ветка проекта. Его копия, в которую допустимо вносить те или иные изменения. На основной проект соответствующие корректировки оказывать влияние не будут.
Git-репозитории всегда имеют в своем составе минимум один branch (бранч), который носит название master. Если не создавать других веток, то все изменения будут сразу идти в главную ветку проекта. Это нормальное явление для небольших проектов, но в более «серьезных» приложениях принято создавать ветки.
Master – ветка, используемая для выпуска новых версий проекта со всеобщим доступом. То, что сюда добавляется, будет сразу доступно пользователям. С технической точки зрения ветка – это указатель или ссылка на последний Git Commit в этой самой ветке.
Клонирование
Git clone – это клонирование. Процесс, описываемый как копирование репозитория себе на жесткий диск устройства. Это необходимо для того, чтобы получить право вносить в соответствующее хранилище изменения.
От простого копирования клонирование отличается тем, что при нем вместе с файлами проекта «загружается» еще и:
- вся история версий;
- полностью все ветки;
- история работы (целиком).
Если кто-то внесет собственные изменения в проект, за счет упомянутой информации удастся получить их. При копировании необходимых документов с чужого устройства никакие истории и связи не сохраняются. Синхронизация отсутствует. Программист просто получит набор файлов.
Git merge
Git merge или «смержить» – это отправка всего, что было выполнено в одной ветке, в другую. Новый код, исправленные ошибки, дополнительные опции и функции – все это в полном объеме будет отправлено в новую ветку. Если что-то в программном коде будет удалено, соответствующий фрагмент исчезнет и из git branch.
Схема у Git merge будет следующей:
- В master запускается рабочий код с первой версией сайта. Она автоматически отправляется на сборку.
- Разработчик создает новую ветку на основе «мастера».
- В этой новой ветке пишется программный код, добавляющий интерактивные функции на веб-страницу.
- Ветка тестируется в качестве отдельного проекта. При наличии ошибок осуществляется их исправление программистом.
- Если тестирование прошло успешно, ветка смерживается в master. Это повлечет за собой образование сразу готовой сборки сайта с новыми опциями.
Перед тем как изучать Гит Коммит, необходимо обратить внимание на еще несколько элементов рассматриваемой системы. Зная их, разработчик сможет полноценно работать с клиент-серверными моделями.
Пуш и пулл
Git push используется для отправки информации со своего проекта на сервер. Разработчик должен указать имя ветки, в которую хочет направить исходный файл с кодом, а серверная сторона принимает данные, проверяет их и добавляет к себе.
Иногда случаются ситуации, при которых описанные манипуляции сервер выполнять отказывается. Это связано с тем, что у разработчика на устройстве была неактуальная ветка. За время внесения собственных правок другие программисты уже внесли в проект несколько изменений, сохранили их у себя, а также выгрузили на сервер. В конечном итоге получилось так, что у одних соответствующая ветка осталась актуальной и свежей, а у других – устарела. Чтобы не принимать запросы из «старых» веток Git предусматривает обновление информации у себя на компьютере. В этом поможет команда git pull.
Пулл работает просто – он скачивает с сервера актуальные версии веток и добавляет код оттуда на компьютер разработчика. Иногда новые данные вступают в конфликт с тем, что успел сделать программист. Разработчику предстоит определиться – какая сборка одинакового кода останется в проекте, а от чего придется избавиться.
Зачем нужен GitHub
Изучая коммит в Git, стоит обратить внимание на GitHub. С этим сервисом предстоит плотно работать всем разработчикам, трудящимся в команде.
GitHub – наиболее популярный и известный сайт для хранения git-репозиториев и дальнейшего их использования. Данный портал также выступает в качестве одной из самых крупных площадок размещения готовых проектов с открытым исходным кодом. Для просмотра и загрузки общедоступных репозиториев здесь не придется ни оплачивать соответствующие услуги, ни регистрироваться.
GitHub – это в какой-то степени еще и своеобразная социальная сеть для разработчиков. Зарегистрированные здесь пользователи смогут:
- публиковать контент;
- управлять собственными репозиториями;
- вести обсуждения;
- вносить вклад в чужие репозитории;
- просматривать изменения в исходных кодах;
- оставлять комментарии;
- отслеживать обновления у коллег.
GitHub часто используется при поиске работы в области программирования. Существуют разнообразные онлайн-сервисы, поддерживающие интеграцию с упомянутой площадкой. В качестве альтернативы можно использовать BitBucket или GitLab. Эти площадки имеют меньшую аудиторию, но поддерживают уникальные функции. Пример – BitBucket удобно использовать для небольших приложений с закрытым исходным кодом.
Как начать работу с Git
Git Commit можно рассматривать после того, как разработчик научился запускать рассматриваемую систему контроля версий. Чтобы начать работу с «сервисом», необходимо установить его на устройство.
В случае с Windows инициализация осуществляется отсюда. В случае с macOS Git выступает частью инструмента командной строки XCode. Его наличие можно проверить при помощи терминала. В нем требуется обработать команду «git —version». Для операционных систем Linux предстоит использовать команду sudo apt install git-all. Вместо нее подойдет sudo dnf install git-all.
Настройка файла конфигураций
После установки Git необходимо настроить пользовательское имя и e-mail – эти данные используются для идентификации. Они сохраняются в конфигурационном файле .gitconfig.
Отредактировать этот файл можно напрямую через редактор или при помощи команды git config –global —edit. Для редактирования отдельных полей соответствующая команда немного видоизменяется: вместо edit необходимо указать поле и значение. Для настройки имени пользователя и электронной почты требуется задействовать поля user.email и user.name.
Также поддерживается возможность настройки специального текстового редактора для написания коммитов в Git. Для этого используется поле core.editor. По умолчанию в системе используется стандартный редактор. Поле commit.template необходимо для указания шаблона, применяемого при каждом совершенном коммите.
Создание репозитория и принцип работы с Git
Создать новый репозиторий поможет команда git init. Если программисту необходимо скопировать уже существующее «хранилище», рекомендуется использовать команду: git clone <адрес_репозитория>.
Коммит в Git – это одна из базовых команд. Перед ее использованием необходимо изучить основы работы системы контроля версий на локальном устройстве. Это связано с тем, что основная работа осуществляется именно там.
Работать с системой контроля версий допустимо через графический интерфейс и командную строку. Второй вариант требуется знать всем веб-программистам. Это связано с тем, что она дает больше возможностей, чем инструменты с интерфейсом.
Git-команды имеют следующую форму записи: git <команда> <аргументы>. В качестве передаваемого параметра (аргумента) может выступать путь к файлу.
У команд встречаются опции, которые обозначаются как —<опция> или —<однобуквенная опция>. С их помощью удается производить более детальную настройку действия команды. Чтобы посмотреть встроенное руководство по командам, рекомендуется использовать команду git help <команда>.
Коммит – это…
Коммит в Git – это команда, которая делает снимок для нынешнего состояния изменений. Так называется операция, которая берет подготовленные корректировки и отправляет их в репозиторий в виде единого целого.
Коммит необходим для разбиения разработки, состоящей из большого количества правок, на отдельные этапы (шаги). Он представляет собой некое логически завершенное изменение внутри проекта и понятную точку, к которой разрешается вернуться в будущем, если в процессе разработки возникнут проблемы.
Изменения в рамках одного коммита в Git подчиняются определенным правилам и рекомендациям. Их заранее устанавливает команда разработчиков. Соответствующие принципы будут иметь отношение к присваиванию имени, описанию и содержанию коммитов.
Коммитить разрешено как один файл, так и сразу несколько. Система самостоятельно обнаружит изменения в каждом документе, а затем добавит их в проект. Единственное требование, которое необходимо запомнить относительно рассматриваемой команды – это необходимость указания того, что именно изменено «человеческим» языком. Эту информацию другие разработчики будут видеть в качестве описания.
Коммит можно оставлять хоть после правки каждой строчки. Иногда именно такой подход позволяет не упустить действительно важные изменения.
Устройство коммита
Коммит в Git предусматривает определенную структуру. Он включает в себя шесть компонентов:
- Указатель коммита –SHA1-хеш. Он служит для идентификации коммита.
- Имя пользователя и электронная почта. Это данные, которые вносятся автоматически, опираясь на параметры git config.
- Описание коммита. Тут необходимо указать изменения, которые были внесены в приложения. Здесь же прописывается версия коммита и иные сведения, помогающие разобраться в коммите Git.
- Дерево – хеш-ссылка на корневое дерево всего проекта, содержащее структуру этого самого проекта.
- Родительский коммит – хеш-ссылка на предыдущий коммит.
- HEAD – элемент, указывающий на текущую версию проекта, расположенную в рабочей директории.
Все коммиты имеют связь друг с другом за счет хеш-ссылок. Они организуют цепочку. Смещение указателя HEAD предоставит возможность изменения текущего состояния документов рабочей директории. HEAD ссылается на ветку, а ветка – на последний в ней коммит. Разработчики способны в ручном режиме смещать «указатель» на конкретный коммит, минуя ветки.
Создание коммита
Коммит создается при помощи команды git commit-m “<сообщение>”. Ключ –m можно не использовать, но тогда придется работать с текстовым редактором в терминале. Это не всегда удобно. Именно поэтому рекомендуется при создании коммита использовать –m.
После выполнения коммита в терминал будет выведено сообщение-отчет. А в нем указываются добавленные в репозиторий документы. Повторно посмотреть историю коммитов и сведений о них поможет команда git log.
Отличие коммита от пуша
Коммит – это фиксирование изменений в приложении. Некоторые разработчики проводят аналогию с подведением итогов в работе.
Пуш – это отправка сделанной работы туда, где хранится копия необходимого разработчику кода. В этом случае последовательность действий при разработке окажется следующей:
- Разработчик подключается к репозиторию и клонирует его.
- Осуществляется создание новой ветки.
- Перед началом работы создается пулл. Он необходим, чтобы забрать актуальную версию документов.
- В ветке пишется и размещается все необходимое для работы приложения.
- Для отправки ветки другим разработчикам используется пуш.
- После одобрения и перепроверки выполненной работы ветку мержат с мастер-меткой.
Теперь новые функции и опции будут доступны всем пользователям.
Ключевые команды Git
Система контроля версий поддерживает множество команд. Среди них не только коммит, но и другие полезные операции. Вот несколько наиболее распространенных операций, которые можно выполнить через git:
- Git add – добавление содержимого рабочего каталога в индекс для предыдущего коммита.
- Git status – отвечает за демонстрацию состояния документов в рабочем каталоге и индексе: какие файлы изменены, но не добавлены в индекс, а какие уже ожидают коммита. Используется для вывода подсказок о том, как менять состояние документов.
- Git reset – используется для того, чтобы отметить изменения. Она корректирует HEAD-указатель и опционально – состояние индекса.
- Git mv – способ перемещения файла.
- Git clean – команда, отвечающая за удаление мусора из рабочего каталога.
- Git rm – используется для того, чтобы удалить файлы из индекса и рабочей копии.
Теперь понятно, что собой представляет Git, а также как пользоваться коммитом. Лучше узнать о системе контроля версий и научиться ей управлять помогут дистанционные онлайн-курсы. На них в срок до 12 месяцев научат работать с рассмотренным приложением и его командами. В конце будет выдан сертификат в электронной форме, подтверждающий приобретенные навыки и знания.
Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в Otus!
<!DOCTYPE html>
<html dir="ltr" lang="ru-RU">
<head>
<meta charset="UTF-8" />
<meta http-equiv="x-ua-compatible" content="ie=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="profile" href="http://gmpg.org/xfn/11" />
<title>Работа с Git. Команда Commit OTUS</title>
<!-- All in One SEO 4.5.2.1 - aioseo.com -->
<meta name="description" content="Git (или «гит») – система контроля версий, помогающая отслеживать историю изменений в документах и различных проектах. Этот инструмент используется разработчиками для того, чтобы совместно трудиться над разнообразными приложениями. Далее его предстоит изучить более подробно. Внимание необходимо уделить команде Commit. Она является одной из важнейших, особенно для тех, кто планирует работать над тем или иным проектом" />
<meta name="robots" content="max-image-preview:large" />
<link rel="canonical" href="https://otus.ru/journal/rabota-s-git-komanda-commit/" />
<meta name="generator" content="All in One SEO (AIOSEO) 4.5.2.1" />
<script type="application/ld+json" class="aioseo-schema">
{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/otus.ru\/journal\/rabota-s-git-komanda-commit\/#article","name":"\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 Git. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 Commit OTUS","headline":"\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 Git. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 Commit","author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2024\/02\/oj-1080x720-34.jpg","width":2245,"height":1587},"datePublished":"2024-02-20T17:42:14+00:00","dateModified":"2024-02-20T17:42:16+00:00","inLanguage":"ru-RU","mainEntityOfPage":{"@id":"https:\/\/otus.ru\/journal\/rabota-s-git-komanda-commit\/#webpage"},"isPartOf":{"@id":"https:\/\/otus.ru\/journal\/rabota-s-git-komanda-commit\/#webpage"},"articleSection":"\u041f\u043e\u043b\u0435\u0437\u043d\u043e\u0435, Git, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435"},{"@type":"BreadcrumbList","@id":"https:\/\/otus.ru\/journal\/rabota-s-git-komanda-commit\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/#listItem","position":1,"name":"\u0413\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430","item":"https:\/\/otus.ru\/journal\/","nextItem":"https:\/\/otus.ru\/journal\/rabota-s-git-komanda-commit\/#listItem"},{"@type":"ListItem","@id":"https:\/\/otus.ru\/journal\/rabota-s-git-komanda-commit\/#listItem","position":2,"name":"\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 Git. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 Commit","previousItem":"https:\/\/otus.ru\/journal\/#listItem"}]},{"@type":"Organization","@id":"https:\/\/otus.ru\/journal\/#organization","name":"\u041e\u0442\u0443\u0441 \u043e\u043d\u043b\u0430\u0439\u043d-\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0435","url":"https:\/\/otus.ru\/journal\/","sameAs":["https:\/\/www.youtube.com\/channel\/UCetgtvy93o3i3CvyGXKFU3g"],"contactPoint":{"@type":"ContactPoint","telephone":"+74999389202","contactType":"Customer Support"}},{"@type":"Person","@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author","url":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/","name":"A. Pavlenko","image":{"@type":"ImageObject","@id":"https:\/\/otus.ru\/journal\/rabota-s-git-komanda-commit\/#authorImage","url":"https:\/\/secure.gravatar.com\/avatar\/d4c499a104d7c2522fa41f89e6819499?s=96&d=mm&r=g","width":96,"height":96,"caption":"A. Pavlenko"}},{"@type":"WebPage","@id":"https:\/\/otus.ru\/journal\/rabota-s-git-komanda-commit\/#webpage","url":"https:\/\/otus.ru\/journal\/rabota-s-git-komanda-commit\/","name":"\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 Git. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 Commit OTUS","description":"Git (\u0438\u043b\u0438 \u00ab\u0433\u0438\u0442\u00bb) \u2013 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u0439, \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0449\u0430\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0445 \u0438 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445. \u042d\u0442\u043e\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u043d\u043e \u0442\u0440\u0443\u0434\u0438\u0442\u044c\u0441\u044f \u043d\u0430\u0434 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438. \u0414\u0430\u043b\u0435\u0435 \u0435\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e. \u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0435 Commit. \u041e\u043d\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0432\u0430\u0436\u043d\u0435\u0439\u0448\u0438\u0445, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430\u0434 \u0442\u0435\u043c \u0438\u043b\u0438 \u0438\u043d\u044b\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c","inLanguage":"ru-RU","isPartOf":{"@id":"https:\/\/otus.ru\/journal\/#website"},"breadcrumb":{"@id":"https:\/\/otus.ru\/journal\/rabota-s-git-komanda-commit\/#breadcrumblist"},"author":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"creator":{"@id":"https:\/\/otus.ru\/journal\/author\/a-pavlenko\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/otus.ru\/journal\/wp-content\/uploads\/2024\/02\/oj-1080x720-34.jpg","@id":"https:\/\/otus.ru\/journal\/rabota-s-git-komanda-commit\/#mainImage","width":2245,"height":1587},"primaryImageOfPage":{"@id":"https:\/\/otus.ru\/journal\/rabota-s-git-komanda-commit\/#mainImage"},"datePublished":"2024-02-20T17:42:14+00:00","dateModified":"2024-02-20T17:42:16+00:00"},{"@type":"WebSite","@id":"https:\/\/otus.ru\/journal\/#website","url":"https:\/\/otus.ru\/journal\/","name":"OTUS JOURNAL","description":"Blog about IT","inLanguage":"ru-RU","publisher":{"@id":"https:\/\/otus.ru\/journal\/#organization"}}]}
</script>
<!-- All in One SEO -->
<link rel='dns-prefetch' href='//otus.ru' />
<link rel='dns-prefetch' href='//fonts.googleapis.com' />
<link rel='stylesheet' id='wp-block-library-css' href='https://otus.ru/journal/wp-includes/css/dist/block-library/style.min.css?ver=6.4.7' type='text/css' media='all' />
<style id='classic-theme-styles-inline-css' type='text/css'>
/*! This file is auto-generated */
.wp-block-button__link{color:#fff;background-color:#32373c;border-radius:9999px;box-shadow:none;text-decoration:none;padding:calc(.667em + 2px) calc(1.333em + 2px);font-size:1.125em}.wp-block-file__button{background:#32373c;color:#fff;text-decoration:none}
</style>
<style id='global-styles-inline-css' type='text/css'>
body{--wp--preset--color--black: #000000;--wp--preset--color--cyan-bluish-gray: #abb8c3;--wp--preset--color--white: #ffffff;--wp--preset--color--pale-pink: #f78da7;--wp--preset--color--vivid-red: #cf2e2e;--wp--preset--color--luminous-vivid-orange: #ff6900;--wp--preset--color--luminous-vivid-amber: #fcb900;--wp--preset--color--light-green-cyan: #7bdcb5;--wp--preset--color--vivid-green-cyan: #00d084;--wp--preset--color--pale-cyan-blue: #8ed1fc;--wp--preset--color--vivid-cyan-blue: #0693e3;--wp--preset--color--vivid-purple: #9b51e0;--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple: linear-gradient(135deg,rgba(6,147,227,1) 0%,rgb(155,81,224) 100%);--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan: linear-gradient(135deg,rgb(122,220,180) 0%,rgb(0,208,130) 100%);--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange: linear-gradient(135deg,rgba(252,185,0,1) 0%,rgba(255,105,0,1) 100%);--wp--preset--gradient--luminous-vivid-orange-to-vivid-red: linear-gradient(135deg,rgba(255,105,0,1) 0%,rgb(207,46,46) 100%);--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray: linear-gradient(135deg,rgb(238,238,238) 0%,rgb(169,184,195) 100%);--wp--preset--gradient--cool-to-warm-spectrum: linear-gradient(135deg,rgb(74,234,220) 0%,rgb(151,120,209) 20%,rgb(207,42,186) 40%,rgb(238,44,130) 60%,rgb(251,105,98) 80%,rgb(254,248,76) 100%);--wp--preset--gradient--blush-light-purple: linear-gradient(135deg,rgb(255,206,236) 0%,rgb(152,150,240) 100%);--wp--preset--gradient--blush-bordeaux: linear-gradient(135deg,rgb(254,205,165) 0%,rgb(254,45,45) 50%,rgb(107,0,62) 100%);--wp--preset--gradient--luminous-dusk: linear-gradient(135deg,rgb(255,203,112) 0%,rgb(199,81,192) 50%,rgb(65,88,208) 100%);--wp--preset--gradient--pale-ocean: linear-gradient(135deg,rgb(255,245,203) 0%,rgb(182,227,212) 50%,rgb(51,167,181) 100%);--wp--preset--gradient--electric-grass: linear-gradient(135deg,rgb(202,248,128) 0%,rgb(113,206,126) 100%);--wp--preset--gradient--midnight: linear-gradient(135deg,rgb(2,3,129) 0%,rgb(40,116,252) 100%);--wp--preset--font-size--small: 13px;--wp--preset--font-size--medium: 20px;--wp--preset--font-size--large: 36px;--wp--preset--font-size--x-large: 42px;--wp--preset--spacing--20: 0.44rem;--wp--preset--spacing--30: 0.67rem;--wp--preset--spacing--40: 1rem;--wp--preset--spacing--50: 1.5rem;--wp--preset--spacing--60: 2.25rem;--wp--preset--spacing--70: 3.38rem;--wp--preset--spacing--80: 5.06rem;--wp--preset--shadow--natural: 6px 6px 9px rgba(0, 0, 0, 0.2);--wp--preset--shadow--deep: 12px 12px 50px rgba(0, 0, 0, 0.4);--wp--preset--shadow--sharp: 6px 6px 0px rgba(0, 0, 0, 0.2);--wp--preset--shadow--outlined: 6px 6px 0px -3px rgba(255, 255, 255, 1), 6px 6px rgba(0, 0, 0, 1);--wp--preset--shadow--crisp: 6px 6px 0px rgba(0, 0, 0, 1);}:where(.is-layout-flex){gap: 0.5em;}:where(.is-layout-grid){gap: 0.5em;}body .is-layout-flow > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-flow > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-flow > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignleft{float: left;margin-inline-start: 0;margin-inline-end: 2em;}body .is-layout-constrained > .alignright{float: right;margin-inline-start: 2em;margin-inline-end: 0;}body .is-layout-constrained > .aligncenter{margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > :where(:not(.alignleft):not(.alignright):not(.alignfull)){max-width: var(--wp--style--global--content-size);margin-left: auto !important;margin-right: auto !important;}body .is-layout-constrained > .alignwide{max-width: var(--wp--style--global--wide-size);}body .is-layout-flex{display: flex;}body .is-layout-flex{flex-wrap: wrap;align-items: center;}body .is-layout-flex > *{margin: 0;}body .is-layout-grid{display: grid;}body .is-layout-grid > *{margin: 0;}:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}.has-black-color{color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-color{color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-color{color: var(--wp--preset--color--white) !important;}.has-pale-pink-color{color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-color{color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-color{color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-color{color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-color{color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-color{color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-color{color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-color{color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-color{color: var(--wp--preset--color--vivid-purple) !important;}.has-black-background-color{background-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-background-color{background-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}.has-pale-pink-background-color{background-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-background-color{background-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-background-color{background-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-background-color{background-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-background-color{background-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-background-color{background-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-background-color{background-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-background-color{background-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-background-color{background-color: var(--wp--preset--color--vivid-purple) !important;}.has-black-border-color{border-color: var(--wp--preset--color--black) !important;}.has-cyan-bluish-gray-border-color{border-color: var(--wp--preset--color--cyan-bluish-gray) !important;}.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}.has-pale-pink-border-color{border-color: var(--wp--preset--color--pale-pink) !important;}.has-vivid-red-border-color{border-color: var(--wp--preset--color--vivid-red) !important;}.has-luminous-vivid-orange-border-color{border-color: var(--wp--preset--color--luminous-vivid-orange) !important;}.has-luminous-vivid-amber-border-color{border-color: var(--wp--preset--color--luminous-vivid-amber) !important;}.has-light-green-cyan-border-color{border-color: var(--wp--preset--color--light-green-cyan) !important;}.has-vivid-green-cyan-border-color{border-color: var(--wp--preset--color--vivid-green-cyan) !important;}.has-pale-cyan-blue-border-color{border-color: var(--wp--preset--color--pale-cyan-blue) !important;}.has-vivid-cyan-blue-border-color{border-color: var(--wp--preset--color--vivid-cyan-blue) !important;}.has-vivid-purple-border-color{border-color: var(--wp--preset--color--vivid-purple) !important;}.has-vivid-cyan-blue-to-vivid-purple-gradient-background{background: var(--wp--preset--gradient--vivid-cyan-blue-to-vivid-purple) !important;}.has-light-green-cyan-to-vivid-green-cyan-gradient-background{background: var(--wp--preset--gradient--light-green-cyan-to-vivid-green-cyan) !important;}.has-luminous-vivid-amber-to-luminous-vivid-orange-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-amber-to-luminous-vivid-orange) !important;}.has-luminous-vivid-orange-to-vivid-red-gradient-background{background: var(--wp--preset--gradient--luminous-vivid-orange-to-vivid-red) !important;}.has-very-light-gray-to-cyan-bluish-gray-gradient-background{background: var(--wp--preset--gradient--very-light-gray-to-cyan-bluish-gray) !important;}.has-cool-to-warm-spectrum-gradient-background{background: var(--wp--preset--gradient--cool-to-warm-spectrum) !important;}.has-blush-light-purple-gradient-background{background: var(--wp--preset--gradient--blush-light-purple) !important;}.has-blush-bordeaux-gradient-background{background: var(--wp--preset--gradient--blush-bordeaux) !important;}.has-luminous-dusk-gradient-background{background: var(--wp--preset--gradient--luminous-dusk) !important;}.has-pale-ocean-gradient-background{background: var(--wp--preset--gradient--pale-ocean) !important;}.has-electric-grass-gradient-background{background: var(--wp--preset--gradient--electric-grass) !important;}.has-midnight-gradient-background{background: var(--wp--preset--gradient--midnight) !important;}.has-small-font-size{font-size: var(--wp--preset--font-size--small) !important;}.has-medium-font-size{font-size: var(--wp--preset--font-size--medium) !important;}.has-large-font-size{font-size: var(--wp--preset--font-size--large) !important;}.has-x-large-font-size{font-size: var(--wp--preset--font-size--x-large) !important;}
.wp-block-navigation a:where(:not(.wp-element-button)){color: inherit;}
:where(.wp-block-post-template.is-layout-flex){gap: 1.25em;}:where(.wp-block-post-template.is-layout-grid){gap: 1.25em;}
:where(.wp-block-columns.is-layout-flex){gap: 2em;}:where(.wp-block-columns.is-layout-grid){gap: 2em;}
.wp-block-pullquote{font-size: 1.5em;line-height: 1.6;}
</style>
<link rel='stylesheet' id='wbcr-comments-plus-url-span-css' href='https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/css/url-span.css?ver=2.2.0' type='text/css' media='all' />
<link rel='stylesheet' id='wpel-style-css' href='https://otus.ru/journal/wp-content/plugins/wp-external-links/public/css/wpel.css?ver=2.59' type='text/css' media='all' />
<link rel='stylesheet' id='ez-toc-css' href='https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/css/screen.min.css?ver=2.0.61' type='text/css' media='all' />
<style id='ez-toc-inline-css' type='text/css'>
div#ez-toc-container .ez-toc-title {font-size: 120%;}div#ez-toc-container .ez-toc-title {font-weight: 500;}div#ez-toc-container ul li {font-size: 95%;}div#ez-toc-container nav ul ul li {font-size: 90%;}
.ez-toc-container-direction {direction: ltr;}.ez-toc-counter ul{counter-reset: item ;}.ez-toc-counter nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }.ez-toc-widget-direction {direction: ltr;}.ez-toc-widget-container ul{counter-reset: item ;}.ez-toc-widget-container nav ul li a::before {content: counters(item, ".", decimal) ". ";display: inline-block;counter-increment: item;flex-grow: 0;flex-shrink: 0;margin-right: .2em; float: left; }
</style>
<link rel='stylesheet' id='contentberg-fonts-css' href='https://fonts.googleapis.com/css?family=Roboto%3A400%2C500%2C700%7CPT+Serif%3A400%2C400i%2C600%7CIBM+Plex+Serif%3A500' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-core-css' href='https://otus.ru/journal/wp-content/themes/contentberg/style.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='contentberg-lightbox-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/lightbox.css?ver=1.8.3' type='text/css' media='all' />
<link rel='stylesheet' id='font-awesome-css' href='https://otus.ru/journal/wp-content/themes/contentberg/css/fontawesome/css/font-awesome.min.css?ver=1.8.3' type='text/css' media='all' />
<script type="text/javascript" id="breeze-prefetch-js-extra">
/* <![CDATA[ */
var breeze_prefetch = {"local_url":"https:\/\/otus.ru\/journal","ignore_remote_prefetch":"1","ignore_list":["\/wp-admin\/"]};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/breeze/assets/js/js-front-end/breeze-prefetch-links.min.js" id="breeze-prefetch-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.min.js" id="jquery-core-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery-migrate.min.js" id="jquery-migrate-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/lazysizes.js" id="lazysizes-js"></script>
<link rel="https://api.w.org/" href="https://otus.ru/journal/wp-json/" /><link rel="alternate" type="application/json" href="https://otus.ru/journal/wp-json/wp/v2/posts/9258" /><link rel='shortlink' href='https://otus.ru/journal/?p=9258' />
<link rel="alternate" type="application/json+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Frabota-s-git-komanda-commit%2F" />
<link rel="alternate" type="text/xml+oembed" href="https://otus.ru/journal/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fotus.ru%2Fjournal%2Frabota-s-git-komanda-commit%2F&format=xml" />
<script>var Sphere_Plugin = {"ajaxurl":"https:\/\/otus.ru\/journal\/wp-admin\/admin-ajax.php"};</script><link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-32x32.png" sizes="32x32" />
<link rel="icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-192x192.png" sizes="192x192" />
<link rel="apple-touch-icon" href="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-180x180.png" />
<meta name="msapplication-TileImage" content="https://otus.ru/journal/wp-content/uploads/2020/11/cropped-OTUS_logo_OTUS-COMP-LOGO-WHITE-1-270x270.png" />
<style type="text/css" id="wp-custom-css">
#menu-item-10406 .wpel-icon {
display: none;
}
#menu-item-10407 .wpel-icon {
display: none;
}
.otus-login-site a .wpel-icon {
display: none;
}
.menu-menju-navykov-container a .wpel-icon {
display: none;
}
.otus-login-site a
{
background: #ffd709;
border-radius: 12px;
color: #0f0f10;
font-size: 14px;
font-weight: 700;
line-height: 20px;
display: block;
text-align: center;
padding: 8px 25px;
}
.main-footer.dark {
background: linear-gradient(90deg, #a64fc5, #4f54e6);
border-color: transparent;
}
.main-footer.bold .copyright {
color: #fff;
}
.main-footer.bold .to-top i {
color: #fff;
}
.main-footer.bold .back-to-top {
color: #fff;
}
.nav__scroll {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
.scrollable-menu .menu {
display: flex;
}
.nav__scroll
{
background: linear-gradient(90deg, #a64fc5, #4f54e6);
}
.scrollable-menu .menu .menu-item {
flex: 0 0 auto;
padding: 15px 15px;
}
.scrollable-menu .menu .menu-item a {
color: #fff;
}
.nav__scroll::-webkit-scrollbar{background-color:#fff;height:5px;}
.nav__scroll::-webkit-scrollbar-thumb{background-color:#dcdcdc;}
.nav__scroll::-webkit-scrollbar-track{-webkit-border-radius:0;border-radius:0;background-color:#fff;}/
body {
min-width: 320px;
}
.banner-click img {
margin: 0 auto;
display: block;
}
.banner-click {
cursor: pointer;
}
.banner-footer-area {
margin-bottom: 20px;
}
.banner-left-area {
margin-top: 40px;
} </style>
<!--Start VDZ Yandex Metrika Plugin-->
<!-- Yandex.Metrika counter --><script type="text/javascript" >(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");ym(34531570, "init", {clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true, trackHash:true, ecommerce:"dataLayer"});</script>
<noscript><div><img src="https://mc.yandex.ru/watch/34531570" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter --><!--START ADD EVENTS FROM CF7--><script type='text/javascript'>document.addEventListener( 'wpcf7submit', function( event ) {
//event.detail.contactFormId;
if(ym){
//console.log(event.detail);
ym(34531570, 'reachGoal', 'VDZ_SEND_CONTACT_FORM_7');
ym(34531570, 'params', {
page_url: window.location.href,
status: event.detail.status,
locale: event.detail.contactFormLocale,
form_id: event.detail.contactFormId,
});
}
}, false );
</script><!--END ADD EVENTS FROM CF7-->
<!--End VDZ Yandex Metrika Plugin-->
</head>
<body class="post-template-default single single-post postid-9258 single-format-standard right-sidebar lazy-normal has-lb">
<div class="main-wrap">
<header id="main-head" class="main-head head-nav-below has-search-modal simple simple-boxed">
<div class="inner inner-head" data-sticky-bar="0">
<div class="wrap cf wrap-head">
<div class="left-contain">
<span class="mobile-nav"><i class="fa fa-bars"></i></span>
<div class="title">
<a href="https://otus.ru/journal/" title="OTUS JOURNAL" rel="home" data-wpel-link="internal">
<span class="text-logo"><img src="/journal/wp-content/themes/contentberg/img/logo_site.svg" alt="OTUS JOURNAL"></span>
</a>
</div>
</div>
<div class="navigation-wrap inline">
<nav class="navigation inline simple light" data-sticky-bar="0">
<div class="menu-rubriki-container"><ul id="menu-rubriki" class="menu"><li id="menu-item-109" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-1 menu-item-109"><a href="https://otus.ru/journal/category/pro-it/" data-wpel-link="internal"><span>Про IT</span></a></li>
<li id="menu-item-113" class="menu-item menu-item-type-taxonomy menu-item-object-category current-post-ancestor current-menu-parent current-post-parent menu-cat-4 menu-item-113"><a href="https://otus.ru/journal/category/polza/" data-wpel-link="internal"><span>Полезное</span></a></li>
<li id="menu-item-114" class="menu-item menu-item-type-taxonomy menu-item-object-category menu-cat-3 menu-item-114"><a href="https://otus.ru/journal/category/lifestyle/" data-wpel-link="internal"><span>Лайфстайл</span></a></li>
<li id="menu-item-10406" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10406"><a href="https://otus.ru/catalog/courses" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Обучение</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10407" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10407"><a href="https://otus.ru/about" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right"><span>Информация</span><span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </nav>
</div>
<div class="actions">
<div class="otus-login-site">
<a href="https://otus.ru/login/" target="_blank" data-wpel-link="external" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Войти<span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
<a href="#" title="Search" class="search-link"><i class="fa fa-search"></i></a>
</div>
</div>
</div>
</header> <!-- .main-head -->
<div class="nav nav_disable nav_colored nav_transparent course-categories__nav nav__scroll ">
<div class="container wrap">
<div class="links inline simple light scrollable-menu">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov" class="menu"><li id="menu-item-10413" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10414" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10415" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10416" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10417" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10418" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10419" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10420" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li id="menu-item-10421" class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
</div>
</div>
<div class="main wrap">
<div class="ts-row cf">
<div class="col-8 main-content cf">
<article id="post-9258" class="the-post post-9258 post type-post status-publish format-standard has-post-thumbnail category-polza tag-git tag-programmirovanie">
<header class="post-header the-post-header cf">
<div class="post-meta the-post-meta">
<span class="post-cat">
<a href="https://otus.ru/journal/category/polza/" class="category" data-wpel-link="internal">Полезное</a>
</span>
<h1 class="post-title">
Работа с Git. Команда Commit
</h1>
<a href="https://otus.ru/journal/rabota-s-git-komanda-commit/" class="date-link" data-wpel-link="internal"><time class="post-date">20 февраля, 2024</time></a>
</div>
<div class="featured">
<a href="https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-34.jpg" class="image-link" data-wpel-link="internal"><img width="770" height="515" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20770%20515%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-contentberg-main size-contentberg-main lazyload wp-post-image" alt="Работа с Git. Команда Commit" title="Работа с Git. Команда Commit" decoding="async" fetchpriority="high" data-srcset="https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-34-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-34-270x180.jpg 270w" data-src="https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-34-770x515.jpg" data-sizes="(max-width: 770px) 100vw, 770px" /> </a>
</div>
</header><!-- .post-header -->
<div class="post-content description cf entry-content content-normal">
<div id="ez-toc-container" class="ez-toc-v2_0_61 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction">
<div class="ez-toc-title-container">
<p class="ez-toc-title " >Содержание</p>
<span class="ez-toc-title-toggle"><a href="#" class="ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle" aria-label="Toggle Table of Content"><span class="ez-toc-js-icon-con"><span class=""><span class="eztoc-hide" style="display:none;">Toggle</span><span class="ez-toc-icon-toggle-span"><svg style="fill: #999;color:#999" xmlns="http://www.w3.org/2000/svg" class="list-377408" width="20px" height="20px" viewBox="0 0 24 24" fill="none"><path d="M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z" fill="currentColor"></path></svg><svg style="fill: #999;color:#999" class="arrow-unsorted-368013" xmlns="http://www.w3.org/2000/svg" width="10px" height="10px" viewBox="0 0 24 24" version="1.2" baseProfile="tiny"><path d="M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z"/></svg></span></span></span></a></span></div>
<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-1" href="#%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8F_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B9_%E2%80%93_%D1%8D%D1%82%D0%BE%E2%80%A6" title="Система контроля версий – это…">Система контроля версий – это…</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-2" href="#Git_%E2%80%93_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5" title="Git – определение">Git – определение</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-3" href="#%D0%9F%D0%BE%D0%BD%D1%8F%D1%82%D0%B8%D0%B5_%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F" title="Понятие репозитория">Понятие репозитория</a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class="ez-toc-link ez-toc-heading-4" href="#%D0%93%D0%B4%D0%B5_%D1%85%D1%80%D0%B0%D0%BD%D1%8F%D1%82%D1%81%D1%8F_%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B8" title="Где хранятся репозитории">Где хранятся репозитории</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-5" href="#%D0%91%D1%80%D0%B0%D0%BD%D1%87" title="Бранч">Бранч</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-6" href="#%D0%9A%D0%BB%D0%BE%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5" title="Клонирование">Клонирование</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-7" href="#Git_merge" title="Git merge">Git merge</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-8" href="#%D0%9F%D1%83%D1%88_%D0%B8_%D0%BF%D1%83%D0%BB%D0%BB" title="Пуш и пулл">Пуш и пулл</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-9" href="#%D0%97%D0%B0%D1%87%D0%B5%D0%BC_%D0%BD%D1%83%D0%B6%D0%B5%D0%BD_GitHub" title="Зачем нужен GitHub">Зачем нужен GitHub</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-10" href="#%D0%9A%D0%B0%D0%BA_%D0%BD%D0%B0%D1%87%D0%B0%D1%82%D1%8C_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%83_%D1%81_Git" title="Как начать работу с Git">Как начать работу с Git</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-11" href="#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D1%84%D0%B0%D0%B9%D0%BB%D0%B0_%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D0%B9" title="Настройка файла конфигураций">Настройка файла конфигураций</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-12" href="#%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F_%D0%B8_%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D1%81_Git" title="Создание репозитория и принцип работы с Git">Создание репозитория и принцип работы с Git</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-13" href="#%D0%9A%D0%BE%D0%BC%D0%BC%D0%B8%D1%82_%E2%80%93_%D1%8D%D1%82%D0%BE%E2%80%A6" title="Коммит – это…">Коммит – это…</a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-14" href="#%D0%A3%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%BE_%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%B0" title="Устройство коммита">Устройство коммита</a></li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class="ez-toc-link ez-toc-heading-15" href="#%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%B0" title="Создание коммита">Создание коммита</a></li></ul></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-16" href="#%D0%9E%D1%82%D0%BB%D0%B8%D1%87%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%B0_%D0%BE%D1%82_%D0%BF%D1%83%D1%88%D0%B0" title="Отличие коммита от пуша">Отличие коммита от пуша</a></li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class="ez-toc-link ez-toc-heading-17" href="#%D0%9A%D0%BB%D1%8E%D1%87%D0%B5%D0%B2%D1%8B%D0%B5_%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%8B_Git" title="Ключевые команды Git">Ключевые команды Git</a></li></ul></nav></div>
<p>Git (или «гит») – система контроля версий, помогающая отслеживать историю изменений в документах и различных проектах. Этот инструмент используется разработчиками для того, чтобы совместно трудиться над разнообразными приложениями. Далее его предстоит изучить более подробно. Внимание необходимо уделить команде Commit. Она является одной из важнейших, особенно для тех, кто планирует работать над тем или иным проектом большой командой.</p>
<p>Представленная ниже информация объяснит, что такое Git, а также как работает этот инструмент. С ее помощью получится разобраться не только с системой контроля версий, но и с управляющими командами. А еще – познакомиться с несколькими ключевыми понятиями, которые помогут лучше разобраться в Git. Предложенная информация подойдет для изучения как разработчиками-новичками, так и уже более опытными программистами.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%BA%D0%BE%D0%BD%D1%82%D1%80%D0%BE%D0%BB%D1%8F_%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D0%B9_%E2%80%93_%D1%8D%D1%82%D0%BE%E2%80%A6"></span>Система контроля версий – это…<span class="ez-toc-section-end"></span></h2>
<p>Система контроля версий (или система управления версиями) – это программное обеспечение, предназначенное для облегчения работы с регулярно меняющейся информацией. На английском термин звучит как «version control system» или VCS.</p>
<p>С помощью системы управления версиями получится хранить несколько версий (сборок) одного и того же документа, а при необходимости – возвращаться к более ранним «наработкам». Соответствующее программное обеспечение позволяет определить, кто и когда внес те или иные корректировки в документ.</p>
<p>Подобные системы активно используются в разработке программного обеспечения. Они помогают хранить исходные коды программируемых проектов. В других областях деятельности VCS тоже находит применение. Такие приложения используются там, где ведется работа с большим количеством непрерывно изменяющихся документов в электронном формате.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="Git_%E2%80%93_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5"></span>Git – определение<span class="ez-toc-section-end"></span></h2>
<p>Git – система управления версиями с распределенной архитектурой. Здесь каждая рабочая копия кода представлена репозиторием. За счет такого подхода разработчики смогут хранить историю изменений в полном объеме.</p>
<p>Разработка Git была начала в 2005 году Линусом Торвальдсом – создателем Linux. Среди базовых возможностей этого программного обеспечения можно выделить:</p>
<ul>
<li>возврат к любой из предыдущих версий исходного кода проекта;</li>
<li>просмотр истории внесения изменений;</li>
<li>параллельную работу над проектом;</li>
<li>backup выбранного кода.</li>
</ul>
<p>Далее предстоит познакомиться с основными элементами этой системы управления версиями, а затем – с командами, которые пригодятся каждому разработчику. Особое внимание будет уделено commit.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D0%BE%D0%BD%D1%8F%D1%82%D0%B8%D0%B5_%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F"></span>Понятие репозитория<span class="ez-toc-section-end"></span></h3>
<p>Репозиторий – это своеобразное облачное хранение проекта на сервере. Так описываются все файлы, находящиеся под контролем версий, включая историю их изменения и иной служебной информацией.</p>
<p>Git-репозиторий может быть создан несколькими способами – путем выбора необходимой папки на устройстве (компьютере) или за счет копирования себе уже существующего репозитория.</p>
<p>Работая с Git, каждый разработчик имеет право на создание бесконечного числа репозиториев – по одному на каждый проект. Также все написанные программы могут вестись в пределах одного «облачного хранилища», но это не очень удобно. Рано или поздно репозиторий превратится в нечто непонятное. Поэтому разработчики взяли за правило принцип «один проект = одно отдельное хранилище».</p>
<p>В репозиториях допустимо хранить:</p>
<ul>
<li>графики;</li>
<li>картинки;</li>
<li>текстовые документы;</li>
<li>базы данных;</li>
<li>файлы с исходными кодами приложений;</li>
<li>прочие материалы в электронном виде, необходимые для работы над проектом.</li>
</ul>
<p>С Git репозиториями при использовании соответствующей системы контроля версий придется взаимодействовать постоянно.</p>
<h4 class="wp-block-heading"><span class="ez-toc-section" id="%D0%93%D0%B4%D0%B5_%D1%85%D1%80%D0%B0%D0%BD%D1%8F%D1%82%D1%81%D1%8F_%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B8"></span><em>Где хранятся репозитории</em><span class="ez-toc-section-end"></span></h4>
<p>Существуют различные способы хранения и использования репозитория. Можно выделить локальные, централизованные, а также распределенные системы контроля версий. Они имеют определенные различия, знать о которых должен каждый программист.</p>
<p>Локальные системы контроля версий хранят и используют репозитории на одном устройстве. Работать с соответствующей системой имеет право только один программист. При использовании централизованной системы репозиторий получится обнаружить на одном «рабочем» сервере.</p>
<p>Лучшим вариантом для разработчиков, особенно если их в команде много, станут распределенные системы контроля версий. Именно в их число входит рассматриваемое приложение Git. Это своеобразное облачное хранилище. Именно там будет размещаться репозиторий. Каждый пользователь будет хранить соответствующий элемент на своем устройстве целиком. По мере необходимости (внесения изменений) данные в репозиториях будут синхронизироваться друг с другом.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%91%D1%80%D0%B0%D0%BD%D1%87"></span>Бранч<span class="ez-toc-section-end"></span></h3>
<p>Чтобы понять, что собой представляет Git Commit, необходимо сначала разобраться с особенностями рассматриваемой системы контроля версий. Она включает в себя несколько ключевых элементов. Кроме репозитория значение имеет Git branch. Это ветка проекта. Его копия, в которую допустимо вносить те или иные изменения. На основной проект соответствующие корректировки оказывать влияние не будут.</p>
<p>Git-репозитории всегда имеют в своем составе минимум один branch (бранч), который носит название master. Если не создавать других веток, то все изменения будут сразу идти в главную ветку проекта. Это нормальное явление для небольших проектов, но в более «серьезных» приложениях принято создавать ветки.</p>
<p>Master – ветка, используемая для выпуска новых версий проекта со всеобщим доступом. То, что сюда добавляется, будет сразу доступно пользователям. С технической точки зрения ветка – это указатель или ссылка на последний Git Commit в этой самой ветке.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%BB%D0%BE%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5"></span>Клонирование<span class="ez-toc-section-end"></span></h3>
<p>Git clone – это клонирование. Процесс, описываемый как копирование репозитория себе на жесткий диск устройства. Это необходимо для того, чтобы получить право вносить в соответствующее хранилище изменения.</p>
<p>От простого копирования клонирование отличается тем, что при нем вместе с файлами проекта «загружается» еще и:</p>
<ul>
<li>вся история версий;</li>
<li>полностью все ветки;</li>
<li>история работы (целиком).</li>
</ul>
<p>Если кто-то внесет собственные изменения в проект, за счет упомянутой информации удастся получить их. При копировании необходимых документов с чужого устройства никакие истории и связи не сохраняются. Синхронизация отсутствует. Программист просто получит набор файлов.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="Git_merge"></span>Git merge<span class="ez-toc-section-end"></span></h3>
<p>Git merge или «смержить» – это отправка всего, что было выполнено в одной ветке, в другую. Новый код, исправленные ошибки, дополнительные опции и функции – все это в полном объеме будет отправлено в новую ветку. Если что-то в программном коде будет удалено, соответствующий фрагмент исчезнет и из git branch.</p>
<p>Схема у Git merge будет следующей:</p>
<ol>
<li>В master запускается рабочий код с первой версией сайта. Она автоматически отправляется на сборку.</li>
<li>Разработчик создает новую ветку на основе «мастера».</li>
<li>В этой новой ветке пишется программный код, добавляющий интерактивные функции на веб-страницу.</li>
<li>Ветка тестируется в качестве отдельного проекта. При наличии ошибок осуществляется их исправление программистом.</li>
<li>Если тестирование прошло успешно, ветка смерживается в master. Это повлечет за собой образование сразу готовой сборки сайта с новыми опциями.</li>
</ol>
<p>Перед тем как изучать Гит Коммит, необходимо обратить внимание на еще несколько элементов рассматриваемой системы. Зная их, разработчик сможет полноценно работать с клиент-серверными моделями.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9F%D1%83%D1%88_%D0%B8_%D0%BF%D1%83%D0%BB%D0%BB"></span>Пуш и пулл<span class="ez-toc-section-end"></span></h3>
<p>Git push используется для отправки информации со своего проекта на сервер. Разработчик должен указать имя ветки, в которую хочет направить исходный файл с кодом, а серверная сторона принимает данные, проверяет их и добавляет к себе.</p>
<p>Иногда случаются ситуации, при которых описанные манипуляции сервер выполнять отказывается. Это связано с тем, что у разработчика на устройстве была неактуальная ветка. За время внесения собственных правок другие программисты уже внесли в проект несколько изменений, сохранили их у себя, а также выгрузили на сервер. В конечном итоге получилось так, что у одних соответствующая ветка осталась актуальной и свежей, а у других – устарела. Чтобы не принимать запросы из «старых» веток Git предусматривает обновление информации у себя на компьютере. В этом поможет команда git pull.</p>
<p>Пулл работает просто – он скачивает с сервера актуальные версии веток и добавляет код оттуда на компьютер разработчика. Иногда новые данные вступают в конфликт с тем, что успел сделать программист. Разработчику предстоит определиться – какая сборка одинакового кода останется в проекте, а от чего придется избавиться.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%97%D0%B0%D1%87%D0%B5%D0%BC_%D0%BD%D1%83%D0%B6%D0%B5%D0%BD_GitHub"></span>Зачем нужен GitHub<span class="ez-toc-section-end"></span></h2>
<p>Изучая коммит в Git, стоит обратить внимание на GitHub. С этим сервисом предстоит плотно работать всем разработчикам, трудящимся в команде.</p>
<p>GitHub – наиболее популярный и известный сайт для хранения git-репозиториев и дальнейшего их использования. Данный портал также выступает в качестве одной из самых крупных площадок размещения готовых проектов с открытым исходным кодом. Для просмотра и загрузки общедоступных репозиториев здесь не придется ни оплачивать соответствующие услуги, ни регистрироваться.</p>
<p>GitHub – это в какой-то степени еще и своеобразная социальная сеть для разработчиков. Зарегистрированные здесь пользователи смогут:</p>
<ul>
<li>публиковать контент;</li>
<li>управлять собственными репозиториями;</li>
<li>вести обсуждения;</li>
<li>вносить вклад в чужие репозитории;</li>
<li>просматривать изменения в исходных кодах;</li>
<li>оставлять комментарии;</li>
<li>отслеживать обновления у коллег.</li>
</ul>
<p>GitHub часто используется при поиске работы в области программирования. Существуют разнообразные онлайн-сервисы, поддерживающие интеграцию с упомянутой площадкой. В качестве альтернативы можно использовать BitBucket или GitLab. Эти площадки имеют меньшую аудиторию, но поддерживают уникальные функции. Пример – BitBucket удобно использовать для небольших приложений с закрытым исходным кодом.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%B0%D0%BA_%D0%BD%D0%B0%D1%87%D0%B0%D1%82%D1%8C_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%83_%D1%81_Git"></span>Как начать работу с Git<span class="ez-toc-section-end"></span></h2>
<p>Git Commit можно рассматривать после того, как разработчик научился запускать рассматриваемую систему контроля версий. Чтобы начать работу с «сервисом», необходимо установить его на устройство.</p>
<p>В случае с Windows инициализация осуществляется <a href="https://git-scm.com/download/win" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">отсюда<span class="wpel-icon wpel-image wpel-icon-6"></span></a>. В случае с macOS Git выступает частью инструмента командной строки XCode. Его наличие можно проверить при помощи терминала. В нем требуется обработать команду «git —version». Для операционных систем Linux предстоит использовать команду sudo apt install git-all. Вместо нее подойдет sudo dnf install git-all.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D1%84%D0%B0%D0%B9%D0%BB%D0%B0_%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D0%B9"></span>Настройка файла конфигураций<span class="ez-toc-section-end"></span></h3>
<p>После установки Git необходимо настроить пользовательское имя и e-mail – эти данные используются для идентификации. Они сохраняются в конфигурационном файле .gitconfig.</p>
<p>Отредактировать этот файл можно напрямую через редактор или при помощи команды git config –global —edit. Для редактирования отдельных полей соответствующая команда немного видоизменяется: вместо edit необходимо указать поле и значение. Для настройки имени пользователя и электронной почты требуется задействовать поля user.email и user.name.</p>
<p>Также поддерживается возможность настройки специального текстового редактора для написания коммитов в Git. Для этого используется поле core.editor. По умолчанию в системе используется стандартный редактор. Поле commit.template необходимо для указания шаблона, применяемого при каждом совершенном коммите.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D1%8F_%D0%B8_%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B_%D1%81_Git"></span>Создание репозитория и принцип работы с Git<span class="ez-toc-section-end"></span></h3>
<p>Создать новый репозиторий поможет команда git init. Если программисту необходимо скопировать уже существующее «хранилище», рекомендуется использовать команду: git clone <адрес_репозитория>.</p>
<p>Коммит в Git – это одна из базовых команд. Перед ее использованием необходимо изучить основы работы системы контроля версий на локальном устройстве. Это связано с тем, что основная работа осуществляется именно там.</p>
<p>Работать с системой контроля версий допустимо через графический интерфейс и командную строку. Второй вариант требуется знать всем веб-программистам. Это связано с тем, что она дает больше возможностей, чем инструменты с интерфейсом.</p>
<p>Git-команды имеют следующую форму записи: git <команда> <аргументы>. В качестве передаваемого параметра (аргумента) может выступать путь к файлу.</p>
<p>У команд встречаются опции, которые обозначаются как —<опция> или —<однобуквенная опция>. С их помощью удается производить более детальную настройку действия команды. Чтобы посмотреть встроенное руководство по командам, рекомендуется использовать команду git help <команда>. </p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%BE%D0%BC%D0%BC%D0%B8%D1%82_%E2%80%93_%D1%8D%D1%82%D0%BE%E2%80%A6"></span>Коммит – это…<span class="ez-toc-section-end"></span></h2>
<p>Коммит в Git – это команда, которая делает снимок для нынешнего состояния изменений. Так называется операция, которая берет подготовленные корректировки и отправляет их в репозиторий в виде единого целого.</p>
<p>Коммит необходим для разбиения разработки, состоящей из большого количества правок, на отдельные этапы (шаги). Он представляет собой некое логически завершенное изменение внутри проекта и понятную точку, к которой разрешается вернуться в будущем, если в процессе разработки возникнут проблемы.</p>
<p>Изменения в рамках одного коммита в Git подчиняются определенным правилам и рекомендациям. Их заранее устанавливает команда разработчиков. Соответствующие принципы будут иметь отношение к присваиванию имени, описанию и содержанию коммитов.</p>
<p>Коммитить разрешено как один файл, так и сразу несколько. Система самостоятельно обнаружит изменения в каждом документе, а затем добавит их в проект. Единственное требование, которое необходимо запомнить относительно рассматриваемой команды – это необходимость указания того, что именно изменено «человеческим» языком. Эту информацию другие разработчики будут видеть в качестве описания.</p>
<p>Коммит можно оставлять хоть после правки каждой строчки. Иногда именно такой подход позволяет не упустить действительно важные изменения.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A3%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%BE_%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%B0"></span>Устройство коммита<span class="ez-toc-section-end"></span></h3>
<p>Коммит в Git предусматривает определенную структуру. Он включает в себя шесть компонентов:</p>
<ol>
<li>Указатель коммита –SHA1-хеш. Он служит для идентификации коммита.</li>
<li>Имя пользователя и электронная почта. Это данные, которые вносятся автоматически, опираясь на параметры git config.</li>
<li>Описание коммита. Тут необходимо указать изменения, которые были внесены в приложения. Здесь же прописывается версия коммита и иные сведения, помогающие разобраться в коммите Git.</li>
<li>Дерево – хеш-ссылка на корневое дерево всего проекта, содержащее структуру этого самого проекта.</li>
<li>Родительский коммит – хеш-ссылка на предыдущий коммит.</li>
<li>HEAD – элемент, указывающий на текущую версию проекта, расположенную в рабочей директории.</li>
</ol>
<p>Все коммиты имеют связь друг с другом за счет хеш-ссылок. Они организуют цепочку. Смещение указателя HEAD предоставит возможность изменения текущего состояния документов рабочей директории. HEAD ссылается на ветку, а ветка – на последний в ней коммит. Разработчики способны в ручном режиме смещать «указатель» на конкретный коммит, минуя ветки.</p>
<h3 class="wp-block-heading"><span class="ez-toc-section" id="%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%B0"></span>Создание коммита<span class="ez-toc-section-end"></span></h3>
<p>Коммит создается при помощи команды git commit-m “<сообщение>”. Ключ –m можно не использовать, но тогда придется работать с текстовым редактором в терминале. Это не всегда удобно. Именно поэтому рекомендуется при создании коммита использовать –m.</p>
<p>После выполнения коммита в терминал будет выведено сообщение-отчет. А в нем указываются добавленные в репозиторий документы. Повторно посмотреть историю коммитов и сведений о них поможет команда git log.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9E%D1%82%D0%BB%D0%B8%D1%87%D0%B8%D0%B5_%D0%BA%D0%BE%D0%BC%D0%BC%D0%B8%D1%82%D0%B0_%D0%BE%D1%82_%D0%BF%D1%83%D1%88%D0%B0"></span>Отличие коммита от пуша<span class="ez-toc-section-end"></span></h2>
<p>Коммит – это фиксирование изменений в приложении. Некоторые разработчики проводят аналогию с подведением итогов в работе.</p>
<p>Пуш – это отправка сделанной работы туда, где хранится копия необходимого разработчику кода. В этом случае последовательность действий при разработке окажется следующей:</p>
<ol>
<li>Разработчик подключается к репозиторию и клонирует его.</li>
<li>Осуществляется создание новой ветки.</li>
<li>Перед началом работы создается пулл. Он необходим, чтобы забрать актуальную версию документов.</li>
<li>В ветке пишется и размещается все необходимое для работы приложения.</li>
<li>Для отправки ветки другим разработчикам используется пуш.</li>
<li>После одобрения и перепроверки выполненной работы ветку мержат с мастер-меткой.</li>
</ol>
<p>Теперь новые функции и опции будут доступны всем пользователям.</p>
<h2 class="wp-block-heading"><span class="ez-toc-section" id="%D0%9A%D0%BB%D1%8E%D1%87%D0%B5%D0%B2%D1%8B%D0%B5_%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D1%8B_Git"></span>Ключевые команды Git<span class="ez-toc-section-end"></span></h2>
<p>Система контроля версий поддерживает множество команд. Среди них не только коммит, но и другие полезные операции. Вот несколько наиболее распространенных операций, которые можно выполнить через git:</p>
<ol>
<li>Git add – добавление содержимого рабочего каталога в индекс для предыдущего коммита.</li>
<li>Git status – отвечает за демонстрацию состояния документов в рабочем каталоге и индексе: какие файлы изменены, но не добавлены в индекс, а какие уже ожидают коммита. Используется для вывода подсказок о том, как менять состояние документов.</li>
<li>Git reset – используется для того, чтобы отметить изменения. Она корректирует HEAD-указатель и опционально – состояние индекса.</li>
<li>Git mv – способ перемещения файла.</li>
<li>Git clean – команда, отвечающая за удаление мусора из рабочего каталога.</li>
<li>Git rm – используется для того, чтобы удалить файлы из индекса и рабочей копии.</li>
</ol>
<p>Теперь понятно, что собой представляет Git, а также как пользоваться коммитом. Лучше узнать о системе контроля версий и научиться ей управлять помогут дистанционные онлайн-курсы. На них в срок до 12 месяцев научат работать с рассмотренным приложением и его командами. В конце будет выдан сертификат в электронной форме, подтверждающий приобретенные навыки и знания.</p>
<p><em>Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в <a href="https://otus.ru/?utm_source=oj" target="_blank" rel="noreferrer noopener nofollow external" data-wpel-link="external" class="wpel-icon-right">Otus<span class="wpel-icon wpel-image wpel-icon-6"></span></a>!</em> </p>
</div><!-- .post-content -->
<div class="the-post-foot cf">
<div class="tag-share cf">
<div class="post-tags"><a href="https://otus.ru/journal/tag/git/" rel="tag" data-wpel-link="internal">Git</a><a href="https://otus.ru/journal/tag/programmirovanie/" rel="tag" data-wpel-link="internal">программирование</a></div>
<div class="post-share">
<div class="post-share-icons cf">
<span class="counters">
</span>
<a href="https://www.facebook.com/sharer.php?u=https%3A%2F%2Fotus.ru%2Fjournal%2Frabota-s-git-komanda-commit%2F" class="link facebook wpel-icon-right" target="_blank" title="Share on Facebook" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-facebook"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fotus.ru%2Fjournal%2Frabota-s-git-komanda-commit%2F&text=%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%20%D1%81%20Git.%20%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0%20Commit" class="link twitter wpel-icon-right" target="_blank" title="Share on Twitter" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-twitter"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fotus.ru%2Fjournal%2Frabota-s-git-komanda-commit%2F" class="link linkedin wpel-icon-right" target="_blank" title="LinkedIn" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-linkedin"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
<a href="https://pinterest.com/pin/create/button/?url=https%3A%2F%2Fotus.ru%2Fjournal%2Frabota-s-git-komanda-commit%2F&media=https%3A%2F%2Fotus.ru%2Fjournal%2Fwp-content%2Fuploads%2F2024%2F02%2Foj-1080x720-34.jpg&description=%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%20%D1%81%20Git.%20%D0%9A%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0%20Commit" class="link pinterest wpel-icon-right" target="_blank" title="Pinterest" data-wpel-link="external" rel="nofollow external noopener noreferrer"><i class="fa fa-pinterest-p"></i><span class="wpel-icon wpel-image wpel-icon-6"></span></a>
</div>
</div>
</div>
</div>
<div class="post-nav">
<div class="post previous cf">
<a href="https://otus.ru/journal/apache-istoriya-razvitiya-i-principy-raboty/" title="Prev Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-left"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/apache-istoriya-razvitiya-i-principy-raboty/" class="image-link" rel="previous" data-wpel-link="internal">
<img width="150" height="106" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20106%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Apache: история развития и принципы работы" decoding="async" data-srcset="https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-33-150x106.jpg 150w, https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-33-300x212.jpg 300w, https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-33-1024x724.jpg 1024w, https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-33-768x543.jpg 768w, https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-33-1536x1086.jpg 1536w" data-src="https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-33-150x106.jpg" data-sizes="(max-width: 150px) 100vw, 150px" title="Apache: история развития и принципы работы" /> </a>
<div class="post-meta">
<span class="label">Prev Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/apache-istoriya-razvitiya-i-principy-raboty/" data-wpel-link="internal">Apache: история развития и принципы работы</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/apache-istoriya-razvitiya-i-principy-raboty/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2024-02-18T15:56:11+00:00">18 февраля, 2024</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">7 Mins Read</span>
</div>
</div> </div>
</span>
</div>
<div class="post next cf">
<a href="https://otus.ru/journal/docker-ot-a-do-ya/" title="Next Post" class="nav-icon" data-wpel-link="internal">
<i class="fa fa-angle-right"></i>
</a>
<span class="content">
<a href="https://otus.ru/journal/docker-ot-a-do-ya/" class="image-link" rel="next" data-wpel-link="internal">
<img width="150" height="106" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20150%20106%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="attachment-thumbnail size-thumbnail lazyload wp-post-image" alt="Docker от А до Я" decoding="async" data-srcset="https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-35-150x106.jpg 150w, https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-35-300x212.jpg 300w, https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-35-1024x724.jpg 1024w, https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-35-768x543.jpg 768w, https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-35-1536x1086.jpg 1536w" data-src="https://otus.ru/journal/wp-content/uploads/2024/02/oj-1080x720-35-150x106.jpg" data-sizes="(max-width: 150px) 100vw, 150px" title="Docker от А до Я" /> </a>
<div class="post-meta">
<span class="label">Next Post</span>
<div class="post-meta post-meta-b">
<h2 class="post-title">
<a href="https://otus.ru/journal/docker-ot-a-do-ya/" data-wpel-link="internal">Docker от А до Я</a>
</h2>
<div class="below">
<a href="https://otus.ru/journal/docker-ot-a-do-ya/" class="meta-item date-link" data-wpel-link="internal"><time class="post-date" datetime="2024-02-20T18:35:49+00:00">20 февраля, 2024</time></a>
<span class="meta-sep"></span>
<span class="meta-item read-time">10 Mins Read</span>
</div>
</div> </div>
</span>
</div>
</div>
<section class="related-posts grid-3">
<h4 class="section-head"><span class="title">Читать ещё</span></h4>
<div class="ts-row posts cf">
<article class="post col-4">
<a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" title="Уровень готовности CTO к 2026" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Уровень готовности CTO к 2026" title="Уровень готовности CTO к 2026" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-3-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/uroven-gotovnosti-cto-k-2026/" class="post-link" data-wpel-link="internal">Уровень готовности CTO к 2026</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-16T19:50:59+00:00">16 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" title="Новые уроки ноября: только топ-темы по программированию" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Новые уроки ноября: только топ-темы по программированию" title="Новые уроки ноября: только топ-темы по программированию" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg 270w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-770x515.jpg 770w, https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-370x245.jpg 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/11/oj-1080x720-kopiya-2-270x180.jpg" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/novye-uroki-noyabrya-tolko-top-temy-po-programmirovaniju/" class="post-link" data-wpel-link="internal">Новые уроки ноября: только топ-темы по программированию</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-11-09T23:24:11+00:00">9 ноября, 2025</time>
</div>
</div>
</article >
<article class="post col-4">
<a href="https://otus.ru/journal/schjot-idjot-na-chasy/" title="Счёт идёт на часы" class="image-link" data-wpel-link="internal">
<img width="270" height="180" src="data:image/svg+xml,%3Csvg%20viewBox%3D%270%200%20270%20180%27%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%3E%3C%2Fsvg%3E" class="image lazyload wp-post-image" alt="Счёт идёт на часы" title="Счёт идёт на часы" decoding="async" loading="lazy" data-srcset="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png 270w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-770x515.png 770w, https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-370x245.png 370w" data-src="https://otus.ru/journal/wp-content/uploads/2025/10/oj-1080x720-kopiya-7-270x180.png" data-sizes="(max-width: 270px) 100vw, 270px" /> </a>
<div class="content">
<h3 class="post-title"><a href="https://otus.ru/journal/schjot-idjot-na-chasy/" class="post-link" data-wpel-link="internal">Счёт идёт на часы</a></h3>
<div class="post-meta">
<time class="post-date" datetime="2025-10-30T15:04:59+00:00">30 октября, 2025</time>
</div>
</div>
</article >
</div>
</section>
</article> <!-- .the-post -->
</div>
<aside class="col-4 sidebar">
<div class="inner">
<ul>
<li id="search-2" class="widget widget_search"><h5 class="widget-title"><span>Поиск по блогу</span></h5>
<form method="get" class="search-form" action="https://otus.ru/journal/">
<label>
<span class="screen-reader-text">Search for:</span>
<input type="search" class="search-field" placeholder="Введите запрос и нажмите Enter" value="" name="s" title="Search for:" />
</label>
<button type="submit" class="search-submit"><i class="fa fa-search"></i></button>
</form>
</li>
<li id="tag_cloud-5" class="widget widget_tag_cloud"><h5 class="widget-title"><span>Метки</span></h5><div class="tagcloud"><a href="https://otus.ru/journal/tag/android-2/" class="tag-cloud-link tag-link-74 tag-link-position-1" style="font-size: 12.472222222222pt;" aria-label="Android (34 элемента)" data-wpel-link="internal">Android</a>
<a href="https://otus.ru/journal/tag/c-3/" class="tag-cloud-link tag-link-91 tag-link-position-2" style="font-size: 10.916666666667pt;" aria-label="C (23 элемента)" data-wpel-link="internal">C</a>
<a href="https://otus.ru/journal/tag/c-2/" class="tag-cloud-link tag-link-81 tag-link-position-3" style="font-size: 12.666666666667pt;" aria-label="C# (35 элементов)" data-wpel-link="internal">C#</a>
<a href="https://otus.ru/journal/tag/c/" class="tag-cloud-link tag-link-20 tag-link-position-4" style="font-size: 12.472222222222pt;" aria-label="c++ (34 элемента)" data-wpel-link="internal">c++</a>
<a href="https://otus.ru/journal/tag/computer-science/" class="tag-cloud-link tag-link-209 tag-link-position-5" style="font-size: 15.972222222222pt;" aria-label="computer science (78 элементов)" data-wpel-link="internal">computer science</a>
<a href="https://otus.ru/journal/tag/css/" class="tag-cloud-link tag-link-288 tag-link-position-6" style="font-size: 8.6805555555556pt;" aria-label="CSS (13 элементов)" data-wpel-link="internal">CSS</a>
<a href="https://otus.ru/journal/tag/data-science/" class="tag-cloud-link tag-link-151 tag-link-position-7" style="font-size: 8pt;" aria-label="Data Science (11 элементов)" data-wpel-link="internal">Data Science</a>
<a href="https://otus.ru/journal/tag/devops/" class="tag-cloud-link tag-link-98 tag-link-position-8" style="font-size: 10.138888888889pt;" aria-label="devops (19 элементов)" data-wpel-link="internal">devops</a>
<a href="https://otus.ru/journal/tag/docker/" class="tag-cloud-link tag-link-143 tag-link-position-9" style="font-size: 8.2916666666667pt;" aria-label="Docker (12 элементов)" data-wpel-link="internal">Docker</a>
<a href="https://otus.ru/journal/tag/gamedev/" class="tag-cloud-link tag-link-25 tag-link-position-10" style="font-size: 11.694444444444pt;" aria-label="gamedev (28 элементов)" data-wpel-link="internal">gamedev</a>
<a href="https://otus.ru/journal/tag/hr/" class="tag-cloud-link tag-link-103 tag-link-position-11" style="font-size: 8pt;" aria-label="hr (11 элементов)" data-wpel-link="internal">hr</a>
<a href="https://otus.ru/journal/tag/html/" class="tag-cloud-link tag-link-217 tag-link-position-12" style="font-size: 11.208333333333pt;" aria-label="HTML (25 элементов)" data-wpel-link="internal">HTML</a>
<a href="https://otus.ru/journal/tag/ios/" class="tag-cloud-link tag-link-101 tag-link-position-13" style="font-size: 8.9722222222222pt;" aria-label="iOS (14 элементов)" data-wpel-link="internal">iOS</a>
<a href="https://otus.ru/journal/tag/it/" class="tag-cloud-link tag-link-50 tag-link-position-14" style="font-size: 10.527777777778pt;" aria-label="IT (21 элемент)" data-wpel-link="internal">IT</a>
<a href="https://otus.ru/journal/tag/java/" class="tag-cloud-link tag-link-75 tag-link-position-15" style="font-size: 15.680555555556pt;" aria-label="Java (73 элемента)" data-wpel-link="internal">Java</a>
<a href="https://otus.ru/journal/tag/javascript/" class="tag-cloud-link tag-link-83 tag-link-position-16" style="font-size: 14.319444444444pt;" aria-label="JavaScript (53 элемента)" data-wpel-link="internal">JavaScript</a>
<a href="https://otus.ru/journal/tag/linux/" class="tag-cloud-link tag-link-141 tag-link-position-17" style="font-size: 11.888888888889pt;" aria-label="Linux (29 элементов)" data-wpel-link="internal">Linux</a>
<a href="https://otus.ru/journal/tag/machine-learning/" class="tag-cloud-link tag-link-167 tag-link-position-18" style="font-size: 8.6805555555556pt;" aria-label="Machine Learning (13 элементов)" data-wpel-link="internal">Machine Learning</a>
<a href="https://otus.ru/journal/tag/otus-book/" class="tag-cloud-link tag-link-261 tag-link-position-19" style="font-size: 9.9444444444444pt;" aria-label="otus book (18 элементов)" data-wpel-link="internal">otus book</a>
<a href="https://otus.ru/journal/tag/php/" class="tag-cloud-link tag-link-45 tag-link-position-20" style="font-size: 10.527777777778pt;" aria-label="PHP (21 элемент)" data-wpel-link="internal">PHP</a>
<a href="https://otus.ru/journal/tag/python/" class="tag-cloud-link tag-link-27 tag-link-position-21" style="font-size: 16.944444444444pt;" aria-label="Python (99 элементов)" data-wpel-link="internal">Python</a>
<a href="https://otus.ru/journal/tag/qa/" class="tag-cloud-link tag-link-155 tag-link-position-22" style="font-size: 11.402777777778pt;" aria-label="qa (26 элементов)" data-wpel-link="internal">qa</a>
<a href="https://otus.ru/journal/tag/sql/" class="tag-cloud-link tag-link-38 tag-link-position-23" style="font-size: 12.861111111111pt;" aria-label="SQL (37 элементов)" data-wpel-link="internal">SQL</a>
<a href="https://otus.ru/journal/tag/team-lead/" class="tag-cloud-link tag-link-364 tag-link-position-24" style="font-size: 9.9444444444444pt;" aria-label="team lead (18 элементов)" data-wpel-link="internal">team lead</a>
<a href="https://otus.ru/journal/tag/unity/" class="tag-cloud-link tag-link-24 tag-link-position-25" style="font-size: 8pt;" aria-label="unity (11 элементов)" data-wpel-link="internal">unity</a>
<a href="https://otus.ru/journal/tag/algoritmy/" class="tag-cloud-link tag-link-30 tag-link-position-26" style="font-size: 9.9444444444444pt;" aria-label="Алгоритмы (18 элементов)" data-wpel-link="internal">Алгоритмы</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh/" class="tag-cloud-link tag-link-40 tag-link-position-27" style="font-size: 10.138888888889pt;" aria-label="Базы данных (19 элементов)" data-wpel-link="internal">Базы данных</a>
<a href="https://otus.ru/journal/tag/matematika/" class="tag-cloud-link tag-link-44 tag-link-position-28" style="font-size: 10.916666666667pt;" aria-label="Математика (23 элемента)" data-wpel-link="internal">Математика</a>
<a href="https://otus.ru/journal/tag/arhitektura-po/" class="tag-cloud-link tag-link-10 tag-link-position-29" style="font-size: 9.4583333333333pt;" aria-label="архитектура ПО (16 элементов)" data-wpel-link="internal">архитектура ПО</a>
<a href="https://otus.ru/journal/tag/bazy-dannyh-2/" class="tag-cloud-link tag-link-251 tag-link-position-30" style="font-size: 10.138888888889pt;" aria-label="базы данных (19 элементов)" data-wpel-link="internal">базы данных</a>
<a href="https://otus.ru/journal/tag/vebinar/" class="tag-cloud-link tag-link-201 tag-link-position-31" style="font-size: 13.930555555556pt;" aria-label="вебинар (48 элементов)" data-wpel-link="internal">вебинар</a>
<a href="https://otus.ru/journal/tag/dajdzhest/" class="tag-cloud-link tag-link-308 tag-link-position-32" style="font-size: 10.722222222222pt;" aria-label="дайджест (22 элемента)" data-wpel-link="internal">дайджест</a>
<a href="https://otus.ru/journal/tag/zapis-vebinara/" class="tag-cloud-link tag-link-226 tag-link-position-33" style="font-size: 14.902777777778pt;" aria-label="запись вебинара (61 элемент)" data-wpel-link="internal">запись вебинара</a>
<a href="https://otus.ru/journal/tag/zapis-uroka/" class="tag-cloud-link tag-link-272 tag-link-position-34" style="font-size: 16.069444444444pt;" aria-label="запись урока (80 элементов)" data-wpel-link="internal">запись урока</a>
<a href="https://otus.ru/journal/tag/informacionnaya-bezopasnost/" class="tag-cloud-link tag-link-232 tag-link-position-35" style="font-size: 10.138888888889pt;" aria-label="информационная безопасность (19 элементов)" data-wpel-link="internal">информационная безопасность</a>
<a href="https://otus.ru/journal/tag/karera-v-it/" class="tag-cloud-link tag-link-292 tag-link-position-36" style="font-size: 9.9444444444444pt;" aria-label="карьера в IT (18 элементов)" data-wpel-link="internal">карьера в IT</a>
<a href="https://otus.ru/journal/tag/podborka/" class="tag-cloud-link tag-link-7 tag-link-position-37" style="font-size: 12.666666666667pt;" aria-label="подборка (35 элементов)" data-wpel-link="internal">подборка</a>
<a href="https://otus.ru/journal/tag/podborka-statej/" class="tag-cloud-link tag-link-219 tag-link-position-38" style="font-size: 15.777777777778pt;" aria-label="подборка статей (75 элементов)" data-wpel-link="internal">подборка статей</a>
<a href="https://otus.ru/journal/tag/programmirovanie/" class="tag-cloud-link tag-link-65 tag-link-position-39" style="font-size: 22pt;" aria-label="программирование (332 элемента)" data-wpel-link="internal">программирование</a>
<a href="https://otus.ru/journal/tag/proekt/" class="tag-cloud-link tag-link-321 tag-link-position-40" style="font-size: 11.888888888889pt;" aria-label="проект (29 элементов)" data-wpel-link="internal">проект</a>
<a href="https://otus.ru/journal/tag/proektnaya-rabota/" class="tag-cloud-link tag-link-310 tag-link-position-41" style="font-size: 11.597222222222pt;" aria-label="проектная работа (27 элементов)" data-wpel-link="internal">проектная работа</a>
<a href="https://otus.ru/journal/tag/seti/" class="tag-cloud-link tag-link-181 tag-link-position-42" style="font-size: 12.958333333333pt;" aria-label="сети (38 элементов)" data-wpel-link="internal">сети</a>
<a href="https://otus.ru/journal/tag/testirovanie/" class="tag-cloud-link tag-link-69 tag-link-position-43" style="font-size: 13.930555555556pt;" aria-label="тестирование (48 элементов)" data-wpel-link="internal">тестирование</a>
<a href="https://otus.ru/journal/tag/upravlenie-komandoj/" class="tag-cloud-link tag-link-63 tag-link-position-44" style="font-size: 11.694444444444pt;" aria-label="управление командой (28 элементов)" data-wpel-link="internal">управление командой</a>
<a href="https://otus.ru/journal/tag/habr-2/" class="tag-cloud-link tag-link-203 tag-link-position-45" style="font-size: 13.930555555556pt;" aria-label="хабр (48 элементов)" data-wpel-link="internal">хабр</a></div>
</li>
</ul>
</div>
</aside>
</div> <!-- .ts-row -->
</div> <!-- .main -->
<footer class="main-footer dark bold">
<section class="lower-footer cf">
<div class="wrap">
<div class="links">
<div class="menu-menju-navykov-container"><ul id="menu-menju-navykov-1" class="menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10413"><a href="https://otus.ru/categories/programming/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Программирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10414"><a href="https://otus.ru/categories/architecture/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Архитектура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10415"><a href="https://otus.ru/categories/operations/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Инфраструктура<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10416"><a href="https://otus.ru/categories/information-security-courses/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Безопасность<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10417"><a href="https://otus.ru/categories/data-science/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Data Science<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10418"><a href="https://otus.ru/categories/gamedev/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">GameDev<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10419"><a href="https://otus.ru/categories/marketing-business/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Управление<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10420"><a href="https://otus.ru/categories/analytics/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Аналитика и анализ<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
<li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-10421"><a href="https://otus.ru/categories/testing/" data-wpel-link="external" target="_blank" rel="nofollow external noopener noreferrer" class="wpel-icon-right">Тестирование<span class="wpel-icon wpel-image wpel-icon-6"></span></a></li>
</ul></div> </div>
<p class="copyright"> © 2015-2026 OTUS </p>
<div class="to-top">
<a href="#" class="back-to-top"><i class="fa fa-angle-up"></i> Top</a>
</div>
</div>
</section>
</footer>
</div> <!-- .main-wrap -->
<div class="mobile-menu-container off-canvas" id="mobile-menu">
<a href="#" class="close"><i class="fa fa-times"></i></a>
<div class="logo">
</div>
<ul class="mobile-menu"></ul>
</div>
<div class="search-modal-wrap">
<div class="search-modal-box" role="dialog" aria-modal="true">
<form method="get" class="search-form" action="https://otus.ru/journal/">
<input type="search" class="search-field" name="s" placeholder="Search..." value="" required />
<button type="submit" class="search-submit visuallyhidden">Submit</button>
<p class="message">
Type above and press <em>Enter</em> to search. Press <em>Esc</em> to cancel. </p>
</form>
</div>
</div>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/clearfy/components/comments-plus/assets/js/url-span.js" id="wbcr-comments-plus-url-span-js"></script>
<script type="text/javascript" id="ez-toc-scroll-scriptjs-js-extra">
/* <![CDATA[ */
var eztoc_smooth_local = {"scroll_offset":"30"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/smooth_scroll.min.js" id="ez-toc-scroll-scriptjs-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/js-cookie/js.cookie.min.js" id="ez-toc-js-cookie-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/vendor/sticky-kit/jquery.sticky-kit.min.js" id="ez-toc-jquery-sticky-kit-js"></script>
<script type="text/javascript" id="ez-toc-js-js-extra">
/* <![CDATA[ */
var ezTOC = {"smooth_scroll":"1","visibility_hide_by_default":"","scroll_offset":"30","fallbackIcon":"<span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span>"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/plugins/easy-table-of-contents/assets/js/front.min.js" id="ez-toc-js-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/custom-script.js" id="custom-script-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/magnific-popup.js" id="magnific-popup-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.fitvids.js" id="jquery-fitvids-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/imagesloaded.min.js" id="imagesloaded-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/object-fit-images.js" id="object-fit-images-js"></script>
<script type="text/javascript" id="contentberg-theme-js-extra">
/* <![CDATA[ */
var Bunyad = {"custom_ajax_url":"\/journal\/rabota-s-git-komanda-commit\/"};
/* ]]> */
</script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theme.js" id="contentberg-theme-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/theia-sticky-sidebar.js" id="theia-sticky-sidebar-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jquery.slick.js" id="jquery-slick-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-content/themes/contentberg/js/jarallax.js" id="jarallax-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/masonry.min.js" id="masonry-js"></script>
<script type="text/javascript" src="https://otus.ru/journal/wp-includes/js/jquery/jquery.masonry.min.js" id="jquery-masonry-js"></script>
</body>
</html>
<!-- Cache served by breeze CACHE - Last modified: Mon, 09 Mar 2026 15:04:32 GMT -->