Работа с Git.
Задания и
решения.

Работа с Git: задания и решения
Приводим решения задач к урокам курса «Работа с Git» и даем соответствующие комментарии. Также обратите внимание, что решение большинства задач дополнительно разобрано в видео формате. Ссылки на соответствующие видео приведены ниже.

Уроки 1-2. Команды: init, config, status, add, commit

Подробнее о принципе работы, синтаксисе и вариантах использования вышеприведенных команд можно прочитать в Уроке 2 "Работа с Git: Внутренняя реализация. Команды: init, config, status, add, commit.".

Задача 1.1

Дана папка, в которой хранятся файлы свежесозданного блога о диких животных. Файловая структура данной директории:
Структура папки wild_animals

wild_animals
  ├── index.html
  └── pictures
    ├── elephant.jpg
    ├── giraffe.jpg
    └── paw_print.jpg
Как видно из структуры, в корневой директории лежат:
  1. Основная страница блога index.html
  2. Папка pictures, в которой хранятся изображения ( файлы *.jpg) сайта
Рассмотрим эти две составляющие подробнее:

1. Основная страница блога index.html
Представляет собой файл, который содержит HTML код главной страницы сайта. Ниже приведено его содержимое:
Файл index.html

<!DOCTYPE html>
<html>

  <head>
    <title>Wild Animals Blog</title>
    <meta charset="utf-8">
  </head>

  <body align=center>

    <img width=100px src="pictures/paw_print.jpg">
    <h1>Wild Animals</h1>
    <small>- Blog about nature -</small>

    <br>
    <br>
    <br>
    <br>

    <p>Let's talk about wild animals around the world:</p>
    <h2>Giraffe</h2>
    <img src="pictures/giraffe.jpg">
    <p><b>Area:</b> Africa</p>
    <p><b>Weight:</b> 900-1200kg</p>
    <p><b>Height:</b> 6m</p>
    <br>

    <h2>Elehant</h2>
    <img width=350px src="pictures/elephant.jpg">
    <p><b>Area:</b> Africa, Asia</p>
    <p><b>Weight:</b> 4000-7000kg</p>
    <p><b>Height:</b> 3m</p>
    <br>

  </body>
</html>
Если отрыть данный файл в браузере, то выглядит основная (и пока единственная) страница блога таким образом:
Установка модуля внутри терминала IDE PyCharm
Главная страница сайта о диких животных
2. Папка с картинками pictures
Картинки для главной страницы сайта хранятся в папке pictures. Ниже представлена ее структура:
Структура папки pictures

pictures
    ├── elephant.jpg
    ├── giraffe.jpg
    └── paw_print.jpg
А вот и сами изображения, необходимые для корректной загрузки основной страницы сайта о диких животных:
В ходе задания будет необходимо создать на основе директории wild_animals репозиторий Git и внести в него некоторые изменения, после чего зафиксировать их средствами Git. Далее приводим само условие задачи:
Условие

1. Создайте репозиторий внутри папки wild_animals. Убедитесь, что внутри папки wild_animals появилась папка .git.

2. Настройте пользователя Git на уровне репозитория wild_animals:
       1) Изучите содержимое файла конфигурации Git для текущего репозитория (.git/config)
       2) Настройте имя и email пользователя для текущего репозитория
       3) Убедитесь, что файл .git/config изменился соответствующим образом

3. Изучите содержимое папки .git/objects
       1) Убедитесь, что отсутствует файл индекса (.git/index)
       2) Убедитесь, что папка с объектами Git пустая (.git/objects)
       3) Убедитесь, что указатель HEAD указывает на ветку main

4. Сделайте 1й коммит:
       1) Сделайте файлы папки wild_animals отслеживаемыми
       2) Обратите внимание на файл индекса (.git/index) и папку с объектами (.git/objects)
       3) Сделайте коммит
       4) Найдите хэш коммита

5. Сделайте 2й коммит
       1) Исправьте опечатку в файле index.html (опечатка в слове Elephant)
       2) Добавьте изменения в индекс
       3) Сделайте коммит

6. Сделайте 3й коммит
       1) Добавьте в файл index.html секцию для еще одного животного (например, для кенгуру)
       2) Добавьте изменения в индекс
       3) Сделайте коммит

Решение - Git Bash
п 1. Создаем репозиторий

# Переходим в директорию будущего репозитория
$ cd wild_animals


# Создаем репозиторий
$ git init
Initialized empty Git repository in /Users/tati/Documents/Git Repos/Course Git/wild_animals/.git/


# Структура папки .git сразу после создания репозитория
$ tree .git
.git
├── HEAD
├── config
├── description
├── hooks
├── info
│   └── exclude
├── objects
│   ├── info
│   └── pack
└── refs
    ├── heads
    └── tags


# Текущее состояние рабочей директории
# Есть неотслеживаемые файлы
$ git status
On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	index.html
	pictures/

nothing added to commit but untracked files present (use "git add" to track)
Решение - Git Bash
п 2. Настраиваем пользователя Git

# Выводим содержимое файла конфигурации Git для текущего репозитория
$ cat .git/config 
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true


# Задаем имя и email пользователя для текущего репозитория
$ git config user.name smartiqa
$ git config user.email smartiqa@gmail.com


# Проверяем, что файл .git/config изменился соответствующим образом
$ cat .git/config 
[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true
[user]
	name = smartiqa
	email = smartiqa@gmail.com

Решение - Git Bash
п 3. Изучаем содержимое папки .git/objects

# Выводим структуру папки .git
# Файл .git/index отсутствует
# В папке .git/objects только две пустые директории info и pack
$ tree .git
.git
├── HEAD
├── config
├── description
├── hooks
├── info
│   └── exclude
├── objects
│   ├── info
│   └── pack
└── refs
    ├── heads
    └── tags


# Выводим содержимое файла HEAD
# В нем лежит ссылка на ветку main
$ cat .git/HEAD 
ref: refs/heads/main
Решение - Git Bash
п 4. Делаем 1й коммит

# Текущее состояние рабочей директории
# Есть неотслеживаемые файлы
$ git status
On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	index.html
	pictures/

nothing added to commit but untracked files present (use "git add" to track)


# Добавляем все файлы в индекс
$ git add *


# Снова проверяем статус - файлы попали в индекс и теперь готовы к коммиту
$ git status
On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
	new file:   index.html
	new file:   pictures/elephant.jpg
	new file:   pictures/giraffe.jpg
	new file:   pictures/paw_print.jpg


# Проверяем содержимое директории .git
# Появился файл индекса (.git/index)
# Появились Blob-файлы в папке .git/objects
$ tree .git
.git
├── HEAD
├── config
├── description
├── hooks
├── index
├── info
│   └── exclude
├── objects
│   ├── 9f
│   │   └── ef2e52dc23c9ade52eb015f14664d3391cf0af
│   ├── ce
│   │   └── 4b62e40390837fbe5a59d2c3012b2d48083344
│   ├── e9
│   │   └── e8bb8d58d7449048dff405d8124e45dacf6e68
│   ├── eb
│   │   └── a725d14ab5b0d42cfb3e1ee2ee2e342f545ea3
│   ├── info
│   └── pack
└── refs
    ├── heads
    └── tags

12 directories, 21 files


# Делаем коммит
$ git commit -m "G-02: Initial"
[main (root-commit) ac5f3e4] G-02: Initial
 4 files changed, 36 insertions(+)
 create mode 100644 index.html
 create mode 100644 pictures/elephant.jpg
 create mode 100644 pictures/giraffe.jpg
 create mode 100644 pictures/paw_print.jpg


# Хэш коммита - ac5f3e4f
$ git log
commit ac5f3e4f4b2c023b79080a074ea47db676957745 (HEAD -> main)
Author: smartiqa <smartiqa@gmail.com>
Date:   Wed Dec 23 12:43:03 2020 +0300

    G-02: Initial


# Рабочая директория теперь чистая
$ git status
On branch main
nothing to commit, working tree clean


# Проверяем состояние директории .git
# В папке .git/objects появились Tree-объекты(деревья) для хранения файловой структуры 
# Также в папке .git/objects появился объект коммита ac/5f3e4f4b2c023b79080a074ea47db676957745
$ tree .git
.git
├── COMMIT_EDITMSG
├── HEAD
├── config
├── description
├── hooks
├── index
├── info
│   └── exclude
├── logs
│   ├── HEAD
│   └── refs
│       └── heads
│           └── main
├── objects
│   ├── 58
│   │   └── 8415ac22ca540d36e1bd3ff221b34e0d7e92a5
│   ├── 75
│   │   └── 10e930bcaf31b167f126b6319409671d7585e4
│   ├── 9f
│   │   └── ef2e52dc23c9ade52eb015f14664d3391cf0af
│   ├── ac
│   │   └── 5f3e4f4b2c023b79080a074ea47db676957745
│   ├── ce
│   │   └── 4b62e40390837fbe5a59d2c3012b2d48083344
│   ├── e9
│   │   └── e8bb8d58d7449048dff405d8124e45dacf6e68
│   ├── eb
│   │   └── a725d14ab5b0d42cfb3e1ee2ee2e342f545ea3
│   ├── info
│   └── pack
└── refs
    ├── heads
    │   └── main
    └── tags

18 directories, 28 files


# Также изменился указатель на HEAD ветки
# Теперь он указывает на наш коммит ac5f3e4f
$ cat .git/refs/heads/main 
ac5f3e4f4b2c023b79080a074ea47db676957745
Решение - Git Bash
п 5. Исправляем опечатку в файле index.html и делаем 2й коммит

# Правим опечатку в файле index.html: 'Elehant' на 'Elephant'
…
    <h2>Elephant</h2>
…


# После правки в рабочей директории появился измененный файл index.html
$ git status
On branch main
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:   index.html

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


# Добавляем измененный файл в индекс
$ git add index.html 


# Файл index.html теперь готов к коммиту
$ git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   index.html


# Делаем коммит
$ git commit -m "G-02: Fixed typo in Elephant"
[main 9006ea6] G-02: Fixed typo in Elephant
 1 file changed, 1 insertion(+), 1 deletion(-)


# Хэш второго коммита - 9006ea6f
$ git log
commit 9006ea6f20e1f0bbf0b4a800ebd09ca3f974339f (HEAD -> main)
Author: smartiqa <smartiqa@gmail.com>
Date:   Wed Dec 23 12:59:38 2020 +0300

    G-02: Fixed typo in Elephant

commit ac5f3e4f4b2c023b79080a074ea47db676957745
Author: smartiqa <smartiqa@gmail.com>
Date:   Wed Dec 23 12:43:03 2020 +0300

    G-02: Initial
Решение - Git Bash
п 6. Добавляем новую секцию в index.html и картинку в папку pictures и делаем 3й коммит

# Добавляем блок информации о кенгуру в index.html
…
    <h2>Kangaroo</h2>
    <img width=350px src="pictures/kangaroo.jpg">
    <p><b>Area:</b> Australia</p>
    <p><b>Weight:</b> 20-80kg</p>
    <p><b>Height:</b> 1,5m</p>
    <br>
…


# Добавляем в папку pictures изображение кенгуру kangaroo.jpg

# Появились изменения в файле index.html
# Также появился новый неотслеживаемый файл kangaroo.jpg
# Эти изменения пока не добавлены в индекс
$ git status
On branch main
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:   index.html

Untracked files:
  (use "git add <file>..." to include in what will be committed)
	pictures/kangaroo.jpg

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


# Добавляем изменения в индекс
$ git add *


# Изменения готовы к коммиту
$ git status
On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
	modified:   index.html
	new file:   pictures/kangaroo.jpg


# Делаем коммит
$ git commit -m "G-02: Added new info block for kangaroo"
[main 924a9dd] G-02: Added new info block for kangaroo
 2 files changed, 7 insertions(+)
 create mode 100644 pictures/kangaroo.jpg


# Рабочая директория снова чистая
tati$ git status
On branch main
nothing to commit, working tree clean


# Хэш нового коммита - 924a9d
$ git log
commit 924a9ddb4e2cff13472605a33c950cd77a83f297 (HEAD -> main)
Author: smartiqa <smartiqa@gmail.com>
Date:   Wed Dec 23 13:30:55 2020 +0300

    G-02: Added new info block for kangaroo

commit 9006ea6f20e1f0bbf0b4a800ebd09ca3f974339f
Author: smartiqa <smartiqa@gmail.com>
Date:   Wed Dec 23 12:59:38 2020 +0300

    G-02: Fixed typo in Elephant

commit ac5f3e4f4b2c023b79080a074ea47db676957745
Author: smartiqa <smartiqa@gmail.com>
Date:   Wed Dec 23 12:43:03 2020 +0300

    G-02: Initial

Задача 1.2

Дана маленькая библиотека, вычисляющая некоторые тригонометрические функции. Она имеет следующую структуру:
Структура директории mat_lib

mat_lib
    ├─docs
    │   └─math_lib_docs.txt
    │
    └─pyfiles
            └─factorial.py
            └─test.py
            └─trigonometry.py
Назначение каждого из файлов:
  1. [ math_lib_docs.txt ] Короткая документация по функционалу библиотеки
  2. [ factorial.py ] Модуль с функцией factorial(), которая вычисляет факториал переданного числа
  3. [ trigonometry.py ] Модуль с тригонометрическими функциями, например, sin()
  4. [ test.py ] Модуль для проверки функционала тригонометрических функций для разных значений углов
Далее приводим содержимое перечисленных модулей:
Содержимое файла math_lib_docs.txt

This is the library which designation is to implement some math functions
Содержимое файла factorial.py

def factorial(x):
    ans = 1

    if x < 0:
        raise ValueError('x must be greater than 0')

    for i in range(1, x+1):
        ans *= i
    
    return ans
Содержимое файла trigonometry.py

from factorial import factorial as fct

def sin(x):
    sin = 1 - (x**2/fct(2)) + (x**4/fct(4)) - (x**6/fct(6)) + (x**8/fct(8)) - (x**10/fct(10))
    return round(sin, 5)
Содержимое файла test.py

from trigonometry import sin
import math

pi = math.pi
print('pi:', pi)
for alpha in [0, pi, pi/2, pi/3, pi/4, pi/6]:
    print(f'For angle: {0 if alpha == 0 else "pi/"+str(int(pi/alpha))}, Sine  is ~ {sin(alpha)}')
Условие

1) Инициализируйте репозиторий в папке mat_lib

2) Задайте имя пользователя и email глобально
    1. Проверьте, что изменения внесены в файл глобальных настроек .gitconfig
    2. Проверьте, что файл локальных настроек .git/config не был изменен

3) Изучите содержимое папки .git/
    1. Узнайте, на что сейчас указывает HEAD
    2. Просмотрите файл, на который указывает HEAD (в этом пункте есть подвох)

4) Добавьте все файлы в индекс

5) Сделайте первый коммит
    1. Просмотрите объект коммита, найдите хэш объекта-дерева корня репозитория
    2. Просмотрите объект дерева корня репозитория
    3. Проверьте, на что указывает HEAD сейчас
    4. Просмотрите файл, на который указывает HEAD
    5. Ответьте на вопрос: на что указывает текущая ветка? Для этого просмотрите на объект, на который указывает ветка.

6) Выполните файл test.py
    1. Просмотрите статус файлов, чтобы обнаружить, что появились файлы кэша

7) Сделайте второй коммит
    1. Просмотрите объект коммита, найдите хэш родительского коммита
    2. Посмотрите, на что сейчас указывает HEAD
    3. Проверьте файл, на который указывает HEAD 
    4. Узнайте, на что указывает текущая ветка. Для этого просмотрите на объект, на который указывает ветка.


Решение - Git Bash
п 1. Инициализируем репозиторий в папке mat_lib

$ git init
Initialized empty Git repository in C:/Users/DKay7/Desktop/mat_lib/.git/
Решение - Git Bash
п 2. Задаем имя пользователя и email глобально

# Чтобы задать имя пользователя глобально, 
# нужно воспользоваться утилитой git config c ключом --global
$ git config --global user.name daniil.k
$ git config --global user.email daniil.k@email.com


# Проверим, что файл действительно изменился
$ cat c:/users/daniil_k/.gitconfig
[filter "lfs"]
        clean = git-lfs clean -- %f
        smudge = git-lfs smudge -- %f
        process = git-lfs filter-process
        required = true
[user]
        name = daniil.k
        email = daniil.k@email.com
[init]
        defaultBranch = main


#  Проверим, что файл локальных настроек не изменен
$ cat .git/config
[core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true

Решение - Git Bash
п 3. Изучаем содержимое папки .git

# Посмотрим, на что указывает HEAD.
# Для этого нам нужно открыть файл .git/head
$ cat .git/head
ref: refs/heads/main


# Видно, что HEAD сейчас указывает на текущую ветку. 
# Давайте посмотрим, на что же указывает эта ветка. 
# Для этого также посмотрим на содержимое .git/refs/heads/main
$ cat .git/refs/heads/main
cat: .git/refs/heads/main: No such file or directory

# Вот и подвох. 
# Сейчас нет ни одного коммита, поэтому ветке не на что указывать, 
# и она до сих пор не создана Git. 
# Этот файл появится, когда мы сделаем первый коммит.
Решение - Git Bash
п 4. Добавляем файлы в индекс

# Добавим файлы в индекс
$ git add -A


# Просмотрим статус
$ git status
On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   docs/math_lib_docs.txt
        new file:   pyfiles/factorial.py
        new file:   pyfiles/test.py
        new file:   pyfiles/trigonometry.py

# Как видно, все наши файлы добавлены в индекс
Решение - Git Bash
п 5. Делаем первый коммит

# Делаем коммит
$ git commit -m "G-02: Initial commit"
[main (root-commit) d8bf73f] G-02:  Initial commit
 4 files changed, 47 insertions(+)
 create mode 100644 docs/math_lib_docs.txt
 create mode 100644 pyfiles/factorial.py
 create mode 100644 pyfiles/test.py
 create mode 100644 pyfiles/trigonometry.py


# Теперь посмотрим на объект этого коммита:
$ git cat-file -p d8bf73f
tree 052211c8506fa7c962a6e4f2b88106802966e865
author daniil.k<daniil.k@email.com> 1607015871 +0300
committer daniil.k<daniil.k@email.com> 1607015871 +0300

Initial commit

# Видим, что основа коммита – дерево корня репозитория
# “tree 052211c8506fa7c962a6e4f2b88106802966e865”. 
# Посмотрим на него внимательнее
$ git cat-file -p 052211
040000 tree 57a491394c9b7b87c68cc25c7afdba4fd11c5a95    docs
040000 tree a36c5f66dcc4efcb5cd8a2821f06d3c62c1335ac    pyfiles
# Как видно, корневое дерево состоит из деревьев для всех поддиректорий. 
# Все так, как и должно быть.


# Теперь посмотрим, на что указывает HEAD. 
# Для этого достаточно открыть файл .git/head
$ cat .git/head
ref: refs/heads/main

# Наш головной указатель все еще указывает на единственную ветку. 
# Спойлер: так будет до тех пор, 
# пока мы не передвинем его вручную на другой коммит или новую ветку.

#Теперь посмотрим, была ли создана ветка:
$ cat .git/refs/heads/main
d8bf73ffdcbdb368aee192e2413b647857c478df

# Как видим, ветка была создана 
# И сейчас она даже на что-то указывает
# Посмотрим, что это за объект “d8bf7..”.
$ git cat-file -p d8bf7
tree 052211c8506fa7c962a6e4f2b88106802966e865
author daniil.k <daniil.k@email.com> 1607015871 +0300
committer daniil.k <daniil.k@email.com> 1607015871 +0300

G-02: Initial commit

# Оказывается, что это наш коммит! 
# Все согласуется с графом, приведенным в главе 9.
Решение - Git Bash
п 6. Создаем изменения - запускаем файл test.py

# Примечание: Если у вас на компьютере не установлен интерпретатор Python,
# и вы не хотите запускать скрипт test.py
# то в данной части задания вы можете просто добавить любой новый файл в репозиторий


# Выполним файл test.py
$ cd pyfiles 
$ py test.py
pi: 3.1415926535897936
For angle: 0,        Sine  is ~ 0.0
For angle: pi/1,        Sine  is ~ -0.00045
For angle: pi/2,        Sine  is ~ 1.0
For angle: pi/3,        Sine  is ~ 0.86603
For angle: pi/4,        Sine  is ~ 0.70711
For angle: pi/6,        Sine  is ~ 0.5


# Отлично, а теперь посмотрим на наш репозиторий
$ ls
__pycache__/  factorial.py  test.py  trigonometry.py
# Как видно, появилась директория “__pycache__/” с файлами кэша.
Решение - Git Bash
п 7. Делаем второй коммит

# Убедимся, что появились новые файлы:
$ cd ../
$ git status
On branch main
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        pyfiles/__pycache__/

nothing added to commit but untracked files present (use "git add" to track)
# Действительно, директория “pyfiles/__pycache__/” сейчас не отслеживается.


# Сделаем еще один коммит. 
# При этом не забудем добавить файлы в индекс.
$ git add -A
$ git commit -m "G-02: cache commit"
[G-02 290d900] G-02: cache commit
 2 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 pyfiles/__pycache__/factorial.cpython-38.pyc
 create mode 100644 pyfiles/__pycache__/trigonometry.cpython-38.pyc


# Давайте посмотрим на объект этого коммита и найдем его родителя.
$ git cat-file -p 25c3acf
tree eff07cd789dffdee286d53662539c31bb66948e2
parent d8bf73ffdcbdb368aee192e2413b647857c478df
author daniil.k<daniil.k@email.com> 1607017522 +0300
committer daniil.k<daniil.k@email.com> 1607017522 +0300

G-02: cache commit
# Родитель указан в строчке “parent d8bf73ffdcbdb368aee192e2413b647857c478df”. 


# Можно в лишний раз убедиться, что это наш первый коммит.
$ git cat-file -p d8bf73f
tree 052211c8506fa7c962a6e4f2b88106802966e865
author daniil.k<daniil.k@email.com> 1607015871 +0300
committer daniil.k<daniil.k@email.com> 1607015871 +0300

G-02: Initial commit

# Все так, как мы и ожидали!

Урок 3. Команды: branch, checkout, status, log, diff

Подробнее о принципе работы, синтаксисе и вариантах использования вышеприведенных команд можно прочитать в Уроке 3 "Работа с Git: Ветвление. Создание, переключение и удаление веток. Команды: branch, checkout, status, log, diff.".

Задача 3.1

Дана библиотека, написанная на Python - Geometric Lib. Файловая структура данной библиотеки:
Структура папки geometric_lib

geometric_lib
    ├── circle.py
    ├── square.py
    └── docs
         └── README.md
В качестве задания необходимо выполнить ряд действий над репозиторием geometric_lib: создадим новую ветку, сделаем коммиты, посмотрим историю и изучим внесенные изменения средствами Git.
Условие

1) Выполните команду git clone https://github.com/smartiqaorg/geometric_lib. 
Она скопирует наш репозиторий к вам на компьютер.

2) Создайте новую ветку с названием new_features и переключитесь на нее.

3) Добавьте новый файл в эту ветку. 
Например, с вычислениями для фигуры Прямоугольник. 
Его название: rectangle.py
Его содержимое:

def area(a, b): 
    return a * b 

def perimeter(a, b): 
    return a + b 


4) Сделайте коммит с сообщением "L-03: Added rectangle.py".

5) Добавьте еще один файл в эту ветку. 
Например, с вычислениями для фигуры Треугольник.
Его название: triangle.py
Его содержимое:

def area(a, h): 
    return a * h / 2 

def perimeter(a, b, c): 
    return a + b + c 

6) Исправьте ошибку в вычислении периметра в файле rectangle.py, 
теперь он должен стать таким:

def area(a, b): 
    return a * b 

def perimeter(a, b): 
    return 2 * (a + b) 


7) Создайте еще один коммит внутри этой же ветки, его сообщение:
"L-03: Added triangle.py and fixed rectangle perimeter bug".

8) Постройте граф истории всего репозитория с однострочным выводом коммитов.

9) Постройте граф истории только текущей ветки. 
В ней должно быть два последних коммита.

10) Возьмите хэши двух последних коммитов из истории и посмотрите, 
какие изменения были внесены.

11) Обычно, так не делают на практике, но мы только учимся, 
поэтому давайте удалим ветку new_features без слияния. 
Не забудьте, что нельзя удалить ветку, на которой находится HEAD.
Решение - Git Bash
п 1. Клонируем репозиторий

# Клонируем репозиторий по ссылке
$ git clone https://github.com/smartiqaorg/geometric_lib
Cloning into 'geometric_lib'...
remote: Enumerating objects: 25, done.
remote: Counting objects: 100% (25/25), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 25 (delta 5), reused 22 (delta 3), pack-reused 0
Receiving objects: 100% (25/25), done.
Resolving deltas: 100% (5/5), done.

# Переходим в папку репозитория
$ cd geometric_lib/

# Получаем текущий статус репозитория
$ git status
On branch main
Your branch is up to date with 'origin/main'.

nothing to commit, working tree clean
Решение - Git Bash
п 2. Создаем новую ветку new_feature

# Создаем новую ветку
$ git checkout -b new_feature
Switched to a new branch 'new_feature'
Решение - Git Bash
п 3-4. Делаем коммит для Прямоугольника

# Создаем файл rectangle.py в редакторе nano
$ nano rectangle.py


# Добавляем содержимое файла rectangle.py
nano
---
def area(a, b):
    return a * b

def perimeter(a, b):
    return a + b
----


# Проверяем статус
# Видим новый неотслеживаемый файл rectangle.py
$ git status
On branch new_feature
Untracked files:
	rectangle.py


# Добавляем новый файл в индекс
$ git add rectangle.py


# Делаем коммит
$ git commit -m "L-03: Added rectangle.py"
[new_feature 0459635] L-03: Added rectangle.py
1 file changed, 6 insertions(+)
 create mode 100644 rectangle.py
Решение - Git Bash
п 5-7. Делаем коммит для Треугольника и исправляем ошибку для Прямоугольника

# Создаем файл triangle.py в редакторе nano
$ nano triangle.py


# В открывшемся окне редактора добавляем вычисления для Треугольника
def area(a, h):
    return a * h / 2

def perimeter(a, b, c):
    return a + b + c


# Открываем файл rectangle.py  в редакторе nano
$ nano rectangle.py 

# В открывшемся окне редактора меняем строку 
    return a + b

# На 
    return 2 * (a + b)

# Закрываем редактор, сохраняем изменения


# Проверяем текущий статус
# Появился новый неотслеживаемый файл и один измененный
$ git status
On branch new_feature
Changes not staged for commit:
	modified:   rectangle.py

Untracked files:
	triangle.py


# Добавляем все файлы в индекс 
$ git add *
$ git status
On branch new_feature
Changes to be committed:
	modified:   rectangle.py
	new file:   triangle.py


# Делаем коммит
$ git commit -m "L-03: Added triangle.py and fixed rectangle perimeter bug"
[new_feature 43aa2f6] L-03: Added triangle.py and fixed rectangle perimeter bug
 2 files changed, 9 insertions(+), 1 deletion(-)
 create mode 100644 triangle.py
Решение - Git Bash
п 8-9. Строим графы репозитория

# Строим граф всего репозитория
$ git log --all --pretty=oneline --graph
* 43aa2f642c2d5be041664015a1d042ec32c908bf (HEAD -> new_feature) L-03: Added triangle.py and fixed rectangle perimeter bug
* 12e6e7071b7240d51a41d955ffb2cee389485d8f L-03: Added rectangle.py
| * 30494317cde4419be779c14306561e0eaa78b88b (origin/feature) L-04: Add rectangle.py
|/  
| * b5b0fae727ca72c317c383b39c0af73d6adcd81c (origin/develop) L-04: Update docs for calculate.py
| * d76db2ac7f69cc920ae2e6f669fb0671a7fa7d71 L-04: Add calculate.py
| * 51c40ebfd0e0b65f52fe5e54740cbb038e492db3 L-04: Doc updated for triangle
| * d080c7888b81955bad2ed78d58ad910526b5132a L-04: Triangle added
|/  
* d078c8d9ee6155f3cb0e577d28d337b791de28e2 (origin/main, origin/HEAD, main) L-03: Docs added
* 8ba9aeb3cea847b63a91ac378a2a6db758682460 L-03: Circle and square added


# Строим только ветки new_feature
$ git log --pretty=oneline --graph main..new_feature
* 43aa2f642c2d5be041664015a1d042ec32c908bf (HEAD -> new_feature) L-03: Added triangle.py and fixed rectangle perimeter bug
* 12e6e7071b7240d51a41d955ffb2cee389485d8f L-03: Added rectangle.py
Решение - Git Bash
п 10. Смотрим изменения между соседними коммитами

# Смотрим изменения между предпоследним и последним коммитами
# Как видим, были изменения в файле rectangle.py (изменена одна строка) 
# И добавлено содержимое файла triangle.py
$ git diff 12e6e7071b7240d51a41d955ffb2cee389485d8f 43aa2f642c2d5be041664015a1d042ec32c908bf
diff --git a/rectangle.py b/rectangle.py
index 6505ce8..33ee011 100644
--- a/rectangle.py
+++ b/rectangle.py
@@ -3,4 +3,4 @@ def area(a, b):
 
 
 def perimeter(a, b):
-    return a + b
+    return 2 * (a + b)
diff --git a/triangle.py b/triangle.py
new file mode 100644
index 0000000..aa91401
--- /dev/null
+++ b/triangle.py
@@ -0,0 +1,8 @@
+triangle.py
+------------------
+def area(a, h):
+    return a * h / 2
+
+
+def perimeter(a, b, c):
+    return a + b + c


Решение - Git Bash
п 11. Удаляем ветку new_feature

# Переходим на основную ветку main
$ git checkout main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.

# Удаляем ветку new_feature
$ git branch -D new_feature
Deleted branch new_feature (was 43aa2f6).

Урок 4. Команды: git restore, git rm, git reset, git checkout, git commit, git revert

Подробнее о принципе работы, синтаксисе и вариантах использования вышеприведенных команд можно прочитать в Уроке 4 "Работа с Git: Перемещение курсора и отмена изменений. Команды git restore, git rm, git reset, git checkout, git commit, git revert.".

Задача 4.1

Дана библиотека, написанная на Python - Geometric Lib. Файловая структура данной библиотеки:
Структура репозитория geometric_lib

# Ветка main (Основная стабильная ветка)
geometric_lib
    ├── circle.py
    ├── square.py
    └── docs
         └── README.md

# Ветка develop (Ветка разработки)
geometric_lib
    ├── circle.py
    ├── square.py
    └── docs
         └── README.md
    └── calculate.py

# Ветка feature (Ветка для новых функций)
geometric_lib
    ├── circle.py
    ├── square.py
    └── docs
         └── README.md
    └── rectangle.py
В качестве задания необходимо выполнить ряд действий над репозиторием geometric_lib: изучить его структуру, откатить ненужные коммиты, объединить некоторые коммиты в один, перенести файлы из одной ветки в другую и т д.
Условие

# 1. Клонирование репозитория и знакомство с его структурой
1.1. Выполните git clone https://github.com/smartiqaorg/geometric_lib. 
Эта команда создаст директорию geometric_lib/ на вашем компьютере и скопирует наш удаленный репозиторий. 
Не забудьте перейти в эту директорию командой cd geometric_lib, когда клонирование будет завершено.

Кстати, когда вы склонируете к себе наш репозиторий, у вас будет только одна локальная ветка: main. 
Чтобы создать остальные, нужно выполнить git checkout <имя ветки>. 
Эта команда переключит вас на коммит, на который указывает удаленная ветка и создаст там локальную ветку с таким же именем. 
Эту команду нужно запустить для каждой ветки отдельно. 
То есть у вас получится два запуска: для ветки feature и ветки develop.

1.2. Постройте полный граф истории, чтобы познакомиться со структурой комитов.


# 2. Работа с веткой feature
В последнем коммите ветки feature допущена ошибка. 
Откатите этот неудачный коммит.


# 3. Работа с веткой develop
Теперь заметьте, что у нас есть два коммита в ветке develop одной и той же тематики: "L-04: Add calculate.py", "L-04: Update docs for calculate.py". 
Объедините их в один коммит и напишите к нему пояснение.


# 4. Эксперименты. Работа с файлами calculate.py и rectangle.py в ветке experiments
Ветку develop мы привели в порядок. 
Теперь давайте представим, что мы хотим протестировать совместную работу файлов calculate.py и rectangle.py. 
Чтобы не мешать работе других файлов, создадим отдельную ветку experiment, которая будет брать начало в конце ветки main. 
Новая ветка будет хранить коммиты с результатами наших экспериментов. 
Задания:

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

4.2. Мы хотим провести эксперименты с файлом calculate.py, но текущая документация (файл docs/README.md) устарела. 
Добавьте в нашу рабочую копию документацию, которая содержит информацию о файле calculate.py. 
Такая есть, например, в последнем коммите ветки develop. 
Для этого скопируйте файл docs/README.md из последнего коммита ветки develop в рабочую копию. 
Подсказка: указатель develop находится на последнем коммите ветки develop.

4.3. Добавьте в индекс и рабочую копию файл calculate.py из последнего коммита ветки develop.

4.4. Добавьте все нужные файлы в индекс и сделайте коммит.

4.5. Мы поняли, что файлы circle.py и square.py могут помешать чистоте наших экспериментов. 
Удалите их и сделайте коммит.
Решение - Git Bash
п 1. Клонируем репозиторий и активируем локальные ветки

# Клонируем репозиторий
$ git clone https://github.com/smartiqaorg/geometric_lib
Cloning into 'geometric_lib'...
remote: Enumerating objects: 25, done.
remote: Counting objects: 100% (25/25), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 25 (delta 5), reused 22 (delta 3), pack-reused 0
Receiving objects: 100% (25/25), done.
Resolving deltas: 100% (5/5), done.

# Переходим в папку репозитория
$ cd geometric_lib/

# Убеждаемся, что на текущий момент есть только одна локальная ветка - main
$ git branch --all
* main
  remotes/origin/HEAD -> origin/main
  remotes/origin/develop
  remotes/origin/feature
  remotes/origin/main

# Создаем локальную ветку develop на основе существующей удаленной develop
$ git checkout develop
Branch 'develop' set up to track remote branch 'develop' from 'origin'.
Switched to a new branch 'develop'

# Создаем локальную ветку feature на основе существующей удаленной feature
$ git checkout feature
Branch 'feature' set up to track remote branch 'feature' from 'origin'.
Switched to a new branch 'feature'

# Убеждаемся в наличии трех локальных веток: main, develop и feature
$ git branch --all
  develop
* feature
  main
  remotes/origin/HEAD -> origin/main
  remotes/origin/develop
  remotes/origin/feature
  remotes/origin/main
Решение - Git Bash
п 2. Работаем с веткой feature: откатываем коммит

# Переходим на ветку feature и смотрим список коммитов
$ git checkout feature
$ git log
commit 30494317cde4419be779c14306561e0eaa78b88b (HEAD -> feature, origin/feature)
Author: Daniil.K <dlkay@yandex.ru>
Date:   Tue Mar 30 17:36:09 2021 +0300

    L-04: Add rectangle.py

commit d078c8d9ee6155f3cb0e577d28d337b791de28e2 (origin/main, origin/HEAD, main)
Author: smartiqa <info@smartiqa.ru>
Date:   Thu Mar 4 14:55:29 2021 +0300

    L-03: Docs added

commit 8ba9aeb3cea847b63a91ac378a2a6db758682460
Author: smartiqa <info@smartiqa.ru>
Date:   Thu Mar 4 14:54:08 2021 +0300

    L-03: Circle and square added



# Откатываем последний коммит 304943
$ git revert HEAD
Removing rectangle.py
[feature d3fc1ef] Revert "L-04: Add rectangle.py"
 Committer: smartiqa <info@smartiqa.ru>
 1 file changed, 7 deletions(-)
 delete mode 100644 rectangle.py


# Убеждаемся, что появился новый revert-коммит d3fc1e, 
# Который отменяет изменения коммита 304943
$ git log
commit d3fc1ef3b872204ebac499255a1832bff5e35794 (HEAD -> feature)
Author: smartiqa <info@smartiqa.ru>
Date:   Wed Apr 7 10:44:30 2021 +0300

    Revert "L-04: Add rectangle.py"
    This reverts commit 30494317cde4419be779c14306561e0eaa78b88b.

commit 30494317cde4419be779c14306561e0eaa78b88b (origin/feature)
Author: Daniil.K <dlkay@yandex.ru>
Date:   Tue Mar 30 17:36:09 2021 +0300

    L-04: Add rectangle.py

commit d078c8d9ee6155f3cb0e577d28d337b791de28e2 (origin/main, origin/HEAD, main)
Author: smartiqa <info@smartiqa.ru>
Date:   Thu Mar 4 14:55:29 2021 +0300

    L-03: Docs added

commit 8ba9aeb3cea847b63a91ac378a2a6db758682460
Author: smartiqa <info@smartiqa.ru>
Date:   Thu Mar 4 14:54:08 2021 +0300

    L-03: Circle and square added
Решение - Git Bash
п 3. Работа с веткой develop: Объединение коммитов

# Переходим на ветку develop
$ git checkout develop
Switched to branch 'develop'
Your branch is up to date with 'origin/develop'.


# Просматриваем историю коммитов ветки develop
# Коммиты b5b0fa и d76db2 можно объединить
$ git log
commit b5b0fae727ca72c317c383b39c0af73d6adcd81c (HEAD -> develop, origin/develop)
Author: Daniil.K <dlkay@yandex.ru>
Date:   Tue Mar 30 18:02:23 2021 +0300

    L-04: Update docs for calculate.py

commit d76db2ac7f69cc920ae2e6f669fb0671a7fa7d71
Author: Daniil.K <dlkay@yandex.ru>
Date:   Tue Mar 30 17:57:42 2021 +0300

    L-04: Add calculate.py

commit 51c40ebfd0e0b65f52fe5e54740cbb038e492db3
Author: smartiqa <info@smartiqa.ru>
Date:   Fri Mar 26 14:52:26 2021 +0300

    L-04: Doc updated for triangle

commit d080c7888b81955bad2ed78d58ad910526b5132a
Author: smartiqa <info@smartiqa.ru>
Date:   Fri Mar 26 14:48:39 2021 +0300

    L-04: Triangle added


# Выполняем soft reset на два коммита назад
$ git reset --soft HEAD~2


# Убеждаемся, что последние 2 коммита исчезли из истории
$ git log
commit 51c40ebfd0e0b65f52fe5e54740cbb038e492db3 (HEAD -> develop)
Author: smartiqa <info@smartiqa.ru>
Date:   Fri Mar 26 14:52:26 2021 +0300

    L-04: Doc updated for triangle

commit d080c7888b81955bad2ed78d58ad910526b5132a
Author: smartiqa <info@smartiqa.ru>
Date:   Fri Mar 26 14:48:39 2021 +0300

    L-04: Triangle added


# Так же убеждаемся, что после ресета файлы двух последних коммитов попали в индекс
$ git status
On branch develop

Changes to be committed:
	new file:   calculate.py
	modified:   docs/README.md


# Делаем объединяющий коммит
# Параметр -c позволяет нам взять информацию о коммите из последнего коммита b5b0fa
$ git commit -c ORIG_HEAD
[develop a2e6244] L-04: Added calculate.py and updated docs
 Author: Daniil.K <dlkay@yandex.ru>
 Date: Tue Mar 30 18:02:23 2021 +0300
 Committer: smartiqa <info@smartiqa.ru>
 2 files changed, 54 insertions(+), 12 deletions(-)
 create mode 100644 calculate.py
 rewrite docs/README.md (82%)


# Убеждаемся, что в истории появился новый коммит a2e624
# Который объединяет в себе коммиты b5b0fa и d76db2
$ git log
commit a2e6244e0666f9eb536fb8d006b2edd6913176cf (HEAD -> develop)
Author: Daniil.K <dlkay@yandex.ru>
Date:   Tue Mar 30 18:02:23 2021 +0300

    L-04: Added calculate.py and updated docs

commit 51c40ebfd0e0b65f52fe5e54740cbb038e492db3
Author: smartiqa <info@smartiqa.ru>
Date:   Fri Mar 26 14:52:26 2021 +0300

    L-04: Doc updated for triangle

commit d080c7888b81955bad2ed78d58ad910526b5132a
Author: smartiqa <info@smartiqa.ru>
Date:   Fri Mar 26 14:48:39 2021 +0300

    L-04: Triangle added
Решение - Git Bash
п 4. Работа с веткой experiment: Перенос и удаление файлов

# Переходим на ветку main
$ git checkout main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.


# Создаем новую ветку experiment и переходим на нее
$ git checkout -b experiment
Switched to a new branch 'experiment'


# Копируем в рабочую директорию файл docs/README.md из последнего коммита ветки develop
$ git restore --worktree docs/README.md --source develop


# Убеждаемся, что файл README.md теперь находится в рабочей директории 
$ git status
On branch experiment
Changes not staged for commit:
	modified:   docs/README.md


# Копируем в рабочую директорию И В ИНДЕКС файл calculate.py из последнего коммита ветки develop
$ git restore --worktree --staged calculate.py --source develop


# Убеждаемся, что файл calculate.py теперь находится в индексе 
$ git status
On branch experiment
Changes to be committed:
	new file:   calculate.py

Changes not staged for commit:
	modified:   docs/README.md


# Добавляем файл README.md в индекс
# Делаем коммит проиндексированных файлов (calculate.py и README.md)
$ git add docs/README.md
$ git commit -m "L-04: Experimental commit"
[experiment 4a268a1] L-04: Experimental commit
 2 files changed, 54 insertions(+), 10 deletions(-)
 create mode 100644 calculate.py
 rewrite docs/README.md (75%)


# Удаляем из рабочей копии файлы circle.py и square.py
$ git rm circle.py square.py 
rm 'circle.py'
rm 'square.py'


# Убеждаемся, что файлы попали к индекс как “Удаленные”
$ git status
On branch experiment
Changes to be committed:
	deleted:    circle.py
	deleted:    square.py


# Делаем коммит для окончательного удаления файлов
$ git commit -m "L-04: Deleted circle and square"
[experiment af22c91] L-04: Deleted circle and square
 2 files changed, 17 deletions(-)
 delete mode 100644 circle.py
 delete mode 100644 square.py


# Убеждаемся, что файлов больше нет в рабочей копии
$ tree
.
├── calculate.py
└── docs
    └── README.md

1 directory, 2 files

Урок 5. Команды: git merge, git rebase

Подробнее о принципе работы, синтаксисе и вариантах использования вышеприведенных команд можно прочитать в Уроке 5 "Работа с Git: Слияние изменений и продвинутая работа с ветками. Команды: merge, cherry-pick, rebase".

Задача 5

Дана библиотека, написанная на Python - Geometric Lib. В качестве задания необходимо выполнить ряд действий над репозиторием geometric_lib. Файловая структура данной библиотеки:
Структура репозитория geometric_lib

# Ветка main (Основная стабильная ветка)
geometric_lib
    ├── circle.py
    ├── square.py
    └── docs
         └── README.md

# Ветка develop (Ветка разработки)
geometric_lib
    ├── circle.py
    ├── square.py
    └── docs
         └── README.md
    └── calculate.py

# Ветка release
geometric_lib
    ├── circle.py
    ├── square.py
    └── docs
         └── README.md
    └── user_agreement.txt
Условие

# 5.1. Клонирование репозитория и знакомство с его структурой
5.1.1. Выполните git clone https://github.com/smartiqaorg/geometric_lib.git. 
Эта команда  создаст директорию geometric_lib/ на вашем компьютере и скопирует наш удаленный репозиторий к вам на компьютер. 
Не забудьте перейти в эту директорию командой cd geometric_lib, когда клонирование будет завершено.
Кстати когда вы склонируете к себе наш репозиторий, у вас будет только одна локальная ветка: main. 
Чтобы создать остальные, нужно выполнить git checkout <имя ветки>. 
Эта команда переключит вас на коммит, на который указывает удаленная ветка и создаст там локальную ветку с таким же именем. 
Эту команду нужно запустить для каждой ветки отдельно. 
То есть у вас получится два запуска: для ветки release и ветки develop (ветка feature нам сегодня не потребуется).
5.1.2. Теперь постройте полный граф истории, чтобы познакомиться со структурой коммитов.


# 5.2. Работа с веткой develop
5.2.1. Влейте ветку develop в ветку main явным образом (с созданием merge-коммита).
5.2.2. Удалите коммит слияния, чтобы затем выполнить слияние в fast-forward режиме.
5.2.3. Влейте ветку develop в ветку main неявным образом (без создания merge-коммита - в режиме fast-forward).

# 5.3. Работа с веткой release
5.3.1. Выполните интерактивный ребейз ветки release на ветку main - объедините все коммиты в один и поменяйте их общее сообщение. 
Разрешите конфликты.
5.3.2. Выполните fast-forward слияние ветки release в ветку main.

Решение 5.1. Клонирование репозитория и знакомство с его структурой

5.1. Клонирование репозитория и знакомство с его структурой - Команды

# 1. Клонируем репозиторий
$ git clone https://github.com/smartiqaorg/geometric_lib.git
Cloning into 'geometric_lib'...
remote: Enumerating objects: 25, done.
remote: Counting objects: 100% (25/25), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 25 (delta 5), reused 21 (delta 3), pack-reused 0
Receiving objects: 100% (25/25), done.
Resolving deltas: 100% (5/5), done.

# 2. Переходим в папку репозитория
$ cd geometric_lib/

# 3. Последовательно переходим по веткам develop и release
# Это позволяет получить локальные копии remote веток develop и release
$ git merge develop --no-ff
$ git checkout develop
Branch 'develop' set up to track remote branch 'develop' from 'origin'.
Switched to a new branch 'develop'
$ git checkout release
Branch 'release' set up to track remote branch 'release' from 'origin'.
Switched to a new branch 'release'

# 4. Перед нами структура репозитория: 4 ветки - release, feature, develop, main
# Обратите внимание, что в данном уроке ветка feature не задействуется
$ git log --all --pretty=oneline --graph
* 86edb1c3dd57fa9abc7ba2ec7052507938084727 (origin/release) L-05: Update Docs. Add user agreement info
* 438b89a1dfc58d90e9036fe431771427965cd1ff L-05: Add user agreement
* 6adb96248a4d00d3bea13bd95d78ef52352cd1b4 L-03: Docs added
| * 30494317cde4419be779c14306561e0eaa78b88b (origin/feature) L-04: Add rectangle.py
| | * b5b0fae727ca72c317c383b39c0af73d6adcd81c (origin/develop) L-04: Update docs for calculate.py
| | * d76db2ac7f69cc920ae2e6f669fb0671a7fa7d71 L-04: Add calculate.py
| | * 51c40ebfd0e0b65f52fe5e54740cbb038e492db3 L-04: Doc updated for triangle
| | * d080c7888b81955bad2ed78d58ad910526b5132a L-04: Triangle added
| |/  
| * d078c8d9ee6155f3cb0e577d28d337b791de28e2 (HEAD -> main, origin/main, origin/HEAD) L-03: Docs added
|/  
* 8ba9aeb3cea847b63a91ac378a2a6db758682460 L-03: Circle and square added

Решение 5.2. Работа с веткой develop

Далее сделаем мердж ветки develop в ветку main двумя способами:
  1. В no-fast-forward режиме (явное слияние, создается дополнительный merge-коммит)
  2. В fast-forward режиме (неявное слияние, дополнительные коммиты не создаются)

5.2.1. Явное слияние
5.2.1. Явное слияние (мердж ветки develop в ветку main в no-ff режиме) - Структура

# ----- Начальное состояние ------

# Структура веток
main            (1) -- (2)
develop                  \ -- (3) -- (4) -- (5) -- (6)

# Коммиты ветки main
(2) commit d078c8 L-03: Docs added
(1) commit 8ba9ae L-03: Circle and square added

# Коммиты ветки develop
(6) commit b5b0fa L-04: Update docs for calculate.py
(5) commit d76db2 L-04: Add calculate.py
(4) commit 51c40e L-04: Doc updated for triangle
(3) commit d080c7 L-04: Triangle added
(2) commit d078c8 L-03: Docs added
(1) commit 8ba9ae L-03: Circle and square added

# ----- После мерджа в no-ff режиме ------

# Структура веток
main            (1) -- (2) ----------------------------- (7)
develop                  \ -- (3) -- (4) -- (5) -- (6) -- /

# Коммиты ветки main
(7) commit fc6ee2 Merge branch 'develop'
(6) commit b5b0fa L-04: Update docs for calculate.py
(5) commit d76db2 L-04: Add calculate.py
(4) commit 51c40e L-04: Doc updated for triangle
(3) commit d080c7 L-04: Triangle added
(2) commit d078c8 L-03: Docs added
(1) commit 8ba9ae L-03: Circle and square added

# Коммиты ветки develop
(6) commit b5b0fa L-04: Update docs for calculate.py
(5) commit d76db2 L-04: Add calculate.py
(4) commit 51c40e L-04: Doc updated for triangle
(3) commit d080c7 L-04: Triangle added
(2) commit d078c8 L-03: Docs added
(1) commit 8ba9ae L-03: Circle and square added
5.2.1. Явное слияние (мердж ветки develop в ветку main в no-ff режиме) - Команды

# 1. Возвращаемся на ветку main
$ git checkout main
Switched to branch 'main'
Your branch is up to date with 'origin/main'.

# 2. Вливаем ветку develop в ветку main в --no-ff режиме (мердж с дополнительным коммитом)
$ git merge develop --no-ff
Merge made by the 'recursive' strategy.
 calculate.py   | 33 +++++++++++++++++++++++++++++++++
 docs/README.md | 23 +++++++++++++++++------
 triangle.py    |  6 ++++++
 3 files changed, 56 insertions(+), 6 deletions(-)
 create mode 100644 calculate.py
 create mode 100644 triangle.py
 
# 3. После мерджа получили дополнительный коммит fc6ee2
$ git log --all --pretty=oneline --graph
*   fc6ee242c15cadbb5197c918f959cd3ba52553a4 (HEAD -> main) Merge branch 'develop'
|\  
| * b5b0fae727ca72c317c383b39c0af73d6adcd81c (origin/develop, develop) L-04: Update docs for calculate.py
| * d76db2ac7f69cc920ae2e6f669fb0671a7fa7d71 L-04: Add calculate.py
| * 51c40ebfd0e0b65f52fe5e54740cbb038e492db3 L-04: Doc updated for triangle
| * d080c7888b81955bad2ed78d58ad910526b5132a L-04: Triangle added
|/  
| * 86edb1c3dd57fa9abc7ba2ec7052507938084727 (origin/release, release) L-05: Update Docs. Add user agreement info
| * 438b89a1dfc58d90e9036fe431771427965cd1ff L-05: Add user agreement
| * 6adb96248a4d00d3bea13bd95d78ef52352cd1b4 L-03: Docs added
| | * 30494317cde4419be779c14306561e0eaa78b88b (origin/feature) L-04: Add rectangle.py
| |/  
|/|   
* | d078c8d9ee6155f3cb0e577d28d337b791de28e2 (origin/main, origin/HEAD) L-03: Docs added
|/  
* 8ba9aeb3cea847b63a91ac378a2a6db758682460 L-03: Circle and square added
5.2.2. Неявное слияние
5.2.2. Неявное слияние (мердж ветки develop в ветку main в fast-forward режиме) - Структура

# ----- Начальное состояние ------

# Структура веток
main            (1) -- (2)
develop                  \ -- (3) -- (4) -- (5) -- (6)

# Коммиты ветки main
(2) commit d078c8 L-03: Docs added
(1) commit 8ba9ae L-03: Circle and square added

# Коммиты ветки develop
(6) commit b5b0fa L-04: Update docs for calculate.py
(5) commit d76db2 L-04: Add calculate.py
(4) commit 51c40e L-04: Doc updated for triangle
(3) commit d080c7 L-04: Triangle added
(2) commit d078c8 L-03: Docs added
(1) commit 8ba9ae L-03: Circle and square added

# ----- После мерджа в fast-forward режиме ------

# Структура веток
main / develop      (1) -- (2) -- (3) -- (4) -- (5) -- (6) 
               

# Коммиты ветки main
(6) commit b5b0fa L-04: Update docs for calculate.py
(5) commit d76db2 L-04: Add calculate.py
(4) commit 51c40e L-04: Doc updated for triangle
(3) commit d080c7 L-04: Triangle added
(2) commit d078c8 L-03: Docs added
(1) commit 8ba9ae L-03: Circle and square added

# Коммиты ветки develop
(6) commit b5b0fa L-04: Update docs for calculate.py
(5) commit d76db2 L-04: Add calculate.py
(4) commit 51c40e L-04: Doc updated for triangle
(3) commit d080c7 L-04: Triangle added
(2) commit d078c8 L-03: Docs added
(1) commit 8ba9ae L-03: Circle and square added
5.2.2. Неявное слияние (мердж ветки develop в ветку main в fast-forward режиме) - Команды

# 1. Удаляем коммит, полученный в предыдущем задании
$ git reset --hard HEAD^
HEAD is now at d078c8d L-03: Docs added

# 2. Репозиторий вернулся к изначальному состоянию
$ git log --all --pretty=oneline --graph
* 86edb1c3dd57fa9abc7ba2ec7052507938084727 (origin/release, release) L-05: Update Docs. Add user agreement info
* 438b89a1dfc58d90e9036fe431771427965cd1ff L-05: Add user agreement
* 6adb96248a4d00d3bea13bd95d78ef52352cd1b4 L-03: Docs added
| * 30494317cde4419be779c14306561e0eaa78b88b (origin/feature) L-04: Add rectangle.py
| | * b5b0fae727ca72c317c383b39c0af73d6adcd81c (origin/develop, develop) L-04: Update docs for calculate.py
| | * d76db2ac7f69cc920ae2e6f669fb0671a7fa7d71 L-04: Add calculate.py
| | * 51c40ebfd0e0b65f52fe5e54740cbb038e492db3 L-04: Doc updated for triangle
| | * d080c7888b81955bad2ed78d58ad910526b5132a L-04: Triangle added
| |/  
| * d078c8d9ee6155f3cb0e577d28d337b791de28e2 (HEAD -> main, origin/main, origin/HEAD) L-03: Docs added
|/  
* 8ba9aeb3cea847b63a91ac378a2a6db758682460 L-03: Circle and square added

# 3. Вливаем ветку develop в main в ff-режиме (перемотка без дополнительного коммита)
$ git merge develop --ff
Updating d078c8d..b5b0fae
Fast-forward
 calculate.py   | 33 +++++++++++++++++++++++++++++++++
 docs/README.md | 23 +++++++++++++++++------
 triangle.py    |  6 ++++++
 3 files changed, 56 insertions(+), 6 deletions(-)
 create mode 100644 calculate.py
 create mode 100644 triangle.py
 
# 4. После мерджа ветки main и develop находятся на уровне одного коммита b5b0fa
$ git log --all --pretty=oneline --graph
* 86edb1c3dd57fa9abc7ba2ec7052507938084727 (origin/release, release) L-05: Update Docs. Add user agreement info
* 438b89a1dfc58d90e9036fe431771427965cd1ff L-05: Add user agreement
* 6adb96248a4d00d3bea13bd95d78ef52352cd1b4 L-03: Docs added
| * 30494317cde4419be779c14306561e0eaa78b88b (origin/feature) L-04: Add rectangle.py
| | * b5b0fae727ca72c317c383b39c0af73d6adcd81c (HEAD -> main, origin/develop, develop) L-04: Update docs for calculate.py
| | * d76db2ac7f69cc920ae2e6f669fb0671a7fa7d71 L-04: Add calculate.py
| | * 51c40ebfd0e0b65f52fe5e54740cbb038e492db3 L-04: Doc updated for triangle
| | * d080c7888b81955bad2ed78d58ad910526b5132a L-04: Triangle added
| |/  
| * d078c8d9ee6155f3cb0e577d28d337b791de28e2 (origin/main, origin/HEAD) L-03: Docs added
|/  
* 8ba9aeb3cea847b63a91ac378a2a6db758682460 L-03: Circle and square added

5.3. Работа с веткой release

В предыдущем задании мы вливали ветку develop в ветку main. Аналогично в текущем задании в ветку main мы попробуем влить ветку release.

И конечно мы бы хотели влить release в main в fast-forward режиме, однако сразу сделать этого мы не можем, поскольку с момента ответвления release в ветке main появилось несколько новых коммитов (мы как раз влили их из ветки develop в предыдущем задании).

Ваша задача – выполнить интерактивный ребейз ветки release на ветку main. Объедините все коммиты в один и поменяйте его сообщение на "L-05: Release commit. Add user agreement and update docs". Во время ребейза вы столкнетесь с конфликтами - разрешите их с помощью meld (или любой другой утилиты для разрешения мердж-конфликтов).

И уже после того, как ребейз будет успешно выполнен, влейте ветку release в main в fast-forward режиме.

5.3.1. Ребейз ветки release относительно main
5.3.1. Ребейз ветки release относительно ветки main - структура

# ----- Начальное состояние ------

# Структура веток
main          (1) -- (2) -- (3) -- (4) -- (5) -- (6)
release                 \ ------------------------------- (7) -- (8)

# Коммиты ветки main ДО ребейза
(6) commit b5b0fa L-04: Update docs for calculate.py
(5) commit d76db2 L-04: Add calculate.py
(4) commit 51c40e L-04: Doc updated for triangle
(3) commit d080c7 L-04: Triangle added
(2) commit d078c8 L-03: Docs added
(1) commit 8ba9ae L-03: Circle and square added

# Коммиты ветки release ДО ребейза
(8) commit 86edb1 L-05: Update Docs. Add user agreement info (Этот коммит будет слит в один общий)
(7) commit 438b89 L-05: Add user agreement (Этот коммит будет слит в один общий)
(2) commit d078c8 L-03: Docs added
(1) commit 8ba9ae L-03: Circle and square added

# ----- После ребейза ------

# Структура веток
main         (1) -- (2) -- (3) -- (4) -- (5) -- (6)
release                                           \ -- (9)

# Коммиты ветки main ПОСЛЕ ребейза
(6) commit b5b0fa L-04: Update docs for calculate.py
(5) commit d76db2 L-04: Add calculate.py
(4) commit 51c40e L-04: Doc updated for triangle
(3) commit d080c7 L-04: Triangle added
(2) commit d078c8 L-03: Docs added
(1) commit 8ba9ae L-03: Circle and square added

# Коммиты ветки release ПОСЛЕ ребейза
(9) commit 34d1f3 L-05: Add user agreement (объединенный коммит)
(6) commit b5b0fa L-04: Update docs for calculate.py
(5) commit d76db2 L-04: Add calculate.py
(4) commit 51c40e L-04: Doc updated for triangle
(3) commit d080c7 L-04: Triangle added
(2) commit d078c8 L-03: Docs added
(1) commit 8ba9ae L-03: Circle and square added
5.3.1. Ребейз ветки release относительно ветки main - команды

# 1. Попросим Git выводить базу слияния при просмотре конфликта
$ git config merge.conflictstyle diff3

# 2. Установим meld в качестве тулзы для разрешения конфликтов
# Обратите внимание, что meld должен быть предварительно установлен в системе
$ git config --global merge.tool meld

# 3. Перейдм на ветку release
$ git checkout release 
Switched to branch 'release'
Your branch is up to date with 'origin/release'.

# 4. Выполняем интерактивный ребейз ветки release относительно main
$ git rebase -i main

# 5. В открывшемся окне редактора указываем, что хотим слить два коммита в один
# ------------- .git/rebase-merge/git-rebase-todo
# pick 438b89a L-05: Add user agreement
# squash 86edb1c L-05: Update Docs. Add user agreement info
# 
#  Rebase b5b0fae..86edb1c onto b5b0fae (2 commands)
# 
#  Commands:
...
# 
#  However, if you remove everything, the rebase will be aborted.
# 
#  ------------- 
# Сохраняем введенные изменения и выходим 
# (для редактора nano последовательно жмем Ctrl + X, затем Y, и, наконец, Enter).

# 6. У нас возникает конфликт в коммите (7) 438b89a в файле docs/README.md
Auto-merging docs/README.md
CONFLICT (content): Merge conflict in docs/README.md
error: could not apply 438b89a... L-05: Add user agreement
Resolve all conflicts manually, mark them as resolved with
Could not apply 438b89a... L-05: Add user agreement

# 7. Разрешаем конфликт
$ git mergetool

# 8. Открывается meld. В первом окне - содержимое ветки main (LOCAL), 
# в третьем - содержимое ветки release (REMOTE). 
# Второе окно (посередине) - результат слияния.

# 9. Финальное содержимое конфликтного файла README.md
# ------------
# How to use calculator:
1. Run `python calculate.py`
2. Enter the figure name. Available are Circle, Square.
3. Enter the function: Area or Perimeter.
4. Enter figure sizes. Radius for circle, one side for square.
5. Get the answer!

# Math formulas
## Area
- Circle: `S = πR²`
- Rectangle: `S = ab`
- Square: `S = a²`
- Triangle: `S = sqrt(p * (p-a) * (p-b) * (p-c))` where p is semiperimeter

## Perimeter
- Circle: `P = 2πR`
- Rectangle: `P = 2a + 2b`
- Square: `P = 4a`
- Triangle: `P = a + b + c`
# ------------

# 10. Сохраняем изменения в meld

# 11. Продолжаем ребейз - переходим к коммиту (8) commit 86edb1 L-05: Update Docs. Add user agreement info.  
$ git rebase --continue
 
# 12. Сохраняем содержимое открывшегося файла с имененем коммита.

# 13. Снова конфликт. Разрешаем его.
$ git mergetool




# 14. Финальное содержимое конфликтного файла README.md
# --------------
# How to use calculator:
1. Run `python calculate.py`
2. Enter the figure name. Available are Circle, Square.
3. Enter the function: Area or Perimeter.
4. Enter figure sizes. Radius for circle, one side for square.
5. Get the answer!

# User agreement 

Please check out License Agreement for personal usage terms and limitations

---

# Math formulas
## Area
- Circle: `S = πR²`
- Rectangle: `S = ab`
- Square: `S = a²`
- Triangle: `S = sqrt(p * (p-a) * (p-b) * (p-c))` where p is semiperimeter

## Perimeter
- Circle: `P = 2πR`
- Rectangle: `P = 2a + 2b`
- Square: `P = 4a`
- Triangle: `P = a + b + c`
# --------------

# 15. Сохраняем изменения в meld

# 16. Продолжаем ребейз 
$ git rebase --continue
 
# 17. На этот раз все успешно. Изменяем и сохраняем имя для нового (объединенного коммита):
# -------------
# This is a combination of 2 commits.
# This is the 1st commit message:
L-05: Add user agreement
# This is the commit message #2:
L-05: Update Docs. Add user agreement info
# Please enter the commit message for your changes. Lines starting
...
# --------------

# Заменяем на
# -------------
L-05: Update Docs. Add user agreement info
# Please enter the commit message for your changes. Lines starting
...
# --------------

# 18. Закрываем-сохраняем (Ctrl + X -> Y -> Enter)
Successfully rebased and updated refs/heads/release.

# 19. Теперь ветка release ответвляется от ветки main на уровне коммита b5b0fae
# Далее идет объединенный коммит 34d1f3 (вместо 86edb1 и 438b89)
$ git log --all --pretty=oneline --graph
* 34d1f378b040e2d51655b24cafd9dd4c5c6c0e3d (HEAD -> release) L-05: Add user agreement
* b5b0fae727ca72c317c383b39c0af73d6adcd81c (origin/develop, main, develop) L-04: Update docs for calculate.py
* d76db2ac7f69cc920ae2e6f669fb0671a7fa7d71 L-04: Add calculate.py
* 51c40ebfd0e0b65f52fe5e54740cbb038e492db3 L-04: Doc updated for triangle
* d080c7888b81955bad2ed78d58ad910526b5132a L-04: Triangle added
| * 30494317cde4419be779c14306561e0eaa78b88b (origin/feature) L-04: Add rectangle.py  
|/  
* 8ba9aeb3cea847b63a91ac378a2a6db758682460 L-03: Circle and square added




Теперь, когда ребейз успешно выполнен, вливаем ветку release в main в fast-forward режиме.

5.3.2. Мердж ветки release в main
5.3.2. Вливание ветки release в ветку main - структура

# ----- Начальное состояние ------

# Структура веток
main         (1) -- (2) -- (3) -- (4) -- (5) -- (6)
release                                           \ -- (9)

# Коммиты ветки main ДО мерджа
(6) commit b5b0fa L-04: Update docs for calculate.py
(5) commit d76db2 L-04: Add calculate.py
(4) commit 51c40e L-04: Doc updated for triangle
(3) commit d080c7 L-04: Triangle added
(2) commit d078c8 L-03: Docs added
(1) commit 8ba9ae L-03: Circle and square added

# Коммиты ветки release ДО мерджа
(9) commit 34d1f3 L-05: Add user agreement (объединенный коммит)
(6) commit b5b0fa L-04: Update docs for calculate.py
(5) commit d76db2 L-04: Add calculate.py
(4) commit 51c40e L-04: Doc updated for triangle
(3) commit d080c7 L-04: Triangle added
(2) commit d078c8 L-03: Docs added
(1) commit 8ba9ae L-03: Circle and square added

# ----- После мерджа ------

# Структура веток
main / release         (1) -- (2) -- (3) -- (4) -- (5) -- (6) -- (9)

# Коммиты веток main и release ПОСЛЕ мерджа
(9) commit 34d1f3 L-05: Add user agreement (объединенный коммит)
(6) commit b5b0fa L-04: Update docs for calculate.py
(5) commit d76db2 L-04: Add calculate.py
(4) commit 51c40e L-04: Doc updated for triangle
(3) commit d080c7 L-04: Triangle added
(2) commit d078c8 L-03: Docs added
(1) commit 8ba9ae L-03: Circle and square added
5.3.2. Вливание ветки release в ветку main - команды

# 1. Переключаемся на ветку main
$ git checkout main 

# 2. Выполняем fast-forward мердж ветки release в ветку main
$ git merge release --ff
Updating b5b0fae..34d1f37
Fast-forward
 docs/README.md     |  6 ++++++
 user_agreement.txt | 14 ++++++++++++++
 2 files changed, 20 insertions(+)
 create mode 100644 user_agreement.txt
 
# 3. Финальное состояние веток
# После слияния обе ветки main и release указывают на один коммит последний коммит 34d1f3
$ git log --pretty=oneline --graph
* 34d1f378b040e2d51655b24cafd9dd4c5c6c0e3d (HEAD -> main, release) L-05: Add user agreement
* b5b0fae727ca72c317c383b39c0af73d6adcd81c (origin/develop, develop) L-04: Update docs for calculate.py
* d76db2ac7f69cc920ae2e6f669fb0671a7fa7d71 L-04: Add calculate.py
* 51c40ebfd0e0b65f52fe5e54740cbb038e492db3 L-04: Doc updated for triangle
* d080c7888b81955bad2ed78d58ad910526b5132a L-04: Triangle added
* d078c8d9ee6155f3cb0e577d28d337b791de28e2 (origin/main, origin/HEAD) L-03: Docs added
* 8ba9aeb3cea847b63a91ac378a2a6db758682460 L-03: Circle and square added

Урок 6.
Команды: git clone, git fetch, git push, git pull

Подробнее о принципе работы, синтаксисе и вариантах использования вышеприведенных команд можно прочитать в Уроке 6 "Работа с удаленным репозиторием. Модель ветвления. Команды: clone, fetch, push, pull.".

Задача 6

Дана библиотека, написанная на Python - Geometric Lib. В качестве задания необходимо выполнить ряд действий над репозиторием geometric_lib. Файловая структура данной библиотеки:
Структура репозитория geometric_lib

# Ветка main (Основная стабильная ветка)
geometric_lib
    ├── circle.py
    ├── square.py
    └── docs
         └── README.md

# Ветка develop (Ветка разработки)
geometric_lib
    ├── circle.py
    ├── square.py
    └── docs
         └── README.md
    └── calculate.py

# Ветка release
geometric_lib
    ├── circle.py
    ├── square.py
    └── docs
         └── README.md
    └── user_agreement.txt
Условие

1. Зарегистрируйтесь на GitHub и подтвердите свою почту.

2. Настройте SSH или HTTPS подключение (на ваш выбор). Мы будем работать по HTTPS.

3. Теперь перейдите на страницу https://github.com/smartiqaorg/geometric_lib/ и создайте свой форк.

4. Склонируйте к себе свой форк репозитория geometric_lib.

5. Настройте локального пользователя Git

6. Измените файл docs/README.md. Сделайте коммит.

7. Выполните пуш ваших изменений в свой удаленный репозиторий. Заметьте, что вам не нужно добавлять удаленный репозиторий: он уже был добавлен под именем origin во время клонирования.

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

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

Решение 1. Регистрация на GitHub

Регистрация на GitHub

Решение 2. Настройка HTTPS подключения

GitHub. Settings.
2.1. Переходим в Settings
GitHub. Settings.
2.2. Переходим в Developer Settings
2.3. Генерируем персональный токен
2.3. Генерируем персональный токен
GitHub. Запоминаем токен
2.4. Запоминаем токен

Решение 3. Создаем свой форк на GitHub

GitHub. Форкаем репозиторий geometric_lib
3.1. Форкаем репозиторий geometric_lib
GitHub. Копируем ссылку на репозиторий geometric_lib
3.2. Копируем ссылку на репозиторий geometric_lib
GitHub. Форкаем репозиторий geometric_lib
3.2. Копируем ссылку на репозиторий geometric_lib

Решение 4. Клонируем к себе свой форк репозитория geometric_lib

4. Клонируем форк репозитория geometric_lib

# Клонируем репозиторий
$ git clone https://github.com/smartiqa-git-course-user/geometric_lib.git
Cloning into 'geometric_lib'...
remote: Enumerating objects: 35, done.
remote: Counting objects: 100% (35/35), done.
remote: Compressing objects: 100% (25/25), done.
remote: Total 35 (delta 9), reused 27 (delta 5), pack-reused 0
Receiving objects: 100% (35/35), 4.25 KiB | 871.00 KiB/s, done.
Resolving deltas: 100% (9/9), done.

# Переходим в папку репозитория
$ cd geometric_lib/

# Смотрим, какие ветки есть в репозитории geometric_lib
$ git branch --all
* main
  remotes/origin/HEAD -> origin/main
  remotes/origin/develop
  remotes/origin/feature
  remotes/origin/main
  remotes/origin/release

Решение 5. Настраиваем локального пользователя Git

Решение 5. Настраиваем локального пользователя Git

git config --local user.name "Smartiqa Git Course User"
git config --local user.email smartiqa.test@mail.ru

Решение 6. Меняем файл docs/README.md. Делаем коммит.

Решение 6. Меняем файл docs/README.md. Делаем коммит.

<! -- 1. Вносим изменения в файл docs/README.md -->
$ nano docs/README.md

# Math formulas
## Area
- Circle: S = πR²
- Rectangle: S = ab
- Square: S = a²

## Perimeter
- Circle: P = 2πR
- Rectangle: P = 2a + 2b
- Square: P = 4a

# Some change for Lesson 6 practice


<! -- 2. Смотрим текущее состояние репозитория  -->
$ git status
On branch main
Your branch is up to date with 'origin/main'.
Changes to be committed:
	modified:   docs/README.md
  

<! -- 3. Добавляем измененный файл в область Индекса  -->
$ git add docs/


<! -- 4. Делаем коммит  -->
$ git commit -m "G-06: README change for practice"
[main 6ebf072] G-06: README change for practice
 1 file changed, 3 insertions(+), 1 deletion(-)
 

<! -- 5. Смотрим список коммитов  -->
 $ git log
commit 6ebf0727741af6f30a9962ad6790f5acdb3e7582 (HEAD -> main)
Author: Smartiqa Git Course User <smartiqa.test@mail.ru>
Date:   Sun Nov 14 16:24:54 2021 +0300

    G-06: README change for practice

commit d078c8d9ee6155f3cb0e577d28d337b791de28e2 (origin/main, origin/HEAD)
Author: smartiqa <info@smartiqa.ru>
Date:   Thu Mar 4 14:55:29 2021 +0300

    L-03: Docs added

commit 8ba9aeb3cea847b63a91ac378a2a6db758682460
Author: smartiqa <info@smartiqa.ru>
Date:   Thu Mar 4 14:54:08 2021 +0300

    L-03: Circle and square added

Решение 7. Выполняем пуш изменений в удаленный репозиторий.

Решение 7. Выполняем пуш изменений в удаленный репозиторий.

# После запуска данной команды Git попросит ввести имя пользователя и пароль. 
# Введите имя своего пользователя на GitHub (мы создали пользователя в п.1), 
# а в качестве пароля введите ваш персональный токен (скопировали его в п 2.4)
$ git push origin main
Username for 'https://github.com': smartiqa-git-course-user
Password for 'https://smartiqa-git-course-user@github.com': ghp_SUfWjLXCKBKO3akLsJVtUT...F61OMhfs
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 452 bytes | 452.00 KiB/s, done.
Total 4 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/smartiqa-git-course-user/geometric_lib.git
   d078c8d..6ebf072  main -> main

Решение 8. Смотрим историю коммитов на главной странице репозитория.

GitHub. Смотрим историю коммитов
8.1. Смотрим историю коммитов
GitHub. Изменения попали в форкнутый репозиторий
8.2. Изменения попали в форкнутый репозиторий

Решение 9. Создаем пулл-реквест

GitHub. Переходим к созданию Pull Request
9.1. Переходим к созданию Pull Request
GitHub. Выбираем ветку main в обоих репозиториях. Проверяем, что изменения верные.
9.2-9.4. Выбираем ветку main в обоих репозиториях. Проверяем, что изменения верные.
GitHub. Пишем название Pull Request и завершаем его создание.
9.5. Пишем название Pull Request и завершаем его создание.
Как вам материал?

Также может быть интересно