wild_animals
├── index.html
└── pictures
├── elephant.jpg
├── giraffe.jpg
└── paw_print.jpg
<!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>
pictures
├── elephant.jpg
├── giraffe.jpg
└── paw_print.jpg
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) Сделайте коммит
# Переходим в директорию будущего репозитория
$ 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 для текущего репозитория
$ 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
# Файл .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 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
# Правим опечатку в файле 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
# Добавляем блок информации о кенгуру в 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
mat_lib
├─docs
│ └─math_lib_docs.txt
│
└─pyfiles
└─factorial.py
└─test.py
└─trigonometry.py
This is the library which designation is to implement some math functions
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
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)
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 init
Initialized empty Git repository in C:/Users/DKay7/Desktop/mat_lib/.git/
# Чтобы задать имя пользователя глобально,
# нужно воспользоваться утилитой 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
# Посмотрим, на что указывает 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 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 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.
# Примечание: Если у вас на компьютере не установлен интерпретатор 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__/” с файлами кэша.
# Убедимся, что появились новые файлы:
$ 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
# Все так, как мы и ожидали!
geometric_lib
├── circle.py
├── square.py
└── docs
└── README.md
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 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 checkout -b new_feature
Switched to a new branch 'new_feature'
# Создаем файл 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
# Создаем файл 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 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
# Смотрим изменения между предпоследним и последним коммитами
# Как видим, были изменения в файле 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
# Переходим на основную ветку 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).
# Ветка 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
# 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 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
# Переходим на ветку 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
# Переходим на ветку 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
# Переходим на ветку 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
# Ветка 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.
# 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
# ----- Начальное состояние ------
# Структура веток
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
# 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
# ----- Начальное состояние ------
# Структура веток
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
# 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
# ----- Начальное состояние ------
# Структура веток
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
# 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
# ----- Начальное состояние ------
# Структура веток
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
# 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
# Ветка 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. Создайте пулл-реквест. В нем подробно опишите внесенные изменения. На странице предпросмотра пулл-реквеста проверьте, что вы не затронули файлы на других ветках и еще раз перепроверьте код
# Клонируем репозиторий
$ 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
git config --local user.name "Smartiqa Git Course User"
git config --local user.email smartiqa.test@mail.ru
<! -- 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
# После запуска данной команды 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