Slide 1

Slide 1 text

Про Гит. Вот так просто.

Slide 2

Slide 2 text

Чтобы понять гит, нужно забыть гит-пул. git pull 1.

Slide 3

Slide 3 text

(Чтобы использовать гит, гит-пул забывать не нужно) git pull 1a.

Slide 4

Slide 4 text

Но чтобы понять гит, нужно забыть гит-пул. git pull 1.

Slide 5

Slide 5 text

git pull 1b. Магическая команда Простые (атомарные) команды Каждая команда выполняет одно и только одно действие git fetch git checkout git merge git reset git rebase git push . . . Может смёржить как надо, 
 а может и не как надо

Slide 6

Slide 6 text

1c. Простые (атомарные) команды Каждая команда выполняет одно и только одно действие git fetch git checkout git merge git reset git rebase git push . . . (здесь пишем, как именно нам надо) (здесь пишем, как именно нам надо) (здесь пишем, как именно нам надо) (здесь пишем, как именно нам надо) (здесь пишем, как именно нам надо) (здесь пишем, как именно нам надо)

Slide 7

Slide 7 text

Репозитории. git fetch 2. git clone git init

Slide 8

Slide 8 text

git init 2a. Встречайте. Kisunya Slowpoke Zayac Dima Malikov

Slide 9

Slide 9 text

git init 2a. Встречайте. Zayac Kisunya Slowpoke Впрочем, обойдёмся без Димы.

Slide 10

Slide 10 text

git init 2a. Встречайте. Zayac Kisunya Slowpoke (Басня в трёх действиях)

Slide 11

Slide 11 text

git init 2a. Zayac Kisunya Slowpoke > git init . > git config user.name “kisunya” > git config user.email “[email protected]” Кисуня создаёт и настраивает репозиторий. > git config receive.denyCurrentBranch updateInstead Последняя команда: Гит на всякий пожарный “защищает” репозитории 
 на файловой системе от пушей в текущий бранч, а мы экспериментируем
 и Кисуне (только Кисуне!) этой защиты не нужно.

Slide 12

Slide 12 text

git init 2a. Zayac Kisunya Slowpoke > git init . > git config user.name “kisunya” > git config user.email “[email protected]” > echo “# Я Кисуня” >> README.md > git add README.md > git status README.md > git status README.md README.md Кисуня добавляет файл.

Slide 13

Slide 13 text

git commit 2b. Zayac Kisunya Slowpoke > git init . > git config user.name “kisunya” > git config user.email “[email protected]” > echo “# Я Кисуня” >> README.md > git add README.md > git status README.md > git status > git commit -m “Добавлен файлик README” > git status README.md Кисуня коммитит.

Slide 14

Slide 14 text

README.md git clone 2c. Zayac Kisunya Slowpoke > git clone /Users/kisunya/spaceship README.md > cd ./spaceship /Users/kisunya/spaceship /Users/slowpoke/spaceship > ls README.md .git Слоупок клонирует кисунин репозиторий.

Slide 15

Slide 15 text

README.md git fetch 2d. Zayac Kisunya Slowpoke README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship > git init . > git remote add origin /Users/kisunya/spaceship /Users/zayac/spaceship > git remote -v Заяц непростой человек - он инициирует свой собственный репозиторий и добавляет кисунин репозиторий в виде ремоутного (удалённого). (И в этом нет ничего осудительного)

Slide 16

Slide 16 text

README.md git fetch 2d. Zayac Kisunya Slowpoke README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship > git init . > git remote add origin /Users/kisunya/spaceship > git fetch origin master .git README.md /Users/zayac/spaceship README.md > git status > git remote -v > git merge --ff-only origin/master > ls Заяц фетчит мастер-бранч из кисуниного репозитория.

Slide 17

Slide 17 text

README.md git fetch 2d. Zayac Kisunya Slowpoke README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship > git init . > git remote add origin /Users/kisunya/spaceship > git fetch origin master .git README.md /Users/zayac/spaceship README.md > git status > git remote -v > git merge --ff-only origin/master > ls Заяц фетчит мастер-бранч из кисуниного репозитория. (Я не знаю, кстати, почему тут по-разному) (Я просто запомнил, что фетч и пуш так, а рибейз и мёрж по-другому)

Slide 18

Slide 18 text

README.md git fetch 2d. Zayac Kisunya Slowpoke README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship > git log README.md /Users/zayac/spaceship > git log > git log kisunya 
 1df5b6de 
 Добавлен файлик README kisunya 
 1df5b6de 
 Добавлен файлик README kisunya 
 1df5b6de 
 Добавлен файлик README Все смотрят логи.

Slide 19

Slide 19 text

Резюме. git fetch 2. git clone git init Создать репозиторий. Клонировать чужой репозиторий, заиметь его копию. Вытянуть изменения из чужого репозитория (можно изо всех бранчей, можно из конкретного). 
 
 Положить их в отдельное место и не применять, пока я не решу, как именно я хочу их накатить.

Slide 20

Slide 20 text

Резюме. git status 2. git log git remote Работа со ссылками/алиасами на чужие репозитории. Можно посмотреть их список, можно добавить, можно удалить. Посмотреть историю коммитов в текущем бранче
 в моей версии репозитория. Посмотреть какие изменения (не обязательно файлы, а изменения) я ещё не закоммитил. Ил

Slide 21

Slide 21 text

Мёрдж. 3. git merge

Slide 22

Slide 22 text

Бранчи и мёрдж. git merge
 --squash 3. git merge git merge
 --ff-only

Slide 23

Slide 23 text

git merge 3. Zayac Kisunya Slowpoke > git config user.name “slowpoke” > git config user.email “[email protected]” Слоупок чуть не забыл настроить репозиторий. README.md README.md README.md

Slide 24

Slide 24 text

git merge 3. Zayac Kisunya Slowpoke > git config user.name “zayac” > git config user.email “[email protected]” А заяц - так вообще позорище. README.md README.md README.md

Slide 25

Slide 25 text

README.md > ? git merge 3. Zayac Kisunya Slowpoke README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship > git сheckout -b engine README.md /Users/zayac/spaceship Ребята распределяют задачи. > git сheckout -b nav Кисуня занимается движком. И Слоу занимается движком. А Заяц будет делать навигашку. (engine) (master) (nav) (Но пока что не знает, как бы ему оказаться в том же бранче, 
 что и Кисуня).

Slide 26

Slide 26 text

Ребята распределяют задачи. README.md > git fetch origin engine git merge 3. Zayac Kisunya Slowpoke README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship > git сheckout -b engine README.md /Users/zayac/spaceship > git сheckout -b nav > git push origin engine > git checkout engine 1. Кисуня сам хозяин оригинального репозитория. Поэтому пушать куда- либо свой бранч ему не требуется. 2. Слоупок забирает бранч 
 (пусть и пустой) 
 из оригинального репозитория. 3. И вручную переключается 
 в этот бранч. (engine) (engine) (nav)

Slide 27

Slide 27 text

Ребята распределяют задачи. README.md > git fetch origin engine git merge 3. Zayac Kisunya Slowpoke README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship > git сheckout -b engine README.md /Users/zayac/spaceship > git сheckout -b nav > git checkout engine А здесь Слоупок ещё в своей локальной копии мастера. (engine) (engine) (nav)

Slide 28

Slide 28 text

Ребята распределяют задачи. README.md > git fetch origin engine git merge 3. Zayac Kisunya Slowpoke README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship > git сheckout -b engine README.md /Users/zayac/spaceship > git сheckout -b nav > git checkout engine Заяц оказался индивидуалистом 
 и поэтому решил 
 вообще ничего не пушать, 
 пока не закончит свою фичу. Имеем ли мы право осудить его за это? Посмотрим позже… (engine) (engine) (nav)

Slide 29

Slide 29 text

Ребята начинают работать. README.md git merge 3. Zayac Kisunya Slowpoke README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship > git add винтики.js шайбоньки.js. README.md /Users/zayac/spaceship > git add ии.js (engine) (engine) (nav) > git add болтики.js винтики.js шайбоньки.js болтики.js ии.js > git commit -m 
 “Моё файло” “Добавил винты и шайбы” Здесь хорошо бы использовать “императив”, но в русском языке такой формы вроде как нет. > git commit -m “Перечислил все болтики” > git commit -m “Искуственный интеллект”

Slide 30

Slide 30 text

README.md git merge 3. Zayac Kisunya Slowpoke README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine) (engine) (nav) > git push origin engine винтики.js шайбоньки.js болтики.js ии.js Пуш отклонён, потому что Кисуня тоже закоммитил в этот бранч и Слоупок пытается пушнуть именно в Кисунин репозиторий (origin). !rejected

Slide 31

Slide 31 text

README.md git merge 3. README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine) (engine) (nav) > git add я.jpg винтики.js шайбоньки.js болтики.js ии.js Слоу внезапно решил, что перед мёржем 
 ему нужно добавить ещё один коммит. > git commit -m “Фото автора” я.jpg Zayac Kisunya Slowpoke

Slide 32

Slide 32 text

Посмотрим логи. README.md git merge 3. Zayac Kisunya Slowpoke README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine) (engine) (nav) винтики.js шайбоньки.js болтики.js ии.js я.jpg > git log > git log > git log kisunya 
 c31a2638 
 Добавил винты и шайбы slowpoke 
 1c459911 
 Фото автора zayac 
 b0fb5136 
 Искуственный интеллект kisunya 
 1df5b6de 
 Добавлен файлик README slowpoke 
 12ebe2bb 
 Перечислил все болтики kisunya 
 1df5b6de 
 Добавлен файлик README kisunya 
 1df5b6de 
 Добавлен файлик README

Slide 33

Slide 33 text

README.md git merge 3. README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine) (engine) (nav) > git fetch origin engine винтики.js шайбоньки.js болтики.js ии.js Теперь Слоупок забирает изменения Кисуни. я.jpg > git merge --ff-only origin/engine Нормально же начинали! Отказано! Zayac Kisunya Slowpoke (NB: кстати, после фетча git status показывает как текущий бранч отличается от оригинального)

Slide 34

Slide 34 text

README.md git merge 3. README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine) (engine) (nav) винтики.js шайбоньки.js болтики.js ии.js я.jpg > git merge Смёржим, пока что. шайбоньки.js винтики.js Zayac Kisunya Slowpoke

Slide 35

Slide 35 text

git merge 3. Slowpoke README.md /Users/slowpoke/spaceship (engine) винтики.js болтики.js я.jpg шайбоньки.js > git log slowpoke 
 1c459911 
 Фото автора slowpoke 
 12ebe2bb 
 Перечислил все болтики kisunya 
 1df5b6de 
 Добавлен файлик README kisunya 
 c31a2638 
 Добавил винты и шайбы slowpoke 
 822c9402 
 Merge 1c459911 + c31a2638 Неприятненький коммит!

Slide 36

Slide 36 text

git merge 3. Slowpoke README.md /Users/slowpoke/spaceship (engine) винтики.js болтики.js я.jpg шайбоньки.js > git reflog HEAD@{1}
 Commit 
 Фото автора HEAD@{2}
 Commit
 Перечислил все болтики HEAD@{4}
 Clone
 /Users/kisunya/spaceship HEAD@{3}
 Checkout
 Move from master to engine HEAD@{0}
 Merge (recursive)
 Merge remote branch engine Гит лог — история всех локальных коммитов. Гит рефлог — история всех локальных действий. HEAD@{N} — курсор

Slide 37

Slide 37 text

git merge 3. Slowpoke README.md /Users/slowpoke/spaceship (engine) болтики.js я.jpg > git reset --hard HEAD@{1} HEAD@{2}
 Commit 
 Фото автора HEAD@{3}
 Commit
 Перечислил все болтики HEAD@{5}
 Clone
 /Users/kisunya/spaceship HEAD@{4}
 Checkout
 Move from master to engine HEAD@{1}
 Merge (recursive)
 Merge remote branch engine Отменяем мёрж-коммит. 
 Переходим назад по истории. > git reflog HEAD@{0}
 Reset
 Moving to HEAD@{1}

Slide 38

Slide 38 text

git merge 3. Slowpoke README.md /Users/slowpoke/spaceship (engine) болтики.js я.jpg > git log slowpoke 
 1c459911 
 Фото автора slowpoke 
 12ebe2bb 
 Перечислил все болтики kisunya 
 1df5b6de 
 Добавлен файлик README 
 
 
 
 Неприятненький коммит! Кисулин коммит! больше нет! больше нет!

Slide 39

Slide 39 text

Резюме. git merge --squash 3. git merge --ff-only git merge Объединить коммиты в двух ветках, попробовать fast- forward (без мёрж-коммита), а если не вышло — найти способ смёржить c мёрж-коммитом. 
 Выполняется на git pull. Объединить коммиты в двух ветках без мёрж-коммита. Если так не вышло — оставить всё как есть, без мёржа. Объединить коммиты в двух ветках, создать суммирующие файлы для мёрж-коммита, но не коммитить эти файлы, чтобы мы могли решить, что с ними делать дальше.

Slide 40

Slide 40 text

Резюме. git merge --abort 3. git reset git reflog Просмотреть историю всех локальных действий. Перейти в истории на указанную позицию (по умолчанию — HEAD). Это очень легко и нестрашно! Отменить мёрж в процессе, всё вернуть как было в начале до него.

Slide 41

Slide 41 text

Рибейз. 4. git rebase

Slide 42

Slide 42 text

git rebase 4. Slowpoke README.md /Users/slowpoke/spaceship (engine) винтики.js болтики.js я.jpg шайбоньки.js > git log slowpoke 
 1c459911 
 Фото автора slowpoke 
 12ebe2bb 
 Перечислил все болтики kisunya 
 1df5b6de 
 Добавлен файлик README kisunya 
 c31a2638 
 Добавил винты и шайбы 
 
 Неприятненький коммит! > git rebase origin/engine Попробуем рибейз вместо мёржа. больше нет! Всё прекрасно!

Slide 43

Slide 43 text

Slowpoke README.md /Users/slowpoke/spaceship (engine) болтики.js я.jpg HEAD@{3}
 Rebase 
 Checkout origin/engine HEAD@{4}
 Reset
 Moving to HEAD HEAD@{6}
 Merge (recursive)
 Merge remote branch engine HEAD@{5}
 Reset
 Moving to HEAD@{1} HEAD@{2}
 Rebase
 Перечислил все болтики Посмотрим историю. > git reflog HEAD@{0}
 Rebase
 (Finished) винтики.js шайбоньки.js HEAD@{1}
 Rebase
 Фото автора HEAD@{7}
 git rebase 4.

Slide 44

Slide 44 text

README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine) (engine) (nav) винтики.js шайбоньки.js болтики.js ии.js я.jpg > git push origin engine шайбоньки.js винтики.js Zayac Kisunya Slowpoke git rebase 4.

Slide 45

Slide 45 text

Zayac Kisunya Slowpoke README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine) (engine) (nav) винтики.js шайбоньки.js болтики.js ии.js я.jpg шайбоньки.js винтики.js > git log slowpoke 
 1c459911 
 Фото автора slowpoke 
 12ebe2bb 
 Перечислил все болтики болтики.js я.jpg git rebase 4.

Slide 46

Slide 46 text

README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine) (engine) (nav) винтики.js шайбоньки.js болтики.js ии.js я.jpg > echo “Обновлённое фото” >> я.jpg шайбоньки.js винтики.js Zayac Kisunya Slowpoke > git add я.jpg > git commit -m “Обновил фото” болтики.js я.jpg git rebase 4.

Slide 47

Slide 47 text

README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine) (engine) (nav) винтики.js шайбоньки.js болтики.js ии.js > echo “Нет, автор — я” > я.jpg шайбоньки.js винтики.js > git add я.jpg > git commit -m “Правильное фото!” болтики.js я.jpg Налицо конфликт. 
 Кисуня не знает об изменениях Слоу, 
 а Слоу не знает об изменениях Кисуни. я.jpg git rebase 4. Zayac Kisunya Slowpoke

Slide 48

Slide 48 text

slowpoke 
 1c459911 
 Фото автора slowpoke 
 1c459911 
 Фото автора README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine) (engine) (nav) винтики.js шайбоньки.js болтики.js ии.js шайбоньки.js винтики.js Zayac Kisunya Slowpoke болтики.js я.jpg я.jpg git rebase 4. > git log kisunya 
 3b1b1e6a 
 Правильное фото! > git log slowpoke 
 04b0eaca 
 Обновил фото

Slide 49

Slide 49 text

README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine) (engine) (nav) винтики.js шайбоньки.js болтики.js ии.js я.jpg > git fetch origin engine шайбоньки.js винтики.js Zayac Kisunya Slowpoke > git merge --ff-only origin/engine > git rebase origin/engine болтики.js git rebase 4. > git rebase --abort Конфликт! 
 Невозможно поменять историю. 
 Откатывается на мёрж. Изменён один и тот же файл, 
 без мёрж-коммита не проходит. Прекращаем рибейз, это легко! я.jpg

Slide 50

Slide 50 text

README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine) (engine) (nav) винтики.js шайбоньки.js болтики.js ии.js я.jpg шайбоньки.js винтики.js Zayac Kisunya Slowpoke болтики.js git rebase 4. > git merge Слоупок мёржит от безысходности, и таким образом создаёт мёрж-коммит. > cat я.jpg > echo “Конечно же, автор — Слоу!” > я.jpg > git add я.jpg > git commit я.jpg

Slide 51

Slide 51 text

README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine) (engine) (nav) винтики.js шайбоньки.js болтики.js ии.js шайбоньки.js винтики.js Zayac Kisunya Slowpoke болтики.js я.jpg git rebase 4. > git push origin engine И, крайне злой, пушает его прямо в Кисунин репозиторий. Теперь пути назад нет.* *Есть, только если они договорятся и Кисуня отменит мёрж у себя через reflog, а Слоупок не будет вредничать и примет изменения. Только компромисс, в общем. я.jpg

Slide 52

Slide 52 text

kisunya 
 3b1b1e6a 
 Правильное фото! Zayac Kisunya Slowpoke README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (engine) (engine) (nav) винтики.js шайбоньки.js болтики.js ии.js я.jpg шайбоньки.js винтики.js > git log slowpoke 
 dc7726c7 
 Merge origin/engine болтики.js я.jpg git rebase 4. Кисуня может что-то заподозрить только если посмотрит в лог.

Slide 53

Slide 53 text

README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (master) (engine) (nav) винтики.js шайбоньки.js болтики.js ии.js > git checkout master шайбоньки.js винтики.js > git merge --ff-only engine болтики.js Но Кисуня не смотрит в лог 
 и мёржит бранч в мастер. git rebase 4. Zayac Kisunya Slowpoke я.jpg я.jpg

Slide 54

Slide 54 text

kisunya 
 3b1b1e6a 
 Правильное фото! Zayac Kisunya Slowpoke README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (master) (engine) (nav) винтики.js шайбоньки.js болтики.js ии.js я.jpg шайбоньки.js винтики.js > git log slowpoke 
 dc7726c7 
 Merge origin/engine болтики.js я.jpg git rebase 4. Теперь мёрж-коммит и в мастере.

Slide 55

Slide 55 text

README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (master) (engine) (nav) винтики.js шайбоньки.js болтики.js ии.js > git fetch origin master шайбоньки.js винтики.js болтики.js Внезапно заяц решил рибейзнуть свой бранч на мастер. git rebase 4. Zayac Kisunya Slowpoke я.jpg я.jpg > git rebase origin/master

Slide 56

Slide 56 text

zayac 
 b0fb5136 
 Искуственный интеллект git rebase 4. Zayac README.md /Users/zayac/spaceship (nav) винтики.js шайбоньки.js > git log slowpoke 
 12ebe2bb 
 Перечислил все болтики kisunya 
 kisunya 
 c31a2638 
 Добавил винты и шайбы > git rebase origin/master И у него это получилось! (Его коммит добавился сверху.) У зайца всё прекрасно! болтики.js я.jpg ии.js slowpoke 
 dc7726c7 
 Merge origin/engine kisunya 
 3b1b1e6a 
 Правильное фото! slowpoke 
 04b0eaca 
 Обновил фото slowpoke 
 1c459911 
 Фото автора Неприятненький коммит! Но что поделать ¯\_(ツ)_/¯

Slide 57

Slide 57 text

болтики.js README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (master) (engine) (master) винтики.js шайбоньки.js болтики.js > git push origin master шайбоньки.js винтики.js болтики.js Заяц может ответственно 
 пушать прямо в мастер, что и делает с удовольствием. git rebase 4. Zayac Kisunya Slowpoke я.jpg я.jpg > git checkout master > git merge --ff-only nav винтики.js шайбоньки.js я.jpg ии.js ии.js

Slide 58

Slide 58 text

болтики.js README.md README.md /Users/kisunya/spaceship /Users/slowpoke/spaceship README.md /Users/zayac/spaceship (master) (master) (master) винтики.js шайбоньки.js болтики.js > git merge --ff-only origin/master шайбоньки.js винтики.js болтики.js git rebase 4. Zayac Kisunya Slowpoke я.jpg я.jpg > git checkout master > git fetch origin master винтики.js шайбоньки.js я.jpg ии.js ии.js ии.js И Слоу может обновить свой master.

Slide 59

Slide 59 text

git merge --ff-only Объединить коммиты в двух ветках без мёрж-коммита. Если так не вышло — оставить всё как есть, без мёржа. Резюме. 4. git rebase Взять все новые незапушанные коммиты в текущем бранче, вынуть из истории, и положить по истории сверху (после) коммитов, находящихся в указанном бранче. git rebase --abort Отменить рибейз в процессе, всё вернуть как было в начале до него.

Slide 60

Slide 60 text

Мораль. NaN. git rebase Гит рибейз может сработать как надо только когда один человек работает в одном бранче.* *И ещё когда стороны могут прийти лично друг к другу, 
 помириться и вместе изменить историю. 
 Но такое случается редко.
 Крайне редко.

Slide 61

Slide 61 text

1d. git fetch git merge git pull == +

Slide 62

Slide 62 text

1d. git fetch git merge --ff-only git pull --ff-only == +

Slide 63

Slide 63 text

1d. git fetch git rebase git pull --rebase == +

Slide 64

Slide 64 text

https://eev.ee/blog/2015/04/24/just-enough-git- to-be-less-dangerous/ Список литературы. https://habrahabr.ru/post/268951/ (Перевод)