Как использовать теги git?

5 последних уроков рубрики «Разное»

  • Выбрать хороший хостинг для своего сайта достаточно сложная задача. Особенно сейчас, когда на рынке услуг хостинга действует несколько сотен игроков с очень привлекательными предложениями. Хорошим вариантом является лидер рейтинга Хостинг Ниндзя — Макхост.

  • Как разместить свой сайт на хостинге? Правильно выбранный хороший хостинг — это будущее Ваших сайтов

    Проект готов, Все проверено на локальном сервере OpenServer и можно переносить сайт на хостинг. Вот только какую компанию выбрать? Предлагаю рассмотреть хостинг fornex.com. Отличное место для твоего проекта с перспективами бурного роста.

  • Создание вебсайта — процесс трудоёмкий, требующий слаженного взаимодействия между заказчиком и исполнителем, а также между всеми членами коллектива, вовлечёнными в проект. И в этом очень хорошее подспорье окажет онлайн платформа Wrike.

  • Подборка из нескольких десятков ресурсов для создания мокапов и прототипов.

Одиночный разработчик, единственная ветвь

Даже если вы являетесь единственным разработчиком вашего проекта и (по крайней мере, пока), вы не планируете его менять, система управления версиями по-прежнему полезна. Это позволяет:

  • Вернитесь к некоторой рабочей версии. Если вы работаете над своим проектом и понимаете, что вы полностью напортачили, подход, который вы пробовали, не работает, и вы не знаете, как заставить его работать, приятно иметь возможность просто вернуться к последнему рабочему версии и начать заново.

    Это означает, что вы должны совершить, т.е. сделать снимок ваших изменений, когда у вас есть рабочая версия (ну, есть исключения, см. ниже). Чтобы не потерять много работы, вы должны совершать довольно часто, лучше всего (см. Ниже), когда вы завершаете одиночную функцию, отдельную проблему или отдельную часть функции или проблемы.

    Вы также хотели бы знать, что вы сделали, и то, над чем вы работали в последнее время. Это означает, что вы должны описывать каждый набор изменений (каждый фиксатор).

  • Аннотировать файл/просмотр истории. Если у вас нет идеальной памяти, иногда вам нужно знать, почему (и когда, и в случае, когда есть несколько разработчиков, и кто), вы написали заданный набор строк. Комментарии не всегда достаточно. Для этого вы можете использовать (если ваша система управления версиями предоставляет) линейные аннотации истории файлов ( или ) или другие аналогичные инструменты, такие как так называемый поиск “pickaxe” в Git, где вы выполняете поиск/просмотреть историю для коммитов, которые ввели или удалили заданную строку.

    Чтобы это было полезно, вам нужно написать хорошие сообщения о совершении, описать изменение и намерение изменения, чтобы вы знали, почему было сделано изменение.

  • История поиска, чтобы найти ошибки. Современные системы управления версиями предлагают альтернативные (для вставки инструкций печати или отладчика) способ поиска ошибок… в некоторых случаях. Когда вы замечаете ошибку или получаете ошибку, и ошибка не является результатом последнего изменения, вы можете использовать систему управления версиями (), чтобы автоматически найти фиксацию, введшую ошибку (первая фиксация, которая дала ошибку), Система контроля версий находит такую ​​фиксацию, используя биссектную историю проекта, извлекая (проверяя) версии, которые вы отмечаете как хорошие (без ошибок) или плохие, пока не найдет коммиты, которые ввели ошибку.

    Для этого вы всегда должны гарантировать, что версия работает (или, по крайней мере, компилирует), прежде чем совершать ее, иначе вы не будете ebale, чтобы решить, есть ли у команды ошибка или нет. Вы должны держать коммиты маленькими (с небольшим количеством изменений), поэтому, когда вы обнаружите фиксацию, которая ввела ошибку, вам нужно будет проверить только количество бесплатных строк, затронутых изменением. Вам также понадобятся хорошие сообщения о фиксации, поэтому вы должны знать, почему было сделано изменение (и решить, правильно ли это изменение).

Полезные советы

Делайте коммиты чаще. Это позволит проще сливать изменения с другими ветками.

Git позволяет отменять не только изменения целых файлов, но и их частей.

В Git нет команды переименования/перемещения файлов. Тем не менее, Git пытается выполнять эту работу автоматически. Чтобы гарантированно сохранить историю переименований, сделайте коммит, потом выполните переименования/перемещения файлов и сделайте ещё один коммит. Точное совпадение содержимого файлов даст гарантию сохранения истории. Если же вы одновременно переименуете и измените файл, то такой гарантии не будет.

Git Extensions содержит далеко не все команды, которые поддерживает Git. Однако это не является большой проблемой. Если нужно выполнить подобную команду, воспользуйтесь для этого окном “Git bash”. Git Extensions открывает его для текущего репозитория и текущей ветки.

Помните, что все изменения делаются над текущей веткой. Например, слияние делается из желаемого коммита в рабочую копию.

Инструмент 2: Pull Requests

Pull Requests — отличный способ внести свой вклад в репозиторий, сделав его форк. В конце дня, если мы хотим, мы можем отправить pull request владельцу репозитория, чтобы объединить наши изменения кода. Сам pull request может включать обсуждение качества кода, функций или даже общей стратегии.

Давайте теперь рассмотрим основные шаги для pull request.

Инициирование pull request

В Github есть две модели для pull request:

  1. Модель Fork & Pull — используется в общедоступном репозитории, на который у вас нет push-доступа
  2. Share Repository Model — используется в частном репозитории, на который у нас есть push-доступ. В этом случае форк не требуется.

Здесь мы видим рабочий процесс между двумя пользователями ( и ) для модели Fork and Pull:

  1. Определите репозиторий Github, в который вы хотите внести свой вклад, и нажмите кнопку «Fork», чтобы создать клон репозитория в вашей собственной учетной записи Github:
  2. Это создаст точную копию репозитория в вашем собственном аккаунте
  3. Выберите URL-адрес SSH, чтобы он запрашивал вашу парольную кодовую фразу SSH вместо имени пользователя и пароля каждый раз, когда вы делаете или . Затем мы будем клонировать этот репозиторий на наш локальный компьютер:
  4. Как правило, мы создадим новую ветку git для каждой новой задачи. Это хорошая практика, потому что в будущем, если мы продолжим обновление ветки после некоторых обсуждений, запрос на перенос будет автоматически обновляться. Давайте создадим новую ветку, чтобы внести очень простое изменение в файл :
  5. После внесения соответствующих дополнений для создания новых функций мы просто передадим новые изменения и проверку в ветку git master:
  6. На этом этапе мы запушим ветку в удаленный репозиторий. Для этого мы сначала перейдем на ветку с новой задачей, а так же на псевдоним для удаленного репозитория. Затем мы будем пушить изменения с помощью :
  7. На нашей развязанной странице Github репозитория мы перейдем к ветке с новой функцией, а затем нажмите кнопку «Pull Request».
  8. После отправки пул реквеста он напрямую приведет нас к странице запроса в исходном репозитории. Мы увидим наш запрос на pull.
  9. После обсуждения возможно, что владелец форкнутого репозитория может захотеть добавить изменения в новую функцию. В этом случае мы выберем одну и ту же ветку на нашей локальной машине, зафиксируем ее и запушим ее обратно на Github. Когда мы заходим на страницу запроса в оригинальном репозитории, он будет автоматически обновляться!

Слияние пул реквеста

Если вы являетесь владельцем оригинального репозитория, существует два способа слияния входящего пул реквеста:

  1. Слияние непосредственно на Github: если мы делаем слияние непосредственно на Github, то убедитесь, что нет конфликтов, и реквест готов к объединению в ведущую ветку. Владелец оригинального хранилища может просто щелкнуть зеленую кнопку «Слить запрос», чтобы сделать это:
  2. Слияние на наших локальных машинах: в других случаях могут возникнуть конфликты слияния, и после нажатия кнопки «Информация» у Github будут четкие инструкции о том, как мы можем объединить ветвь на нашей локальной машине, потянув за изменения из ветви контрибьютера:

Существуют различные модели создания веток, используемые для управления версиями в командах разработки программного обеспечения. Вот две популярные модели рабочего процесса git: (1) рабочий процесс Github, который имеет простую ветвящуюся модель и использует запросы на pull, и (2) Gitflow, который имеет более обширное разветвление. Модель, которая в конечном итоге будет выбрана, определенно будет меняться в зависимости от команды, проекта и ситуации.

3 ответа

Лучший ответ

Начнем с объяснения, что такое тег в git

Вы не сможете проверить теги, если он не находится локально в вашем репозитории, поэтому сначала вы должны теги в вашем локальном репозитории.

Сначала убедитесь, что тег существует локально, выполнив

Затем проверьте тег, запустив

Вместо используйте префикс .

В этом примере у вас есть 2 тега версии 1.0 и версии 1.1, вы можете проверить их любым из следующих способов:

Все вышеперечисленное будет делать то же самое, поскольку тег является только указателем на данную фиксацию.

происхождение: https://backlog.com/git-tutorial/img/post /stepup/capture_stepup4_1_1.png

Создать тег можно двумя способами:

Как клонировать конкретный тег?

Чтобы получить содержимое данного тега, вы можете использовать команду . Как объяснялось выше, теги похожи на любые другие коммиты, поэтому мы можем использовать и вместо использования SHA-1 просто заменить его тегом tag_name

Вариант 1:

Вариант 2:

Использование команды clone

Поскольку git поддерживает поверхностное клонирование , добавляя к команде clone, мы можем использовать имя тега вместо имени ветки. Git знает, как «перевести» заданный SHA-1 в соответствующий коммит.

Как проталкивать теги?

###

Чтобы вставить все теги:

Использование вместо простого указания .

Зачем?

Рекомендуется использовать refs/tags, поскольку иногда теги могут иметь то же имя, что и ваши ветки, и простой git push будет отправлять ветку вместо тега.

Чтобы вставить аннотированные теги и теги текущей истории, используйте:

###

Этот флаг подталкивает оба тега фиксирует и только :

  • Аннотированные теги (чтобы вы могли пропустить теги сборки local / temp)
  • Доступные теги (предки) из текущей ветки (находятся в истории)

Из Git 2.4 вы можете установить его с помощью конфигурации

Шпаргалка:

1268

CodeWizard
22 Ноя 2020 в 10:50

Чтобы проверить тег git, вы должны выполнить следующую команду

Например, как указано ниже.

Чтобы получить все теги, используйте команду

5

mani
7 Апр 2020 в 12:36

Чтобы получить конкретный код тега, попробуйте создать новую ветку, добавьте в нее код тега.
Я сделал это командой:

Rahul Khatri
25 Июл 2019 в 12:06

Что такое подмодули Git

Подмодули в Git — это просто стандартные репозитории Git. Никаких модных инноваций, все те же репозитории Git, которые мы все так хорошо знаем. Это тоже часть мощи субмодулей: они такие надежные и простые, потому что они «утомительны» (с технологической точки зрения) и прошли полевые испытания.

Единственное, что делает репозиторий Git подмодулем, — это то, что он помещается в другой, родительский репозиторий Git.

Помимо этого, подмодуль Git остается полностью функциональным репозиторием: вы можете выполнять все действия, которые вы уже знаете из своей «нормальной» работы с Git — от изменения файлов до фиксации, извлечения и отправки. В подмодуле возможно все.

Добавление подмодуля

Возьмем классический пример и предположим, что мы хотим добавить в наш проект стороннюю библиотеку. Прежде чем мы перейдем к какому-либо коду, имеет смысл создать отдельную папку, в которой такие вещи могут иметь дом:

Теперь мы готовы добавить сторонний код в наш проект — но упорядоченно, используя подмодули. Допустим, нам нужна небольшая библиотека JavaScript для преобразования часовых поясов:

Когда мы запускаем эту команду, Git начинает клонировать репозиторий в наш проект в виде подмодуля:

И если мы посмотрим на нашу папку с рабочей копией, мы увидим, что файлы библиотеки действительно прибыли в наш проект.

«Так в чем разница?» вы можете спросить. В конце концов, файлы сторонней библиотеки находятся здесь, как если бы мы скопировали их. Ключевое отличие в том, что они содержатся в собственном репозитории Git ! Если бы мы просто загрузили несколько файлов, добавили их в наш проект, а затем зафиксировали их — как и другие файлы в нашем проекте — они были бы частью того же репозитория Git. Подмодуль, однако, следит за тем, чтобы файлы библиотеки не «просачивались» в репозиторий нашего основного проекта.

Посмотрим, что еще произошло:.gitmodulesв корневой папке нашего основного проекта был создан новый файл. Вот что он содержит:

Этот.gitmodulesфайл — одно из нескольких мест, где Git отслеживает подмодули в нашем проекте. Другой.git/config, который теперь заканчивается так:

И, наконец, Git также хранит копию.gitрепозитория каждого подмодуля во внутренней.git/modulesпапке.

Все это технические детали, которые вам не нужно запоминать. Однако это, вероятно, поможет вам понять, что внутреннее обслуживание подмодулей Git довольно сложно

Вот почему важно убрать одну вещь: не связывайтесь с настройкой подмодуля Git вручную! Если вы хотите переместить, удалить или иным образом манипулировать подмодулем, сделайте себе одолжение и не пытайтесь сделать это вручную. Либо используйте соответствующие команды Git, либо графический интерфейс рабочего стола для Git, например «Tower», который позаботится об этих деталях за вас

Давайте посмотрим на статус нашего основного проекта, теперь, когда мы добавили подмодуль:

Как видите, Git рассматривает добавление подмодуля как изменение, как и любые другие. Соответственно, мы должны зафиксировать это изменение, как любое другое:

Создать ярлык

git tag v .. Создать тег:

git tag v1.0

После пометки просмотрите все метки:

git tag

Метка по умолчанию указана для последнего переданного коммита. Что делать, если я хочу пометить исторический коммит? Сначала найдите идентификатор коммита, представленный историей, а затем тег:

git log —pretty=oneline —abbrev-commit

Затем пометьте в соответствии с коммитом id:

git tag v0.5 ac67f0

Проверьте это снова с помощью тега git:

Кроме того, метки располагаются не в хронологическом порядке, а в порядке символов. Используйте git show v0.5 для просмотра информации о метке:

Вы также можете создавать теги с инструкциями

$ git tag -a v0.1 -m «version 0.1 released» ec12b05

Вы можете увидеть это описание в git show!

Задание 3. Commits

  1. Через VS Code создай файл со следующим содержимым:
  1. Нажми кнопку , чтобы открыть окно коммита

  2. Переведи из верхней части в нижнюю часть окна кнопкой либо двойным нажатием по имени файла.
    Теперь находится в .

Если Git Extensions не показывает изменений, то ты скорее всего забыл сохранить файл, потому что привык работать в IDE, которые делают это за тебя.
VS Code тоже умеет сохранять изменения автоматически: в главном меню открой и поставь галочку .

Если Git Extensions все равно не показывает изменения, то проверь имя созданного файла: должно быть .

  1. Введи в качестве сообщения к коммиту и сделай коммит кнопкой

  2. Убедись, что коммит появился в истории коммитов

  3. Создай файл со следующим содержимым:

  1. Выбери в истории коммитов и убедись, что там не появились изменения в файле .
    А все потому что есть файл , который сейчас заставляет Git игнорировать все файлы с расширением , кроме .

  2. Удали правило из и сохрани изменения

  3. Снова выбери в истории коммитов и убедись, что там теперь есть изменения в файлах и

  4. Открой окно коммита и переведи и в и закрой окно коммита

  5. Выбери в истории коммитов и убедись, что измененные файлы и теперь находится там

  6. Замени содержимое на следующее:

  1. Посмотри историю коммитов. Убедись, что изменен как в в , так и в

  2. Открой окно коммита и убедись, что находится как в верхней части окна, так и в нижней,
    причем содержимое у файлов разное и при выборе в верхней части показывается отличия от ,
    а не предыдущего коммита

  3. Выполни коммит с сообщением

  4. В истории коммитов найди только что созданный коммит и убедись, что в него попали только изменения из

  5. Закоммить оставшиеся в изменения с сообщением .
    Здесь и далее под фразой «закоммить изменения» будет подразумеваться добавление изменений в и само выполнение коммита.

Теперь история коммитов должна выглядеть так:

Метка работы

Удалить ярлык:

 git tag -d v0.5

Если вы хотите перенести метку на пульт, используйте команду:

git push origin v1.0

Взгляните на github, там будет v1.0:

Что если мы хотим удалить этот ярлык?

git push origin :refs/tags/v1.0

Нет тега

Если вы хотите вставить все локальные теги:

Это подтолкнет все теги.

Если вы хотите прокомментировать официальный GitHub, вы можете использовать pull request

При использовании GitHub домашние пользователи часто сталкиваются с проблемой слишком низкой скорости доступа, а иногда не могут подключиться!

Если вы хотите ощутить скорость полета на github, вы можете воспользоваться сервисом облачного кода git-хостинга! Работа облака кода в основном такая же, как и в github.

Во-вторых, пользовательская конфигурация Git

Git имеет много пользовательских элементов конфигурации, таких как

Установите цвет отображения, конечно, мой git bash отображается по умолчанию.

Другие возможности Git

Tags

Tag – это неперемещаемая метка. Она выглядит как обычная метка в дереве коммитов, только Git Extensions отображает её синим цветом. Позволяет именовать и быстро находить конкретные коммиты и не замусоривать список веток.

Stash

Stash (нычка) – место, куда можно временно припрятать текущие изменения. Git не даст вам переключиться на другую ветку, если вы не сохранили текущие изменения. Если же вы не хотите по какой-либо причине делать коммит, то можете отложить их в stash, а потом забрать. Работает как стек. Полезно, если вы ошиблись текущей веткой и начали делать в ней изменения. Эти изменения можно переложить в другую ветку через stash.

Bisect

Последовательное переключение коммитов для выявления ломающего коммита. Если вы обнаружили какую-либо проблему по прошествии нескольких недель, месяцев, лет, то найти ломающее изменение становится нетривиальной задачей. Режим bisect позволяет определить два коммита, один плохой – в котором проблема проявляется, и один хороший, в котором всё в порядке. Далее Git будет загружать коммиты, используя алгоритм двоичного деления, и предлагать вам решить, хороший коммит загрузился или плохой. Вскоре вы выйдете на ломающий коммит. Если вы часто делаете коммиты, то вполне возможно, что только лишь просмотрев изменения, вы сможете найти проблемный код.

Интересно, что эта возможность пригодилась мне буквально на следующий день после того, как я о ней узнал. Баг был внесён в код несколько месяцев назад. Тем не менее, на его поиск понадобилось лишь несколько минут.

Cherry pick

Команда, позволяющая забрать изменения из другого коммита. В рабочий код вносятся только изменения из другого коммита. Полезна при переносе мелких изменений между ветками без их слияния. Например, вы или кто-то другой исправил баг в главной ветке, и вы хотите перенести в свою рабочую ветку только это изменение.

Revert commit

Допустим, вы хотите отменить изменения, внесённые каким-то коммитом. Выполните для него команду “revert commit”. С самим коммитом ничего не произойдёт, но в рабочую копию кода будут внесены изменения, отменяющие изменения этого коммита. Далее по обычной схеме вы можете их сохранить в репозиторий. Если вы хотите отменить только часть изменений, то поместите в staging area только эти изменения, а для остальных файлов выполните “Reset file changes”.

Recover lost objects

Если вы удалите метку с коммита, на который больше нет никаких ссылок, то этот коммит исчезнет, но не бесследно. В меню “Settings” можно найти команду “Recover lost objects”, которая позволяет восстановить потерянные объекты. Восстановить коммит можно будет до тех пор, пока для репозитория не будет собран мусор. После этого коммит окончательно исчезнет.

Прочие команды и необходимые возможности

Хэш — уникальная идентификация объектов

В git для идентификации любых объектов используется уникальный (то есть с
огромной вероятностью уникальный) хэш из 40 символов, который определяется
хэшируюшей функцией на основе содержимого объекта. Объекты — это все: коммиты,
файлы, тэги, деревья. Поскольку хэш уникален для содержимого, например, файла,
то и сравнивать такие файлы очень легко — достаточно просто сравнить две строки
в сорок символов.

Больше всего нас интересует тот факт, что хэши идентифицируют коммиты. В этом
смысле хэш — продвинутый аналог ревизий Subversion. Несколько примеров
использования хэшей в качестве способа адресации.

Ищет разницу текущего состояния проекта и коммита за номером… сами видите,
каким:

То же самое, но оставляем только шесть первых символов. Git поймет, о каком
коммите идет речь, если не существует другого коммита с таким началом хэша:

Иногда хватает и четырех символов:

Читает лог с коммита по коммит:

Разумеется, человеку пользоваться хэшами не так удобно, как машине, именно
поэтому были введены другие объекты — тэги.

git tag — тэги как способ пометить уникальный коммит

Тэг (tag) — это объект, связанный с коммитом; хранящий ссылку на сам коммит,
имя автора, собственное имя и некоторый комментарий. Кроме того, разработчик
может оставлять на таких тегах собственную цифровую подпись.

Кроме этого в git представленные так называемые «легковесные тэги» (lightweight
tags), состоящие только из имени и ссылки на коммит. Такие тэги, как правило,
используются для упрощения навигации по дереву истории; создать их очень легко.

Создаёт «легковесный» тэг, связанный с последним коммитом; если тэг уже есть,
то еще один создан не будет:

Помечает определенный коммит:

Удаляет тег:

Перечисляет тэги:

Создаёт тэг для последнего коммита, заменяет существующий, если таковой уже был:

После создания тэга его имя можно использовать вместо хэша в любых командах
вроде git diff, git log и так далее:

Обычные тэги имеет смысл использовать для приложения к коммиту какой-либо
информации, вроде номера версии и комментария к нему. Иными словами, если в
комментарии к коммиту пишешь «исправил такой-то баг», то в комментарии к тэгу по
имени «v1.0» будет что-то вроде «стабильная версия, готовая к использованию».

Создаёт обычный тэг для последнего коммита; будет вызван текстовый редактор для
составления комментария:

Создаёт обычный тэг, сразу указав в качестве аргумента комментарий:

Команды перечисления, удаления, перезаписи для обычных тэгов не отличаются от
команд для «легковесных» тэгов.

Относительная адресация

Вместо ревизий и тэгов в качестве имени коммита можно опираться на еще один
механизм — относительную адресацию. Например, можно обратиться прямо к предку
последнего коммита ветки master:

Если после «птички» поставить цифру, то можно адресоваться по нескольким предкам
коммитов слияния:

Ищет изменения по сравнению со вторым предком последнего коммита в master; HEAD
здесь — указатель на последний коммит активной ветки.

Аналогично, тильдой можно просто указывать, насколько глубоко в историю ветки
нужно погрузиться.

Что привнес «дедушка» нынешнего коммита:

То же самое:

Обозначения можно объединять, чтобы добраться до нужного коммита:

Файл .gitignore — объясняем git, какие файлы следует игнорировать

Иногда по директориям проекта встречаются файлы, которые не хочется постоянно
видеть в сводке git status. Например, вспомогательные файлы текстовых редакторов,
временные файлы и прочий мусор.

Заставить git status игнорировать определенные файлы можно, создав в корне или
глубже по дереву (если ограничения должны быть только в определенных директория)
файл .gitignore. В этих файлах можно описывать шаблоны игнорируемых файлов
определенного формата.

Пример содержимого такого файла:

Существуют и другие способы указания игнорируемых файлов, о которых можно узнать
из справки git help gitignore.

Серверные команды репозитория

Команда создания вспомогательных файлов для dumb-сервера в $GIT_DIR/info и
$GIT_OBJECT_DIRECTORY/info каталогах, чтобы помочь клиентам узнать, какие ссылки
и пакеты есть на сервере:

Проверяет сколько объектов будет потеряно и объём освобождаемого места при
перепаковке репозитория:

Переупаковывает локальный репозиторий:

Шаги по добавлению подмодулей

Шаг 1. Используйте submodule add …, чтобы добавить подмодули

Щелкните правой кнопкой мыши репозиторий Git, в который нужно добавить подмодули, выберите «TortoiseGit-> Submodule Add …», введите путь к репозиторию подмодуля, который нужно добавить, в «Репозиторий:» и «Путь:»

Введите путь к каталогу, в котором хранится добавленный подмодуль. Как показано ниже:

Теперь проверьте структуру каталогов рабочего пространства Git, куда вам нужно добавить подмодули. В корневом каталоге есть дополнительный файл .gitmodules, а библиотека общедоступного кода клонируется в каталог lib / lib_a.

Шаг 2. Просмотрите содержимое .gitmodules

Содержимое .gitmodules записывает путь к каталогу, содержащему хранилище подмодулей, и путь к репозиторию подмодулей.

Примечание: на данный момент рабочая область еще не отправлена. После завершения отправки субмодуль официально завершен в репозитории Git, который необходимо добавить.

Примечание. Этот основной репозиторий (super.git) становится репозиторием, содержащим подмодули.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: