- использовать ветвление в гите
- совместно работать с использованием git и github
- решать простые конфликты
Pro git: о ветвлении в двух словах
Pro git: основы ветвления и слияния
Pro git: работа с удалёнными репозиториями
Pro git: внесение собственного вклада в проекты
-
зачем нужно ветвление в git?
-
что значит "удалённый" репозиторий? Где он может находиться?
-
как получить изменения из удалённого репозитория?
-
в каком случае может возникнуть конфликт?
-
что такое форк?
-
что такое пулл-реквест, зачем они нужны?
В терминале перейдите в директорию, в которой находится ваш репозиторий (например, cd ~/apps/ruby-newbie
)
Посмотрим информацию об удалённом репозитории с помощью команды git remote
.
# Просмотреть адреса для чтения и записи, привязанные к репозиторию:
git remote -v
# Больше информации об удалённом репозитории
# origin - имя репозитория, мы настраивали его с помощью команды git remote add на прошлом уроке
git remote show origin
Подробнее о выводе git remote show origin
# список веток
git branch
# список всех веток - локальных и удалённых
git branch -a
Например, мы хотим поработать над новой "фичей" - добавим файл с описанием проекта (README.md
)
Создадим новую ветку и переключимся на неё:
git checkout -b readme
# то же самое
git branch readme
git checkout readme
Создайте файл README.md
в редакторе или командой touch
.
Запишите туда текст с описанием вашего репозитория, например:
# Ruby-newbie
Заметки и код для курса по Ruby
Если файл уже существует, внесите в текст какие-нибудь изменения.
# добавим файл в индекс
git add README.md
# закоммитим
git commit -am "Added readme"
# отправим в удалённый репозиторий
# с названием нашей ветки
git push origin readme
Проверим, как выглядят ветки на гитхабе.
- видим, что гитхаб предлагает сделать пулл-реквест (пока не будем его делать)
Проверим список веток в консоли:
# список всех веток, включая remote-ветки
git branch -a
Мы закончили работу над "фичей" и хотим влить свои изменения в основную ветку (main).
Пока не будем делать пулл-реквест, а просто смёржим в main (внесём изменения из ветки фичи (readme) в основную (main)). Для этого перейдём в ветку main:
git checkout main
# мёржим
git merge readme
# пушнем на гитхаб
git push origin main
Теперь мы должны увидеть своё описание на гитхабе на странице проекта.
Попробуем "создать" простой конфликт и решить его:
Внесём изменения в файл README.md, поменяем заголовок и текст, находясь в ветке main:
Пример нового текста README.md:
# Ruby: code and notes
My notes and code for the course.
(при совместной работе над проектом обычно мы не вносим изменения в ветку main напрямую, но сейчас сделаем, для упрощения процесса)
Коммитим:
# можно заменить описание коммита
git commit -am "Changed readme"
Теперь внесём изменения в тот же файл в новой ветке. Создайте ветку, например, update-readme
, переключитесь на неё и внесите изменения в тот же файл.
Чтобы возник конфликт, лучше внести изменения и в заголовок, и в описание. Git будет стараться слить файлы самостоятельно, чтобы избежать конфликтов, но наша цель сейчас - посмотреть на конфликт и разрешить его вручную (такое тоже часто приходится делать в процессе работы).
Пример изменений:
# My attempt to learn ruby: my code
- Code for the course.
- Ideas
- Notes
Коммитим:
# git commit -a заметит изменения и автоматически выполнит git add перед коммитом
# такая команда внесёт в индекс изменения в существующих файлах,
# но не добавит в индекс новые файлы, если они были созданы (их нужно отдельно добавить командой git add перед коммитом)
git commit -am "ваше описание"
Попробуем слить(смёржить) ветки:
git checkout main
git merge название-вашей-ветки
Проверим, возник ли конфликт. Если он возник, в консоли вы увидите подобное сообщение:
anna@composaurus:~/apps/hello$ git merge readme2
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
Посмотрите статус (git status
), о также сообщит вам, что при мёрже произошёл конфликт.
...
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
...
Откройте файл в vscode:
Символы <<<<<<< HEAD
(и подобные) - это просто текст, но, вероятно, редактор вам его подсветит и подпишет дополнительно, для удобства.
Решите конфликт в редакторе (выберите нужную версию и сотрите лишние символы). Не забудьте удалить "разметку" конфликта, символы <<<<<<<
и подобные, в файле должно остаться только то, что вы хотите в нём видеть.
Затем сообщим о решении gitу:
# добавим файл в индекс
git add README.md
git commit -m "Fixed conflict"
# запушим для порядка
git push origin main
- конфликты при совместной работе
- с использованием удалённого репозитория
Получить изменения из remote-репозитория:
git pull
В этом блоке будем работать над заготовкой для лендинга курса. В репозитории находится простая html-страница, стилизованная с помощью фреймворка Milligram.
Клонируем репозиторий ruby-newbie.github.io
git clone [email protected]:ruby-newbie/ruby-newbie.github.io.git
# перейдём в директорию
cd ruby-newbie.github.io/
# проверим, что origin указывает на remote-репозиторий
git remote show origin
Выберите одну из задач:
- напишите краткое описание курса
- добавьте ссылку на репозиторий (тег
<a>
) - добавьте ссылку на организацию на гитхабе (тег
<a>
) - заполните таблицу "расписание"
- другое изменение по вашему желанию (исправить опечатку, исправить/добавить стили, иллюстрацию и т.п.)
Если выбрали задачу из списка, зайдите на гитхаб в список задач, перейдите в задачу и "возьмите" её (assign yourself).
Если хотите внести своё изменение, можете создать задачу и так же "взять" её.
Как выполнить задачу:
- создайте ветку, дайте ей осмысленное название; переключитесь на свою ветку
- внесите изменения в файл
index.html
- перед коммитом проверьте, что вы находитесь в нужной ветке (
git status
) - закоммитьте
- запушьте в свою ветку в remote-репозиторий (
git push origin название_ветки
) - сделайте пулл-реквест на гитхабе
Возможно, понадобится "подтянуть" изменения из репозитория.
[Это будет полезно, если между вашим git clone
или git pull
и выполнением задания были внесены изменения в ветку main]
git fetch # подтянуть изменения
git pull # fetch + merge
Пока подтянем так:
# переключимся в main
git checkout main
# подтянем изменения в main
git pull main
# переключимся на ветку
git checkout веткаname
# мёржим
git merge main
При необходимости решите конфликты и запушьте свою ветку в удалённый репозиторий.
Если у вас нет прав на создание веток в чужом репозитории, вы можете сделать пулл-реквест из форка.
Сделайте форк репозитория, нажав кнопку "Fork". Например, создать форк репозитория с инструкциями: Fork
Вы сможете работать с созданным репозиторием аналогично тому, как работаете, со своим собственным. Для внесения изменений лучше так же создать отдельную ветку (хотя существует и возможность сделать пулл-реквест из ветки main форка).
После внесения изменений и пуша в форк, создайте пулл-реквест:
Вкладка pull-requests проекта => New Pull Request
Здесь base - куда вы хотите залить изменения (base:main) - уже будет выбрано. compare - откуда делаем изменения, выберите ветку в своём форке. Напишите описание ваших изменений и создайте pull request.
Создайте пулл-реквест с изменениями инструкций для курса.
Репозиторий
Например, вы можете исправить опечатку или более удачно сформулировать инструкции / добавить объяснение или решение для потенциальных проблем, добавить дополнительные материалы в соответствующий раздел.