Skip to content

Latest commit

 

History

History
295 lines (209 loc) · 15.2 KB

3.git_branches.md

File metadata and controls

295 lines (209 loc) · 15.2 KB

3. git branches

Чему научитесь:

  • использовать ветвление в гите
  • совместно работать с использованием 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

о форматировании md(markdown)

Если файл уже существует, внесите в текст какие-нибудь изменения.

# добавим файл в индекс
git add README.md
# закоммитим
git commit -am "Added readme"
# отправим в удалённый репозиторий
# с названием нашей ветки
git push origin readme

Проверим, как выглядят ветки на гитхабе.

branches

  • видим, что гитхаб предлагает сделать пулл-реквест (пока не будем его делать)

new pr

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

# список всех веток, включая 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:

conflict in 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.

Доп. задание

Создайте пулл-реквест с изменениями инструкций для курса.
Репозиторий
Например, вы можете исправить опечатку или более удачно сформулировать инструкции / добавить объяснение или решение для потенциальных проблем, добавить дополнительные материалы в соответствующий раздел.

Доп. материалы

Git branching: rebasing