Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions list1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
# Инструкция для работы с Git и удалёнными репозиториями

## Начало
1. **Регистрация на GitHub**. *GitHub* -­ это сервис для хранения репозиториев. Репозиторий научного проекта будет находиться именно там,поэтому если у вас еще нет аккаунта на GitHub, вам необходимо пройти стандартную процедуру регистрации.
2. **Установить git** с официального сайта по инструкции: https://git-scm.com. Возможно, он уже есть у вас в системе — проверьте это, зайдя в командную строку и введя команду __*git*__.
3. Все команды git выполняются в терминале(командной строке). Пользователям Windows следует использовать утилиту __*Git Bash*__ либо скачать и распаковать дистрибутив *Babun* https://babun.github.io _**(осторожно, она весит 2Гб, зато полностью эмулирует работу в командной строке Linux)**_.
4. Настройка git. Достаточно задать имя и email командами:
git config ­­global user.name "Oleg Yasnev"
git config ­­global user.email oyasnev@gmail.com
(вы, естественно, подставляете свои имя и email)

Далее мы изучим основные операции на тестовом репозитории. Для начала нам понадобится завести репозиторий на GitHub. Я буду использовать свой аккаунт (oyasnev),соответственно, вам нужно будет подставлять свой.

## Создание репозитория на GitHub
Для создания репозитория на GitHub нужно войти в систему, затем в навигационной панели сверху рядом с вашим именем выбрать "+" и "New repository" (или на главной странице зеленая кнопка "+ New repository"). Далее заполняем поля:
● Repository name: test
● Description: Test repository
● оставляем выбранным пункт "Public" и проставляем флажок "Initialize this repository with a README"
Нажимаем кнопку "Create repository". Репозиторий создан! Теперь он доступен по адресу: https://github.com/oyasnev/test

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

## Базовые операции
1. Создание локальной копии главного репозитория. Для начала нужно перейти в каталог, в котором вы хотите, чтобы появился каталог репозитория, и запустить в нем терминал. Для пользователей Windows: перейти в ___Проводнике__ в нужный каталог, щелкнуть правой кнопкой мыши в окне каталога и в контекстном меню выбрать пункт "Git Bash".
После запуска в терминале набрать команду: git clone https://github.com/oyasnev/test. В результате в текущем каталоге будет создан подкаталог test, содержащий копию главного репозитория. Для работы с репозиторием необходимо перейти в его каталог командой cd test.
2. Добавление новых файлов в репозиторий. Давайте создадим в каталоге репозитория test текстовый файлfirst.txt, содержащий строку текста "Sometext". Однако то, что файл появился в каталоге репозитория не означает, что git его уже отслеживает ­ нужно указать это явно командой git add first.txt. Теперь наш файл находится под наблюдением git.
*Давайте сохраним изменения в репозитории* и сделаем первый коммит: git commit -­m "My first commit". Ключ -­m позволяет задать описание коммита. Описание обязательно, иначе коммит не будет выполнен.
Теперь давайте создадим каталог dir, а в нем два текстовых файлаa.txt и b.txt. Чтобы при добавлении в git не перечислять их по отдельности, воспользуемся командой __git add .__ которая добавляет в git все новые файлы. И снова сохраним: git commit -­m "dir added"
3. Сохранение изменений файлов. Добавим в файл first.txt еще одну строчку "Some more text" (не забудьте сохранить файл!). И снова закоммитим изменения. Однако если мы воспользуемся известной нам командой **git commit -­m "more text added to first.txt"** то мы получим сообщение, что коммитить в общем­то нечего. По чему? Дело в том, что git опять же не знает, какие именно из измененных файлов мы хотим сохранить. Чтобы указать это явно, необходимо воспользоваться описанной выше командой git add. В то же время самый частый сценарий ­ сохранить изменения во всех файлах. Для этих целей в команде git commit есть ключик **-­a**.
Итого наша команда будет такой: **git commit ­-a­m "more text added to first.txt"**
Чтобы меньше запоминать, вам будет достаточно для всех коммитов пользоваться командой именно такого вида.
Однако помните, что ключ **-­a** позволяет учесть изменения только в файлах, уже находящихся под наблюдением git. А новые файлы перед коммитом необходимо предварительно явно добавить командой **git add** (про нее вам рассказали непросто так).
4. Отправка изменений в главный репозиторий. К этому моменту мы уже немало сделали в нашей локальной копии репозитория, однако если вы обновите веб­страничку с главным репозиторием, вы увидите, что в нем никаких изменений нет. Как их туда внести? Для этого используется команда **git push**
В процессе выполнения команды от вас потребуется ввести ваш и логин и пароль от аккаунта на GitHub. Когда после успешного завершения команды мы обновим страничку с главным репозиторием, мы увидим, что теперь его содержимое совпадает с нашим локальным репозиторием.
5. Получение изменений из главного репозитория. Смоделируем ситуацию, в которой нам это пригодится. Для этого откроем еще один терминал в каталоге, отличном от того, в котором лежит наш локальный репозиторий. И создадим еще одну локальную копию главного репозитория (как ­ описано выше).
Итого у настеперь есть два локальных репозитория: первый (старый) и второй (только что созданный). Представим, что второй репозиторий на самом деле находится на другом компьютере и с ним работает второй участник. И он решает внести какие-­то изменения в файл first.txt (например, добавим туда еще одну строчку текста), находящийся в его локальной копии, т.е. во втором репозитории.
Сохраняем файли коммитим: **git commit ­a ­m "more changes in first.txt"**
и отправляем изменения на сервер: **git push**
Сейчас у нас синхронизированы главный и второй локальный репозитории, но первый локальный отстает. Ему нужно получить изменения из главного репозитория командой **git pull**
Ура, теперь у нас везде одинаковые версии.
6. Разрешение конфликтов. В заключение рассмотрим еще один частый сценарий, распространенный при одновременной работе нескольких человек. Давайте внашем первом локальном репозитории внесем еще какие-­нибудь изменения в файл first.txt, закоммитим и отправим их в главный репозиторий. А затем во втором локальном репозитории создадим файл second.txt и тоже закоммитим. Однако если теперь из второго репозитория мы попробуем сделать **git push**, то получим ошибку из­за конфликта изменений. Почему? Для простоты можно считать, что при
отправке изменений в локальном репозитории должна быть версия, основанная на версии главного репозитория. Тогда как мы во втором репозитории пока ничего не знаем про последний коммит first.txt.

Что делать? Сначала нам нужнополучить изменения из главного репозитория, затем объединить их с нашими изменениями, и то, что получилось, отправить на главный репозиторий. Звучит непросто, но на самом деле первые два шага сама умеет делать команда **_git pull_**. Она достаточно умна, чтобы понять, что в нашем случае надо обновить файл first.txt и добавить second.txt. После чего нам остается просто отправить изменения командой **git push**.

Итого получаем, что при отправке изменений безопасно пользоваться двумя последовательными командами: **git pull** (проверить на наличие новых изменений в репозитории и, если они есть, выкачать их и объединить с локальными изменениями) **git push** (отправить изменения в репозиторий).

Таким образом, git умеет разрешать конфликты самостоятельно. Но к сожалению не все. Если бы мы вместо создания second.txt во втором репозитории тоже изменили first.txt, то мы бы имели две измененные версии одного файла и здесь уже git самостоятельно разрешить конфликт не может: нужно вмешательство человека. При грамотно спланированной работе команды, такие ситуации встречаются редко, и мы их рассматривать не будем. Интересующиеся могут посмотреть в интернете или в справке git по команде merge в разделе "How to resolve conflicts".