Git курсовая работа

  • Выдержка
  • Другие работы
  • Помощь в написании

Система контроля версий Git (реферат, курсовая, диплом, контрольная)

Достоинства и недостатки

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

Git, на фоне других СКВ, выделяется главным образом из-за того, что он применяется для разработки ядра Linux (http://www.kernel.org). Собственно, именно для этого Git и разрабатывался. Ядро Linux — весьма немаленький проект, как по объему исходного кода, так и по числу участников, поэтому при его разработке большое внимание было уделено производительности и легкости слияния веток.

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

Часто при работе с Git создают центральный репозиторий, с которым остальные разработчики синхронизируются. Пример организации системы с центральным репозиторием — это проект разработки ядра Linux’a (http://www.kernel.org).

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

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

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

Достоинства:

  • 1. Надежная система сравнения ревизий и проверки корректности данных, основанные на алгоритме хеширования SHA1 (Secure Hash Algorithm 1).
  • 2. Гибкая система ветвления проектов и слияния веток между собой.
  • 3. Наличие локального репозитория, содержащего полную информацию обо всех изменениях, позволяет вести полноценный локальный контроль версий и заливать в главный репозиторий только полностью прошедшие проверку изменения.
  • 4. Высокая производительность и скорость работы.
  • 5. Возможность делать контрольные точки. Это позволяет уменьшить скорость восстановления данных, так как за основу берется ближайшая контрольная точка, и восстановление идет от нее. Если бы контрольные точки отсутствовали, то восстановление больших проектов могло бы занимать часы.
  • 6. Широкая распространенность и легкая доступность.
  • 7. Гибкость системы позволяет удобно ее настраивать и даже создавать специализированные контроля системы или пользовательские интерфейсы на базе git.
  • 8. Универсальный сетевой доступ с использованием протоколов http, ftp, rsync, ssh и др.

Недостатки:

  • 1. Unix — ориентированность.
  • 2. Возможные (но чрезвычайно низкие) совпадения хеш — кода отличных по содержанию ревизий.
  • 3. При начальном (первом) создании репозитория и синхронизации его с другими разработчиками, потребуется достаточно длительное время для скачивания данных, особенно, если проект большой, так как требуется скопировать на локальный компьютер весь репозиторий.

Показать весь текст

Заполнить форму текущей работой

Из этой статьи вы узнаете

  • Зачем нужны системы контроля версий

  • Откуда взялся Git

  • Как создать свой репозиторий на GitHub и внести в него изменения

  • Что такое fork, branch и другие интересные слова из мира Git

  • Как создать свой Pull Request

Вступление

Бывает, что начинающие разработчики проблематично осваивают Git и не с первого захода понимают логику работы сервиса. Но стоит создать пару репозиториев или, ещё лучше, погрузиться в реальную историю по установке стартапа на рельсы DevOps, как работа с ветками станет дружелюбной, а PR и MR больше не вызовут путаницы. Ошибки в любом случае появятся, но вы будете к ним готовы!

Начало

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

Первое и самое просто решение — «А давайте перед каждым изменением сохранять копию программы (просто копировать папку с кодом)?»

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

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

Про Git

Существует несколько систем контроля версий: Git, Subversion, Team Foundation Server, Mercurial. Сегодня познакомимся с Git — самой популярной из них, по скромному признанию более 90% разработчиков.

Git появился 7 апреля 2005 года и был создан для управления разработкой ядра Linux. Кстати, создал его тот самый Линус Торвальдс, а сегодня его развитием и поддержкой занимается Дзюн Хамано.

Git — это распределённая система управления версиями: есть один сервер, через который разработчики обмениваются кодом. Разработчик копирует (клонирует) проект к себе на локальную машину, делает изменения и сохраняет их на удалённый сервер. При необходимости другие разработчики могут скопировать эти изменения к себе.

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

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

GitHub — крупнейший веб-сервис, который позволяет заниматься совместной разработкой с использованием Git и сохранять изменения на своих серверах. На самом деле функциональность GitHub намного больше, но сейчас нас интересует только совместная разработка и история изменений. Ещё есть Gitlab, Bitbucket и другие, но мы будем использовать GitHub как самый популярный в настоящее время.

Предварительная настройка

Займёмся предполётной подготовкой.

Для начала зарегистрируйтесь на GitHub: задайте логин, почту и придумайте пароль. После «Создать аккаунт» не забудьте проверить почту и подтвердить её (опрос от Github после подтверждения почты можно пропустить).

Если всё ок, экран GitHub будет выглядеть вот так

Если всё ок, экран GitHub будет выглядеть вот так

В GitHub есть разграничение прав на работу с репозиториями. Можно задавать различные политики: сделать репозиторий публичным и приватным, ограничить права кругу пользователей или кому-то одному, например, разрешить просматривать репозиторий, но не изменять в нём данные.

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

GitHub поддерживает безопасность за счёт двух сетевых протоколов, HTTPS и SSH, и вся работа с сервисом происходит через один из них.

Работать с GitHub будем через терминал по SSH. Для этого один раз сгенерируем специальные ключи и добавим один из них в наш аккаунт на GitHub.

Можно работать и через HTTPS, но нужно будет каждый раз вводить пароль и специальный token.

Пара слов про SSH и как он работает. SSH — это сетевой протокол для зашифрованного соединения между клиентом и сервером, через который можно безопасно передавать данные.

При подключении используется пара ключей — открытый (публичный, public) и закрытый (приватный, private). Пользователь создаёт пару ключей при помощи специальной команды и сохраняет закрытый ключ у себя, а открытый кладёт на сервер (в нашем случае на GitHub). А работает это всё благодаря асимметричному шифрованию.

Алгоритм следующий: отправитель (GitHub) шифрует сообщение публичным ключом и передаёт сообщение клиенту (нам), а мы его расшифровываем при помощи приватного ключа, который предусмотрительно сохранили у себя. То, что зашифровано публичным ключом, расшифровать сможет только приватный ключ.

Давайте создадим пару ключей и добавим открытый ключ на GitHub.

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

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

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

$ ssh-keygen
Generating public/private rsa key pair.
# путь до ключей, в скобках путь по умолчанию
Enter file in which to save the key (/Users/ifireice/.ssh/id_rsa):  
# пароль для ключей, при задании пароля в консоли не отображается ничего, даже звёздочки
# если нажать Enter, ничего не вводя, пароль будет пустым
Enter passphrase (empty for no passphrase):
# повторите пароль
Enter same passphrase again:
# после появится сообщение такого вида
Your identification has been saved in /Users/ifireice/.ssh/id_rsa
Your public key has been saved in /Users/ifireice/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:Zu+HkZPC4ZP0veRmVjuKgylVvljHBNO8mHs+ieFFPvs ifireice@ifireice-osx
The key's randomart image is:
+---[RSA 3072]----+
|           o     |
|          o o    |
|           = .   |
|        o + +    |
|       +S* X     |
|       oB.@ X .  |
|       . O.# * . |
|      . +.*.% o  |
|       .  o*.+E. |
+----[SHA256]-----+

Бинго, ключи сгенерированы: в заданной директории появятся два файла, id_rsa и id_rsa.pub.

Теперь надо добавить публичный ключ в аккаунт на GitHub:

# выведите содержимое публичного ключа в консоль
$ cat ~/.ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDDJfHIi73sKd6cqm3RwKuY1zl46aAaE6X9Gp
/6zJiY3BiJj95oJjPdpfpPhVFWLIbmT8zFAtOLbX9N4C3b0enHUzgMacP/Kl4AbrAkhLqaua9iD
VNxxiTVxADG1M5525oc/eAvx7y0pXIb9ouWdYJSKa8/TUYFhWlCzV2quY9SA0FaMs7eY41+KWYpG.....
tA0oGxv+7WmXQmQzleLIRG13KQ+VAbL2vabdPcRoGuZavh0smOr/GtVSnLdspZ5RgONMSPWlF2I1YHMR
Q7CIKPs= ifireice@ifireice-osx
$

Скопируйте ключ от символов ssh-rsa и до конца файла и вставьте его в ваш аккаунт на GitHub.

Перейдите сюда: иконка пользователя (1) → Settings (2)

Перейдите сюда: иконка пользователя (1) → Settings (2)
→ SSH and GPG keys (3) → New SSH key (4)
→ SSH and GPG keys (3) → New SSH key (4)
→ в Title дайте имя ключу, чтобы понимать, откуда он (может, в будущем у вас появится несколько ключей) (5) → в Key вставляем скопированный из консоли ключ (6) → нажимаем кнопку «Add SSH key» (7)
→ в Title дайте имя ключу, чтобы понимать, откуда он (может, в будущем у вас появится несколько ключей) (5) → в Key вставляем скопированный из консоли ключ (6) → нажимаем кнопку «Add SSH key» (7)
После этого в ваших SSH-ключах появится новый ключ, и вы сможете работать с компьютера, где лежит приватный ключ с GitHub
После этого в ваших SSH-ключах появится новый ключ, и вы сможете работать с компьютера, где лежит приватный ключ с GitHub

Ну что, с настройкой GitHub пока закончили, осталось установить Git на компьютер. Сделать это можно по официальной инструкции (выберите пункт для вашей ОС).

Терминология

Самое время пополнить ваш Git-словарик, прежде чем создадим первый Pull Request.

Репозиторий (repository) — директория проекта, который отслеживается Git. В директории хранится проект, история изменений и мета-информация проекта (в скрытой директории .git).

Индекс — хранилка, где лежат имена файлов и их изменения, которые должны быть в следующем коммите. По факту индекс — просто файл. В индекс файлы сами не попадают, их нужно явно добавлять при помощи git add.

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

Ветка (branch) — последовательность коммитов. По сути — ссылка на последний коммит в этой ветке. Ветки не зависят друг от друга — можно вносить изменения в одну, и они не повлияют на другую (если вы явно этого не попросите). Работать вы начинаете в одной ветке — main, увидите чуть позже.

Форк (Fork) — собственное ответвление (fork) какого-то проекта. Это означает, что GitHub создаст вашу собственную копию проекта, данная копия будет находиться в вашем пространстве имён, и вы сможете легко делать изменения путём отправки (push) изменений.

Пул-реквест — pull request PR (пиар, он же merge request MR(мр)) — предложение изменения кода в чужом репозитории. Допустим, вы забрали к себе чужой репозиторий, поработали с ним и теперь хотите, чтобы ваши изменения попали в оригинальный репозиторий — тогда вы создаёте создаёте PR с просьбой добавить ваши изменения в репозиторий.

Начало работы

Начнём с простого — создадим свой репозиторий и сделаем наш первый коммит.

Открываем repositories (1) и создаём новый (2)

Открываем repositories (1) и создаём новый (2)
Задаём параметры репозитория
Задаём параметры репозитория

Зададим параметры:

  • (1) Repository name: имя репозитория.

  • (2) Description: описание репозитория.

  • (3) Тип репозитория: Public (публичный) или Private (приватный). Сейчас выберем публичный — кто угодно может видеть содержимое репозитория.

  • (4) Ставим галку на «Создать README файл». В этом файле в формате MarkDown описывают проект или прочую документацию. Именно содержимое этого файла можно увидеть, когда заходим на главную страницу репозитория. Примеры 1, 2, 3.

  • (5) Если известно, на каком языке будет проект, можем добавить шаблон .gitignore для этого языка. Сейчас у нас нет какого-то языка, поэтому не будем создавать .gitignore.

  • (6) Выбираем тип лицензии для нашего кода. В лицензии оговариваются права на проект. Стоит обратить внимание на BSD 3 или MIT, так как они предоставляют хороший баланс прав и ответственности.

(7) По умолчанию имя основной ветки в GitHub носит имя main, но до недавнего времени было master.

Получаем наш первый репозиторий

Получаем наш первый репозиторий

И нажимаем кнопку «Create repository». Успех, у нас есть первый репозиторий!

А что будет, если не добавим README и .gitignore?

На самом деле ничего страшного не произойдёт, но придётся выполнить ещё ряд шагов, чтобы проинициализировать git-репозиторий, прежде чем начать с ним работать.

Не переживайте, Git очень дружелюбный и сам расскажет, как это сделать.

Не переживайте, Git очень дружелюбный и сам расскажет, как это сделать.

Итак, мы создали репозиторий на удалённом сервере, теперь пора «забрать» его к себе на локальную машину и внести какие-то изменения.

Чтобы забрать репозиторий, его надо склонировать к себе при помощи команды git clone и пути до репозитория.

Для начала получим путь до репозитория.

Заходим в созданный репозиторий и находим кнопку «Code» (1) → нажимаем её → выбираем SSH (2) → и копируем строку (3)

Заходим в созданный репозиторий и находим кнопку «Code» (1) → нажимаем её → выбираем SSH (2) → и копируем строку (3)

Теперь идём в консоль, переходим в директорию, где хотим хранить проекты, и выполним (git@github.com:ifireiceya/MyFirstRepo.git — путь, который мы скопировали ранее):

$ git clone git@github.com:ifireiceya/MyFirstRepo.git
Cloning into 'MyFirstRepo'...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (4/4), done.

Переходим в новый каталог, где теперь лежит копия нашего проекта с GitHub:

$ cd MyFirstRepo

Можем посмотреть, что уже есть в этой директории:

$ ls -a
.git      LICENSE   README.md

Видим два знакомых файла,LICENSE и README.md, а также одну скрытую директорию .git.

В .git хранится метаинформация и вся история для проекта. На каждый проект есть только одна директория .git, и лежит она в корне проекта.

$ ls .git
HEAD                 # указатель на вашу активную ветку
config               # персональные настройки для проекта
description          # описание проекта
hooks                # pre/post action hooks
index                # индексный файл
logs                 # история веток проекта (где они располагались)        
objects              # ваши объекты (коммиты, теги и тд)
packed-refs refs     # указатели на ваши ветки разработки

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

При установке Git была добавлена утилита git config, которая позволяет просматривать и изменять большинство параметров работы Git’а. Если речь о данных пользователя или способе работы репозитория — git config будет самым удобным способом настройки.

Настроим имя пользователя и адрес электронной почты. Эта информация важна, потому что включается в каждый коммит.

Поэтому в терминале переходим в Git-репозиторий, для которого задаём настройки, и выполняем:

$ git config user.name "Дарья Меленцова"
$ git config user.email ifireice@example.com


# Если добавить опцию --global, то эти настройки запишутся в настройки пользователя и будут действовать для всех проектов. 
# Мы выполняем эту команду без параметра --global, чтобы настройки касались только вашего проекта.

Чтобы настраивать ещё больше параметров с помощью git config, прочитайте эту документацию.

Вносим изменения

Теперь нужно внести изменения в проект. Но перед этим посмотрим две полезных команды:

  • git status — показывает текущее состояние файлов в репозитории (какие файлы изменились, удалились, добавились);

  • git log — показывает историю изменений (это про зафиксированные изменения, то есть коммиты).

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

Вбиваем git status:

$ git status                                  
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean

И видим, что у нас нет изменений. Говорят, «нет коммитов в репозитории». Конечно, мы успели только клонировать репозиторий и ещё ничего не делали.

Идём дальше и пробуем git log, который покажет, что в проекте был только один Initial commit — когда мы создавали репозиторий с README.md:

$ git log
commit 9ae1cbcc77f3b64d604612d4a599bdbb8b1cf204 (HEAD -> main, origin/main, origin/HEAD)
Author: ifireiceya <117034707+ifireiceya@users.noreply.github.com>
Date:   Mon Oct 31 00:01:05 2022 +0300

    Initial commit
(END)

Убедились, что у нас нет неучтённых изменений. Пора бы уже что-то сделать!

Открываем любимый текстовый редактор и создаём новый файл с именем hw.py.

Это будет небольшая программа на Python, которая при запуске печатает «Hello World!» (внезапно):

$ vi hw.py
print("Hello World!")

Отлично, код написан и даже хранится локально в нашем репозитории (мы же в директории проекта всё делали).

Теперь наша задача — сохранить изменения в «оригинальный» (удалённый) репозиторий. Для этого нужно:

  1. Познакомить Git с новым файлом, то есть добавить файл в индекс — git add.

  2. Зафиксировать (закоммитить) изменения — git commit.

  3. Синхронизировать изменения с сервером — git push.

  4. Посмотреть в репозиторий и убедиться, что всё сработало.

Делаем!

Мы уже создали файл и теперь можем посмотреть, в каком статусе Git

Мы уже создали файл и теперь можем посмотреть, в каком статусе Git

Появился файл hw.py, но он красный. Паника! Всё сломалось?!

Нет, всё идёт по плану, но прежде чем продолжить, стоит обсудить состояние файлов с точки зрения Git’а.

По мнению Git’а, файл может пребывать в одном из четырёх состояний:

  1. Неотслеживаемый (untracked).

  2. Изменённый (modified) — файл, в котором есть изменения, но он ещё не добавлен в коммит (не зафиксирован).

  3. Отслеживаемый (staged) — файл, который добавили в индекс.

  4. Зафиксированный (committed) — файл уже сохранён в локальной базе, и в нём не было изменений с последнего коммита.

Три секции проекта, с которыми работают в Git

Три секции проекта, с которыми работают в Git

В связке с состоянием файлов используют три основных секции проекта:

  • Рабочая директория (working directory) — это директория, которая содержит в себе то, с чем вы работаете, или то, что вы извлекли из истории проекта в данный момент. Рабочая директория — это временное место, где вы можете модифицировать файлы, а затем выполнить коммит.

  • Область индексирования (staging area) — индекс-файл в каталоге Git, который содержит информацию о том, что попадёт в следующий коммит.

  • Каталог Git — место, где Git хранит метаданные и базу объектов вашего проекта. Помните ещё про .git?

Что происходит на практике

Мы добавили новый файл hw.py и видим, что у него состояние untracked, то есть неважно, что мы делаем с файлом, Git проигнорирует любые изменения в нём.

Чтобы Git начал следить за изменениями в файле, его нужно добавить в индекс.

Для этого используем команду git add <имя файла>.

Кстати, вы заметили, что Git довольно дружелюбный и часто подсказывает команды, которые нужно выполнить?

$ git add hw.py
# если нужно добавить много файлов и не хочется описывать, можно использовать команду
# git add .
# но стоит точно понимать, что добавляем, иначе придётся потом удалять файлы из индекса
# кстати, для удаления используется команда git rm, но стоит почитать доку перед использованием

И ещё не забывайте о файле .gitignore, где перечислены папки и файлы репозитория, которые Git не должен отслеживать и синхронизировать их состояние (не добавлять их в индекс). Обычно в него добавляют файлы логов, результаты сборки и другое. Поддерживает шаблоны. Кстати, .gitignore — тоже файл, который надо добавить в индекс.

  • Если файл попадает в правила.gitignore, то он не появится в git status.

  • Если файл был добавлен в индекс, а потом добавлено правило для файла в .gitignore — файл всё равно будет отслеживаться и его надо явно удалить из индекса.

Посмотрим, как изменилось состояние нашего файла:

Смотрите, наш файл стал зелёным, и сообщение от Git изменилось. Сам файл теперь имеет состояние staged

Смотрите, наш файл стал зелёным, и сообщение от Git изменилось. Сам файл теперь имеет состояние staged

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

Для этого нужно закоммитить файл с помощью команды git commit.

При создании обычно лаконично описывают коммит, используя ключ -m:

$ git commit -m "add python hello world"     
[main 6d8a5c3] add python hello world
 1 file changed, 1 insertion(+)
 create mode 100644 hw.py

Пара слов о том, как писать сообщения для коммитов:

  • максимум 50 символов;

  • осознанно и понятно, как будто пишете для человека, который должен понять, что происходит внутри коммита;

  • сообщение стоит начинать с заглавной буквы;

  • если меняли код, пишите исходный код в сообщении.

$ git log

Осталось отправить наши изменения на удалённый сервер. Используем git push:

Осталось отправить наши изменения на удалённый сервер. Используем git push:
$ git push
Counting objects: 100% (4/4), done.
Delta compression using up to 12 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 341 bytes | 341.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:ifireiceya/MyFirstRepo.git
   9ae1cbc..6d8a5c3  main -> main

Предлагаем проверить, что наши изменения есть на GitHub. Идём в репозиторий и смотрим на него.

Появился наш файл и commit message, который задали

Появился наш файл и commit message, который задали

Задача немного посложнее

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

Например, есть у нас любимый опенсорсный проект, в который мы хотим принести добро и закрыть им какой-нибудь Issue.

В учебных целях используем репозиторий из этой статьи на GitHub. Там нужно исправить опечатку, которую нашли в статье. Например, вот эту очепятку.

Но будем делать это с позиции внешних пользователей в чужом репозитории.

Репозиторий хранится в ifireice/git, а изменения делает пользователь ifireiceya.

Пользователь ifireiceya не имеет доступа в ifireice/git, и ему придётся работать через Fork, то есть нужно сперва сделать копию этого репозитория к себе и вести разработку у себя, а потом отправить в основной репозиторий запрос на изменения — Pull Request.

Но обо всём по порядку. Сначала делаем Fork.

Заходим под пользователем ifireiceya в репозиторий ifireice/git и нажимаем на Fork(1)

Заходим под пользователем ifireiceya в репозиторий ifireice/git и нажимаем на Fork(1)

Откроется окно для создания нового форка (fork).

Изменится владелец репозитория (1), и опционально можно изменить описание проекта.

Нажимаем «Create fork» и получаем новенький форк

Нажимаем «Create fork» и получаем новенький форк
Можно увидеть новый репозиторий в списке наших репозиториев
Можно увидеть новый репозиторий в списке наших репозиториев

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

Теперь клонируем форк-репозиторий к себе на машинку и ведём разработку.

Только мы будем работать чуть-чуть по-другому, не как с нашим репозиторием.

В нашем репозитории мы работали в ветке main и все изменения сохраняли в ней.

А теперь у нас большой проект, и над ним одновременно могут трудиться несколько разработчиков. Чтобы разные изменения не смешивались в кучу и чтобы один разработчик не мешал другому, разработка ведётся в разных независимых версиях продукта — ветках (branch). Когда работа закончена, все изменения сливаются в одну главную ветку.

Клонируем репозиторий и создаём отдельную ветку, в которой будем устранять опечатку:

$ git clone git@github.com:ifireiceya/git.git
$ cd git
# создадим новую ветку и сразу же переключимся на неё, чтобы работать там
$ git checkout -b fix-misprint
Switched to a new branch 'fix-misprint'

Чтобы посмотреть, какие ветки есть в проекте и какая сейчас активна, используется команда git branch:

$ git branch
* fix-misprint
  main
# * помечена текущая активная ветка

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

Можем посмотреть, что изменилось с последнего коммита, при помощи команды git diff (красным с “-” то, что было, зелёным с “+” — то, что стало):

$ git diff

Правим опечатку и всё по накатанной: смотрим status, делаем коммит и пушим изменения

Правим опечатку и всё по накатанной: смотрим status, делаем коммит и пушим изменения
$ git status
On branch fix-misprint
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")

$ git commit -am "Поправили опечатку"
[fix-misprint 188caa7] Поправили опечатку
 1 file changed, 1 insertion(+), 1 deletion(-)

$ git push
fatal: The current branch fix-misprint has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin fix-misprint

Упс, fatal. Читаем подсказку от Git и выполняем:

$ git push --set-upstream origin fix-misprint
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 12 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 402 bytes | 402.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
remote:
remote: Create a pull request for 'fix-misprint' on GitHub by visiting:
remote:      https://github.com/ifireiceya/git/pull/new/fix-misprint
remote:
To github.com:ifireiceya/git.git
 * [new branch]      fix-misprint -> fix-misprint
Branch 'fix-misprint' set up to track remote branch 'fix-misprint' from 'origin'.

Успех!

Почему произошёл fatal: простой git push предполагает, что ветка, которую отслеживает текущая локальная ветвь, уже существует на удалённом сервере. У нас ветка новая и была создана только локально, поэтому нам нужно её создать, указав --set-upstream.

Проверим, что ветка появилась на GitHub.

Заходим в репозиторий и нажимаем на кнопку «ветки» (1) → видим в списке нашу ветку (2)

Заходим в репозиторий и нажимаем на кнопку «ветки» (1) → видим в списке нашу ветку (2)

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

Для этого создаём Pull request.

Здесь живут пулл реквесты... когда они, конечно, есть

Здесь живут пулл реквесты… когда они, конечно, есть

И увидим такую картину.

(1) репозиторий, в который хотим добавить изменения. — ifireice/git

(2) ветка, в которую хотим добавить изменения — main

(3) репозиторий, из которого хотим добавить изменения — ifireiceya/git

(4) ветка, из которой хотим добавить изменения — main

Не пугайтесь, что GitHub считает, будто нет изменений: их нет, потому что мы работали в ветке fix-misprint. Меняем ветку, из которой вносим изменения (4), на нужную — и видим изменения

Не пугайтесь, что GitHub считает, будто нет изменений: их нет, потому что мы работали в ветке fix-misprint. Меняем ветку, из которой вносим изменения (4), на нужную — и видим изменения
Нажимаем кнопку «Create pull request» и пишем описание. Просматриваем ещё раз изменения. Если всё так, как нужно, ещё раз нажимаем «Create pull request»
Нажимаем кнопку «Create pull request» и пишем описание. Просматриваем ещё раз изменения. Если всё так, как нужно, ещё раз нажимаем «Create pull request»
Готово! У нас появился первый PR (ищите его в оригинальном репозитории в разделе Pull Requests)
Готово! У нас появился первый PR (ищите его в оригинальном репозитории в разделе Pull Requests)

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

Будем считать, что у нас всё хорошо и наши изменения приняли без вопросов.

Как это выглядит на стороне ревьюверов:

Перешли в Pull Requests

Перешли в Pull Requests
Зашли в PR. Посмотрели описание, коммиты, какие изменения будут, и нажали кнопочку «Merge pulll request», если всё устраивает — нас всё устраивает
Зашли в PR. Посмотрели описание, коммиты, какие изменения будут, и нажали кнопочку «Merge pulll request», если всё устраивает — нас всё устраивает
Изменения помёржились
Изменения помёржились
В main ветке тоже можно увидеть и изменения из нашего ПР, и автора этих изменений. Надо лишь зайти в коммит
В main ветке тоже можно увидеть и изменения из нашего ПР, и автора этих изменений. Надо лишь зайти в коммит
Конец
Конец

На этом пока всё. Увидимся в следующих выпусках про Git и не только.

Что изучили

  • Поговорили про системы контроля версий

  • Настроили себе GitHub

  • Создали первый репозиторий и внесли в него изменения

  • Узнали про ветки, форки и остальное

  • Сделали первый ПР

Что НЕ изучили

  • Конфликты

  • Откат изменений (reset, revert)

  • Как забрать файл из другой ветки (Cherry-pick)

  • rebase

Что ещё почитать

  • Отличная книга Pro Git (есть на русском и английском)

  • Курс «DevOps для эксплуатации и разработки»

  • Trunk-Based Development — стратегия отведения веток

  • GitFlow — другая стратегия отведения веток

Цель работы¶

Создать репозиторий для проекта на лабораторные работы. Репозиторий должен
содержать исходный код, конфигурационный файл .clang-format, файл
.gitignore и простейший Makefile. Отработать этапы создания коммита и
просмотр истории репозитория.

Инструкции по выполнению лабораторной работ смотрите раздел Руководство

Подготовка к работе¶

Формат вывода команды git log по умолчанию не очень удобен для анализа.

Пример:

$ git log

commit 7198ea228bf5d2f4aea7824f0f0688ddab6a8e25
Merge: 6e71962 4877c36
Author: Evgeny Pimenov <evgeny-p@users.noreply.github.com>
Date:   Tue Feb 16 14:44:21 2016 +0600

Merge branch 'solver'

commit 4877c368dc49037df8decad065d374d567e7e1d9
Author: Evgeny Pimenov <evgeny-p@users.noreply.github.com>
Date:   Tue Feb 16 14:44:06 2016 +0600

Add unit tests

commit 398bdc86f674e3f0410d6a6bdc74b3953625c4df
Author: Evgeny Pimenov <evgeny-p@users.noreply.github.com>
Date:   Tue Feb 16 14:43:40 2016 +0600

Implement quadratic equation solver

commit b5ef5db8508e310f3a41adaea06459edda114568
Author: Evgeny Pimenov <evgeny-p@users.noreply.github.com>
Date:   Tue Feb 16 14:41:51 2016 +0600

Validate user input

commit d4bbead33b6d1f66169c46c189196f6c83b75e0a
Author: Evgeny Pimenov <evgeny-p@users.noreply.github.com>
Date:   Tue Feb 16 14:41:18 2016 +0600

Implement input-output functions

commit 6e71962d03e17154d72b7f3cb95ea4ba2a3d2d1c
Author: Evgeny Pimenov <evgeny-p@users.noreply.github.com>
Date:   Tue Feb 16 14:40:52 2016 +0600

Implement helloworld program

commit de2f75641cfb773f35cd434e5f7861e7195445b3
Author: Evgeny Pimenov <evgeny-p@users.noreply.github.com>
Date:   Tue Feb 16 14:39:51 2016 +0600

Initial commit

В качестве альтернативы можно запускать git log с несколькими
параметрами:

$ git log --oneline --decorate --graph --all

*   7198ea2 (HEAD, main) Merge branch 'solver'
|
| * 4877c36 (solver) Add unit tests
| * 398bdc8 Implement quadratic equation solver
| * b5ef5db Validate user input
| * d4bbead Implement input-output functions
|/
* 6e71962 Implement helloworld program
* de2f756 Initial commit

Описание используемых параметров доступно в мануале команды git log.

Для упрощения ввода команды, можно создать алиас (синоним). Для этого нужно
выполнить в терминале:

git config --global alias.hist "log --oneline --decorate --graph --all"

После чего станет доступна команда git hist:

$ git hist

*   7198ea2 (HEAD, main) Merge branch 'solver'
|
| * 4877c36 (solver) Add unit tests
| * 398bdc8 Implement quadratic equation solver
| * b5ef5db Validate user input
| * d4bbead Implement input-output functions
|/
* 6e71962 Implement helloworld program
* de2f756 Initial commit

Подробнее об алиасах:
Git Aliases.

Make¶

Make — утилита для преобразования файлов из одной формы в другую. Чаще всего
применяется для сборки приложений.

Мейкфайл состоит из правил вида:

<цель> : <зависимость> ...
        <команда>
        ...

Здесь:

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

  • <зависимость> — имя входного файла, необходимого для получения целевого
    файла. В простейшем случае — имя файла с исходным кодом.

  • <команды> — инструкции командной оболочки. В простейшем случае — запуск
    компилятора.

В качестве отступа перед командами используется один символ табуляции.

Официальная документация:
GNU Make.

.gitignore¶

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

  • Артефакты сборки: исполняемые файлы, объектные файлы *.o.

  • Бекап-файлы используемого текстового редактора (.main.c.swp, main.c~,
    #main.c# и т. д.).

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

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

Официальная документация: gitignore.

Содержание коммитов¶

Основной принцип: один коммит включает в себя только одно изменение. Изменения
в каждом коммите самодостаточны и независимы.

Нарушение этого принципа легко заметить при написании заголовка коммита. Если
заголовок выглядит как «Format source code AND implement user input
validation AND fix crash», значит один коммит включает в себя слишком много
изменений. В данном примере изменения следует разделить на три коммита.

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

Оформление коммитов¶

Заголовок коммита пишется на английском языке, в императиве. Начинается с
заглавной буквы, точка в конце не ставится.

Неправильно: implemented request handling.

Правильно: Implement request handling

Подробнее:
How to Write a Git Commit Message

Перемещение по истории коммитов¶

Для перемещения по истории коммитов необходимо, чтобы все изменения были
закоммичены. Т.е. не должно быть файлов в состоянии modified или
staged.

Один из способов перемещения по истории — использование команды git checkout.

Руководство¶

Предупреждение

Не следует коммитить артефакты сборки (исполняемые и объектные файлы).

Во время выполнения работы до и после команд git add, git commit
следует выполнять git status и git hist и анализировать их вывод.

  1. Создайте репозиторий для ЛР, склонировав по ssh-ссылке:

    • geometry

  2. Добавьте в репозиторий файл .clang-format из предыдущей работы:

    wget https://csc-software-development.readthedocs.io/ru/2023/_static/.clang-format
    
  3. Реализуйте приложение «Hello, World».

  4. Напишите простейший Makefile для сборки приложения. Приложение следует
    компилировать с опциями -Wall -Werror. Компиляция должна проходить без
    ошибок.

  5. Добавьте в репозиторий файл .gitignore, настройте игнорирование файлов.

  6. Реализуйте часть функциональности приложения geometry:

    Ввод и вывод окружностей в формате WKT, проверка корректности входных
    данных.

  1. При необходимости отредактируйте Makefile и .gitignore под новое приложение.

  2. Загрузите изменения на GitHub. После завершения работы назначте её на ревью
    своему преподавателю практики.

10. Локально отработайте перемещение по истории репозитория. Переместитесь по
истории к первому коммиту. Посмотрите содержимое файлов. Вернитесь к последнему
коммиту.

Пример содержания коммитов:

  • Add .clang-format

  • Implement «Hello, World» application

  • Add Makefile

  • Add .gitignore

  • Implement input and ouput of circle from stdin

Контрольные вопросы¶

  1. Что такое коммит?

  2. Этапы создания коммита.

  3. В каких состояниях может находиться файл в репозитории?
    Как происходит изменение состояния файла?

  4. Зачем нужен файл .gitignore?

Цель лабораторной:
получить понимание необходимости
инструментов контроля версий (VCS —
version control system), изучить основы локальной
работы с VCS Git.

Теоретический материал Постановка задачи контроля версий (vcs)

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

Начнём с самого простого
и очевидного — хранение истории
изменений. Это нужно затем, чтобы знать
автора изменений (user)проекта,
получитьстарую версию (tag, branch)продукта, которая, кстати, может быть
стабильней текущей, отслеживать
активность участников проекта, их
продуктивность и качество работы. Обычно
это решается просто с помощью создания
резервных копий. Однако они несут мало
информации о процессе разработки, об
авторах изменений и, как правило, делаются
в определённый момент времени, который
может не совпадать смоментом изменения
(commit)
в проекте. К тому же сложноотслеживать изменения (log), ведь
нужно вручную сравнивать папки
каким-нибудь инстументом сравнения
(например, Meld).

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

Инструменты контроля
версий призваны решать задачу объединения
работы (merge)
авторов, которые выполняют
её на физически разных машинах, что
крайне затруднительно (скорее даже
невозможно) в случае использования
резервных копий. Также системы контроля
версий позволяютлегко создавать
новые экспериментальные версии (branch,
stash)
, сохраняя при этом стабильные
старые. Это позволяет легко экспериментировать
с изменениями, вливая в стабильную
версию часть экспериментальных, отменяя
все нестабильные изменения и многое
другое.

Когда вы ознакомились
с базовыми возможностями, которые должна
предоставлять любая система контроля
версий, а также с проблемами резервного
копирования, можно приступить к
ознакомлению с уже существующими
продуктами в данной области. Здесь также
нет единого подхода: инструменты
разделяются на централизованные и
распределённые системы контроля. К
первым относится популярный продукт
SVN (Subversion). Централизованные системы
имеют сравнительно низкую отказоустойчивость,
т.к. всё хранится сосредоточенно в одном
месте и аппаратный сбой системы приведёт
к потере всей истории изменений.
Принципиально другой подход реализуется
в распределённых системах контроля,
таких как Git. Они предполагают хранение
всей истории изменений на компьютере
каждого автора. Это делает систему
максимально устойчивой к сбоям, однако,
затрудняет распространение изменений
в истории. В данной лабораторной работе
будет рассмотрена именно VCS Git, т.к. она
сейчас набирает популярность, а также
предлагает широкий набор возможностей
для работы с историей версий.

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

Для того, чтобы начать
работу с Git необходимо установить его
пакет к себе на компьютер. В случае с
Linux это делается просто путём установки
пакета git, который доступен в репозиториях
(аналогичное приведённому ранее понитие)
пакетов. Для Windows нужно установить
специальную сборку msysgit
(http://code.google.com/p/msysgit/).
Помимо Git она установит Cygwin, который
необходим для работы в Git из-под Windows.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #

    23.03.201692.67 Кб401.doc

  • #

    20.04.2015191.49 Кб1131.doc

  • #
  • #
  • #
  • #
  • #

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *