Отчет по лабораторной работе № 2 "Система контроля версий Git"

Выполнил: Подловченко Д. Д.
Группа:   А-01-24
Проверил: Козлюк Д. А.

Примечание: работа выполнялась на Windows.


1. Создал на рабочем столе каталог lab02 и запустил в нем Git Bash, приглашение:

Admin@zhi-es MINGW64 ~/Desktop/lab02
$


2. Просмотрел файлы в рабочем каталоге командой "ls" --- пусто:

Admin@zhi-es MINGW64 ~/Desktop/lab02
$ ls

Admin@zhi-es MINGW64 ~/Desktop/lab02
$


3. Создал каталоги Алисы и Боба, создал каталог "project",
изучил команду "cd" в процессе:

Admin@zhi-es MINGW64 ~/Desktop/lab02
$ mkdir alice
mkdir bob

Admin@zhi-es MINGW64 ~/Desktop/lab02
$ cd alice

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice
$ mkdir project

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice
$ cd project

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project
$ cd ..

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice
$ cd project

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project
$


4. Инициализировал репозитарий:

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project
$ git init
Initialized empty Git repository in C:/Users/Admin/Desktop/lab02/alice/project/.git/

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project (master)
$

сообщение-подсказку, строки которого начинаются с hint: не выдало, 
поэтому менять название на main буду позже 


5. Настроил репозитарий Алисы, чтобы коммиты были от ее имени:

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project (master)
$ git config user.name 'Alice (PodlovchenkoDD)'

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project (master)
$ git config user.email 'PodlovchenkoDD@mpei.ru'

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project (master)
$


6. Запустил CodeBlocks и создал проект в репозитарии Алисы,
   Resulting filename: "C:\Users\Admin\Desktop\lab02\alice\project\project.cbp",
   Собрал проект и на этом этапе структура файлов следующая:
	lab02
	├── alice
	│   └── project  <--------- текущий рабочий каталог
	│       ├── .git <--------- создан командой "git init"
	│       ├── bin  <--------- создан CodeBlocks при сборке
	│       ├── obj  <--------- (то же самое)
	│       ├── main.cpp    <-- код программы
	│       └── project.cbp <-- файл проекта
	└── bob


7. Вернувшись в Git Bash, просмотрел состояние рабочей копии:

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project (master)
$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        bin/
        main.cpp
        obj/
        project.cbp

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

Данные строки показывают, что пока не существует коммитов и есть не отслеживаемые файлы,
которые пока не индексированы.

8. Начинаю отслеживать "main.cpp", добавляя файл в индекс и 
   выполняю коммит с файлом main.cpp и коротким сообщением::

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project (master)
$ git add main.cpp
Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project (master)
$ git commit -m 'code: заготовка программы'
[master (root-commit) 814a45e] code: заготовка программы
 1 file changed, 9 insertions(+)
 create mode 100644 main.cpp

9. Заменил тело функции main() на ввод двух чисел, пересобрал и 
   увидел различие: 

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project (master)
$ git status
On branch master
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:   main.cpp

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        bin/
        obj/
        project.cbp

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

Появилось уведомление, что "main.cpp" модифицировался и просит использовать другую команду,
чтобы занести изменения в репозиторий


10. Занёс все нужные файлы в .gitignore и закоммитил его с заголовком "git":

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project (master)
$ git add .gitignore

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project (master)
$ git commit -m "git"
[master 79acfbc] git
 1 file changed, 3 insertions(+)
 create mode 100644 .gitignore

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project (master)
$


11. Попробовав все вариации команд git log, в частности git log --stat:	

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project (master)
$ git log --stat
commit 79acfbc5460e6b1320fef4b339237d0d7eb775a4 (HEAD -> master)
Author: Alice (PodlovchenkoDD) <PodlovchenkoDD@mpei.ru>
Date:   Sun Mar 23 19:24:08 2025 +0300

    git

 .gitignore | 3 +++
 1 file changed, 3 insertions(+)

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project (master)
$

команда выводит хэш коммита -> автора -> дату -> содержимое коммита ->
-> название и количество затронутых файлов


12. Посмотрел предпоследний коммит с помощью команды git show HEAD~1:

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project (master)
$ git show HEAD~1
commit 814a45e6ab5c823aea95d0b93aae7481724b71e9
Author: Alice (PodlovchenkoDD) <PodlovchenkoDD@mpei.ru>
Date:   Sun Mar 23 18:16:06 2025 +0300

    code: заготовка программы

diff --git a/main.cpp b/main.cpp
new file mode 100644
index 0000000..b4392ec
--- /dev/null
+++ b/main.cpp
@@ -0,0 +1,9 @@
+#include <iostream>
+
+using namespace std;
+
+int main()
+{
+    cout << "Hello world!" << endl;
+    return 0;
+}

13. Внес изменения в main.cpp: добавил печать произведения чисел, но не стал пока делать коммит.
    С помощью git diff получил:

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project (master)
$ git diff
diff --git a/main.cpp b/main.cpp
index b4392ec..64da2d3 100644
--- a/main.cpp
+++ b/main.cpp
@@ -4,6 +4,11 @@ using namespace std;

 int main()
 {
-    cout << "Hello world!" << endl;
-    return 0;
+    cout << "Enter A and B: ";
+    int a, b;
+    cin >> a >> b;
+    cout << "A + B = " << a + b << '\n'
+         << "A - B = " << a - b << '\n'
+         << "A * B = " << a * b << '\n';
+
 }

Как видно команда отображает какие строки исчезли(-) и какие прибавились(+), так же хэш последнего коммита.

13.1 С помощью (git diff HEAD~2) посмотрел разницу рабочей копии и пред-предыдущим коммитом(HEAD~2):


Admin@zhi-es MINGW64 ~/Desktop/lab02/bob/project (main)
$ git diff HEAD~2
diff --git a/main.cpp b/main.cpp
index 38bc977..076d74f 100644
--- a/main.cpp
+++ b/main.cpp
@@ -11,4 +11,24 @@ int main()
          << "A - B = " << a - b << '\n'
          << "A * B = " << a * b << '\n'
          << "A / B = " << a / b << '\n';
+
+    if(a < b){
+        cout << "Min: " << a << '\n';
+    }
+    if(b < a){
+        cout << "Min: " << b << '\n';
+    }
+    else{
+        cout << "Min: " << a << b << '\n';
+    }
+    if(a > b){
+        cout << "Max: " << a << '\n';
+    }
+    if(b > a){
+        cout << "Max: " << b << '\n';
+    }
+    else{
+        cout << "Max: " << a << b << '\n';
+
+    }
 }

13.2 Используя (git diff HEAD~2 HEAD) просмотрел аналогичную разницу между пред-предыдущим коммитом(HEAD~2) и выбранным текущим(HEAD):

Admin@zhi-es MINGW64 ~/Desktop/lab02/bob/project (main)
$ git diff HEAD~2 HEAD
diff --git a/main.cpp b/main.cpp
index 38bc977..d6dbc1d 100644
--- a/main.cpp
+++ b/main.cpp
@@ -11,4 +11,24 @@ int main()
          << "A - B = " << a - b << '\n'
          << "A * B = " << a * b << '\n'
          << "A / B = " << a / b << '\n';
+
+    if(a < b){
+        cout << "Min: " << a << '\n';
+    }
+    if(b < a){
+        cout << "Min: " << b << '\n';
+    }
+    else{
+        cout << "Min: " << a << b << '\n';
+
+    if(a > b){
+        cout << "Max: " << a << '\n';
+    }
+    if(b > a){
+        cout << "Max: " << b << '\n';
+    }
+    else{
+        cout << "Max: " << a << b << '\n';
+
+    }
 }
 

14. Успешно подключил рабочую версию к удалённой, отправил проект на сервер...

15. Получил проект с помощью git clone в папку боба и зарегистрировался(git config) от имени боба:

Admin@zhi-es MINGW64 ~/Desktop/lab02/bob/project (main)
$ git clone git@uit.mpei.ru:PodlovchenkoDD/cs-lab02.git project
Admin@zhi-es MINGW64 ~/Desktop/lab02/bob/project (main)
$ git config user.name "Bob (PodlovchenkoDD)"
Admin@zhi-es MINGW64 ~/Desktop/lab02/bob/project (main)
$ git config user.email "PodlovchenkoDD@mpei.ru"

16. Отправил коммит с произведением от имени боба на сервер с помощью git push и принял изменения от имени Алисы с помощью git fetch: 
Боб:
Admin@zhi-es MINGW64 ~/Desktop/lab02/bob/project (main)
$ git push
Enter passphrase for key '/c/Users/Admin/.ssh/id_ed25519':
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 16 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 365 bytes | 365.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0 (from 0)
remote: . Processing 1 references
remote: Processed 1 references in total
To uit.mpei.ru:PodlovchenkoDD/cs-lab02.git
   ccc711f..ce2e41a  main -> main

Алиса:
Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project (main)
$ git fetch
Enter passphrase for key '/c/Users/Admin/.ssh/id_ed25519':
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 345 bytes | 11.00 KiB/s, done.
From uit.mpei.ru:PodlovchenkoDD/cs-lab02
   ccc711f..ce2e41a  main       -> origin/main

17. Просмотрел историю всех веток(git log --oneline --decorate --all --graph) и подвинул ветку main к скачанной версии(git pull --ff-only):

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project (main)
$ git log --oneline --decorate --all --graph
* ce2e41a (origin/main, origin/HEAD) code: произведение после ошибки
* ccc711f (HEAD -> main) добавление proj
* 3075de5 code: без произведения перед бобом
* 5c5d769 first commit
* ca1511a (master) code:вывод произведения
* 79acfbc git
* 814a45e code: заготовка программы

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project (main)
$ git pull --ff-only
Enter passphrase for key '/c/Users/Admin/.ssh/id_ed25519':
Updating ccc711f..ce2e41a
Fast-forward
 main.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

18. Перешёл к "Разрешение конфликтов правок при совместной работе", синхронизировал у обоих пользователей: 

cout << "A + B = " << a + b << '\n'
     << "A - B = " << a - b << '\n'
     << "A * B = " << a * b << '\n'
     << "A / B = " << a / b << '\n';

19. После добавления в код минимума(Алиса) и максимума(боб), после отправки на сервер
возникла ожидаемая ошибка, git rebase origin/main и после git show HEAD можем заметить: 

Admin@zhi-es MINGW64 ~/Desktop/lab02/bob/project (main)
$ git show HEAD
commit e64fb31d7e1cc64f067052811999a092cc9a7306 (HEAD -> main)
Author: Bob (PodlovchenkoDD) <PodlovchenkoDD>
Date:   Mon Mar 24 15:49:52 2025 +0300

    Добавление максимума от лица боба

diff --git a/main.cpp b/main.cpp
index 38bc977..2f6e5f4 100644
--- a/main.cpp
+++ b/main.cpp
@@ -11,4 +11,13 @@ int main()
          << "A - B = " << a - b << '\n'
          << "A * B = " << a * b << '\n'
          << "A / B = " << a / b << '\n';
+    if(a > b){
+        cout << "Max: " << a << '\n';
+    }
+    if(b > a){
+        cout << "Max: " << b << '\n';
+    }
+    else{
+        cout << "Max: " << a << b << '\n';
+    }

То есть последний коммит на вывод максимума

20. После выхода из состояния rebase(git add main.cpp
git rebase --continue) и редактирования файла получаем: 

Admin@zhi-es MINGW64 ~/Desktop/lab02/bob/project (main)
$ git show HEAD
commit 32f18606672dd7f3fb41694b7ba161c7798b7274 (HEAD -> main)
Author: Bob (PodlovchenkoDD) <PodlovchenkoDD>
Date:   Mon Mar 24 15:49:52 2025 +0300

    Добавление максимума от лица боба

diff --git a/main.cpp b/main.cpp
index 5d5692a..d6dbc1d 100644
--- a/main.cpp
+++ b/main.cpp
@@ -11,6 +11,7 @@ int main()
          << "A - B = " << a - b << '\n'
          << "A * B = " << a * b << '\n'
          << "A / B = " << a / b << '\n';
+
     if(a < b){
         cout << "Min: " << a << '\n';
     }
@@ -19,5 +20,15 @@ int main()
     }
     else{
         cout << "Min: " << a << b << '\n';
+
+    if(a > b){
+        cout << "Max: " << a << '\n';
+    }
+    if(b > a){
+        cout << "Max: " << b << '\n';
+    }
+    else{
+        cout << "Max: " << a << b << '\n';
+
     }
 }

21. История всех веток после замены типа на double у Алисы: 

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project (main)
$ git log --oneline --decorate --all --graph
* d48e22d (double) А и б теперь double
| * 32f1860 (origin/main, origin/HEAD) Добавление максимума от лица боба
|/
* da101ef (HEAD -> main) Добавление минимума для Алисы
* d9df2c2 Разрешение конфликтов правок
* ce2e41a code: произведение после ошибки
* ccc711f добавление proj
* 3075de5 code: без произведения перед бобом
* 5c5d769 first commit
* ca1511a (master) code:вывод произведения
* 79acfbc git
* 814a45e code: заготовка программы

22. 1)После создания ветки double, переключаемся на неё:

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project (main)
$ git branch double

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project (main)
$ git checkout double
Switched to branch 'double'

2)Далее меняю тип данных на double и переключаюсь обратно на main.

3)После слияниe (git merge double):

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project (main)
$ git merge double
Updating da101ef..d48e22d
Fast-forward
 main.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

4)отправляю новый коммит:

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project (main)
$ git push
Enter passphrase for key '/c/Users/Admin/.ssh/id_ed25519':
To uit.mpei.ru:PodlovchenkoDD/cs-lab02.git
Enter passphrase for key '/c/Users/Admin/.ssh/id_ed25519':
Auto-merging main.cpp
Merge made by the 'ort' strategy.
 main.cpp | 11 +++++++++++
 1 file changed, 11 insertions(+)

5)Отправляю последний коммит со всеми изменениями и сверяю логи:

Admin@zhi-es MINGW64 ~/Desktop/lab02/alice/project (main)
$ git log --oneline --decorate --all --graph
*   f02ac50 (HEAD -> main) Merge branch 'main' of uit.mpei.ru:PodlovchenkoDD/cs-lab02
|\
| * 32f1860 (origin/main, origin/HEAD) Добавление максимума от лица боба
* | d48e22d (double) А и б теперь double
|/
* da101ef Добавление минимума для Алисы
* d9df2c2 Разрешение конфликтов правок
* ce2e41a code: произведение после ошибки
* ccc711f добавление proj
* 3075de5 code: без произведения перед бобом
* 5c5d769 first commit
* ca1511a (master) code:вывод произведения
* 79acfbc git
* 814a45e code: заготовка программы

Всего получилось 11 коммитов, потому что много раз делал повторные действия)