Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

24 KiB

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

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

Примечание: работа выполнялась на MacBook в IDE VS Code, из-за этого нет файлов проекта и подключение к серверу кафедры производилось по HTTP.

  1. Создал в именной папке каталог lab_02 и запустил в нем консоль.

  2. Создал каталоги Алисы и Боба, каталог project. В процессе познакомился с cd:

maksimkorneev@MacBook-Air-Maksim lab_02 % mkdir alice 
maksimkorneev@MacBook-Air-Maksim lab_02 % mkdir bob  
maksimkorneev@MacBook-Air-Maksim lab_02 % cd alice 
maksimkorneev@MacBook-Air-Maksim alice % mkdir project
maksimkorneev@MacBook-Air-Maksim alice % cd project   
maksimkorneev@MacBook-Air-Maksim project % cd ..
maksimkorneev@MacBook-Air-Maksim alice % cd project
  1. Инициализировал репозитарий:
maksimkorneev@MacBook-Air-Maksim project % git init
Initialized empty Git repository in /Users/maksimkorneev/Desktop/labs/lab_02/alice/project/.git/
  1. Поменял имя ветки и настроил имя пользователя и email
maksimkorneev@MacBook-Air-Maksim project % git branch -m main
maksimkorneev@MacBook-Air-Maksim project %  git config user.name 'Alice (KorneevMA)'
maksimkorneev@MacBook-Air-Maksim project % git config user.email 'korneevmaxa@mpei.ru'
  1. Просмотрим статус репозитария
maksimkorneev@MacBook-Air-Maksim project % git status
On branch main

No commits yet

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

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

Увидели, на какой ветке стоим, сообщение о том, что не было ни одного коммита, а так же файлы, которые присутствуют в каталоге, но не добавлены в git.

  1. Добавим main.cpp и повторим команду
maksimkorneev@MacBook-Air-Maksim project % git status      
On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
	new file:   main.cpp

git status показывает изменения, которые войдут в следующий коммит. Сейчас это только main.cpp

  1. Сделаем коммит
maksimkorneev@MacBook-Air-Maksim project % git commit -m 'code: заготовка программы'
[main (root-commit) 2b0c211] code: заготовка программы
 1 file changed, 7 insertions(+)
 create mode 100644 main.cpp
  1. Изменим main.cpp, добавив ввод, но не обновим этот файл в git. Посмотрим статус репозитория:
maksimkorneev@MacBook-Air-Maksim project % 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:   main.cpp

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

Как можно видеть, стоим мы все так же на ветке main, однако уже нет файлов, не занесенных в git. Так же видим, что подпись у main.cpp изменилась. Теперь он отмечен как modified, т.е. измененный, а не новый, как было ранее.

  1. Создадим коммит с вводом чисел и выводом суммы:
maksimkorneev@MacBook-Air-Maksim project % git add main.cpp 
maksimkorneev@MacBook-Air-Maksim project % git commit -m 'code: добавлен вывод суммы'
[main 5be8964] code: добавлен вывод суммы
 1 file changed, 4 insertions(+), 1 deletion(-)  

Видим, что в коммит вошло 1 изменеие файла с 4 добавленными строками (4 insertions(+)) и одной убранной (1 deletion(-))

  1. Добавим в программу вывод разности и сделаем коммит вторым указанным способом:
maksimkorneev@MacBook-Air-Maksim project % git add -u      
maksimkorneev@MacBook-Air-Maksim project % git commit -m 'code: добавлен вывод разности'
[main 773cad6] code: добавлен вывод разности
 1 file changed, 2 insertions(+), 1 deletion(-)
  1. Создал файл .gitignore и занёс в него всё, что было создано при сборке программы. Закоммитим.
maksimkorneev@MacBook-Air-Maksim project % git add .gitignore 
maksimkorneev@MacBook-Air-Maksim project % git commit -m "git"
[main 321522b] git
 1 file changed, 2 insertions(+)
 create mode 100644 .gitignore

Теперь git не будет обращать внимание на указанные файлы.

  1. Посмотрим историю коммитов в трёх исполнениях Просто вывод, сжато и сжато+дерево
maksimkorneev@MacBook-Air-Maksim project % git log
commit 321522b0e84fcb1debdd563600ecf1e5f8c4fddf (HEAD -> main)
Author: Alice (KorneevMA) <korneevmaxa@mpei.ru>
Date:   Mon May 13 14:11:29 2024 +0300

    git

commit 773cad6d6385a4acafd1a72898bb37200a276d26
Author: Alice (KorneevMA) <korneevmaxa@mpei.ru>
Date:   Mon May 13 14:04:10 2024 +0300

    code: добавлен вывод разности

commit 5be8964f2d0f450e68ddd0a392b406c7785171f1
Author: Alice (KorneevMA) <korneevmaxa@mpei.ru>
Date:   Mon May 13 14:02:12 2024 +0300

    code: добавлен вывод суммы

commit 2b0c211b150436b5658422ac816c38551ad5290e
Author: Alice (KorneevMA) <korneevmaxa@mpei.ru>
Date:   Mon May 13 13:57:51 2024 +0300

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


maksimkorneev@MacBook-Air-Maksim project % git log --oneline --decorate
321522b (HEAD -> main) git
773cad6 code: добавлен вывод разности
5be8964 code: добавлен вывод суммы
2b0c211 code: заготовка программы



maksimkorneev@MacBook-Air-Maksim project % git log --oneline --decorate --all --graph
* 321522b (HEAD -> main) git
* 773cad6 code: добавлен вывод разности
* 5be8964 code: добавлен вывод суммы
* 2b0c211 code: заготовка программы
  1. Введём git log --stat и посмотрим на вывод
maksimkorneev@MacBook-Air-Maksim project % git log --stat
commit 321522b0e84fcb1debdd563600ecf1e5f8c4fddf (HEAD -> main)
Author: Alice (KorneevMA) <korneevmaxa@mpei.ru>
Date:   Mon May 13 14:11:29 2024 +0300

    git

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

Показывается хэш коммита, автор, точное время создания коммита, тема коммита, добавленный файл. Так же видим сколько файлов изменено и сколько строк в этом файле добавлено

  1. Посмотрим предпоследний коммит
maksimkorneev@MacBook-Air-Maksim project % git show 773cad6
commit 773cad6d6385a4acafd1a72898bb37200a276d26
Author: Alice (KorneevMA) <korneevmaxa@mpei.ru>
Date:   Mon May 13 14:04:10 2024 +0300

    code: добавлен вывод разности

diff --git a/main.cpp b/main.cpp
index 747d932..6911b00 100644
--- a/main.cpp
+++ b/main.cpp
@@ -6,5 +6,6 @@ int main()
     cout << "Enter A and B: ";
     int a, b;
     cin >> a >> b;
-    cout << "A + B = " << a + b << '\n';
+    cout << "A + B = " << a + b << '\n'
+         << "A - B = " << a - b << '\n';
 }

Показывается хэш, автор, дата, время, тема. Код программы: - означает удаление указанной строки, а + добавление

  1. Добавим печать произведения в программу, но коммитить пока не будем Посмотрим изменения в рабочей копии
maksimkorneev@MacBook-Air-Maksim project % git diff
diff --git a/main.cpp b/main.cpp
index 6911b00..2a4f3a5 100644
--- a/main.cpp
+++ b/main.cpp
@@ -7,5 +7,6 @@ int main()
     int a, b;
     cin >> a >> b;
     cout << "A + B = " << a + b << '\n'
-         << "A - B = " << a - b << '\n';
+         << "A - B = " << a - b << '\n'
+         << "A * B = " << a * b << '\n';
 }

Как можно видеть, вывод изменился. - показывает, какая сточка была удалена, а +, что было добавлено. (В добавок ко всему я привел вывод к нужному виду)

  1. Посмотрим изменения между самым первым коммитом и коммитом, добавляющим вывод разности Для этого используем хэши этих коммитов, которые написаны выше
maksimkorneev@MacBook-Air-Maksim project % git diff 2b0c211 773cad6
diff --git a/main.cpp b/main.cpp
index 174c33b..6911b00 100644
--- a/main.cpp
+++ b/main.cpp
@@ -3,5 +3,9 @@ using namespace std;
 
 int main()
 {
-    
+    cout << "Enter A and B: ";
+    int a, b;
+    cin >> a >> b;
+    cout << "A + B = " << a + b << '\n'
+         << "A - B = " << a - b << '\n';
 }
  1. Закоммитим изменения в рабочей копии (вывод произведения)
maksimkorneev@MacBook-Air-Maksim project % git commit -a -m "code: добавил вывод произведения"
[main ddcc9a9] code: добавил вывод произведения
 1 file changed, 2 insertions(+), 1 deletion(-)
  1. Откатимся к предпоследнему коммиту:
maksimkorneev@MacBook-Air-Maksim project % git reset --hard HEAD~1
HEAD is now at 321522b git
  1. Добавим над функцией main() комментарий и откатим этот файл к состоянию в последнем коммите:
vatarishin@MacBook-Air-Vatari project % git checkout HEAD -- main.cpp
  1. Из-за того, что через mac не возможно подключится с помощью ssh ключа, поключимся к серверу с помощью протокола HTTP и запушим изменения на сервер
maksimkorneev@MacBook-Air-Maksim project % git remote add origin http://uit.mpei.ru/git/KorneevMaxA/cs-lab02.git
maksimkorneev@MacBook-Air-Maksim project % git push origin main -u
Enumerating objects: 12, done.
Counting objects: 100% (12/12), done.
Delta compression using up to 8 threads
Compressing objects: 100% (8/8), done.
Writing objects: 100% (12/12), 1.16 KiB | 1.17 MiB/s, done.
Total 12 (delta 2), reused 0 (delta 0), pack-reused 0
remote: . Processing 1 references
remote: Processed 1 references in total
To http://uit.mpei.ru/git/KorneevMaxA/cs-lab02.git
 * [new branch]      main -> main
branch 'main' set up to track 'origin/main'.
  1. На машине Боба. Клонируем репозитарий с облака, указав URL и папку Перейдём в папку проекта
maksimkorneev@MacBook-Air-Maksim bob % git clone http://uit.mpei.ru/git/KorneevMaxA/cs-lab02 project
Cloning into 'project'...
remote: Enumerating objects: 12, done.
remote: Counting objects: 100% (12/12), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 12 (delta 2), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (12/12), done.
Resolving deltas: 100% (2/2), done.

maksimkorneev@MacBook-Air-Maksim bob % cd project 
  1. Изменим имя пользователя и email
maksimkorneev@MacBook-Air-Maksim project % git config user.name 'Bob (KorneevMA)'
maksimkorneev@MacBook-Air-Maksim project % git config user.email 'korneevmaxa@mpei.ru'
  1. Добавим вывод произведения, закоммитим и отправим на сервер
maksimkorneev@MacBook-Air-Maksim project % git commit -a -m "code: добавил печать произведения"
[main 5fab05e] code: добавил печать произведения
 1 file changed, 2 insertions(+), 1 deletion(-)

maksimkorneev@MacBook-Air-Maksim project % git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 394 bytes | 394.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: . Processing 1 references
remote: Processed 1 references in total
To http://uit.mpei.ru/git/KorneevMaxA/cs-lab02
   321522b..5fab05e  main -> main

  1. На машине Алисы загрузим изменения Боба
maksimkorneev@MacBook-Air-Maksim project % git fetch
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 374 bytes | 187.00 KiB/s, done.
From http://uit.mpei.ru/git/KorneevMaxA/cs-lab02
   321522b..5fab05e  main       -> origin/main

maksimkorneev@MacBook-Air-Maksim project % git log --oneline --decorate --all --graph
* 5fab05e (origin/main) code: добавил печать произведения
* 321522b (HEAD -> main) git
* 773cad6 code: добавлен вывод разности
* 5be8964 code: добавлен вывод суммы
* 2b0c211 code: заготовка программы

maksimkorneev@MacBook-Air-Maksim project % git pull --ff-only

Updating 321522b..5fab05e
Fast-forward
 main.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

После введения первой команды земетим, что в рабочей копии изменений еще не произошло Просмотрим историю и увидим, ветка main отстает на один коммит от ветки origin/main Пододвинем main к скачанной версии

  1. Добавим в программу вывод частного, закоммитим и отправим на сервер
maksimkorneev@MacBook-Air-Maksim project % git commit -a -m "добавил вывод частного"
[main 1e62b23] добавил вывод частного
 1 file changed, 2 insertions(+), 1 deletion(-)

maksimkorneev@MacBook-Air-Maksim project % git push  
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 381 bytes | 381.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: . Processing 1 references
remote: Processed 1 references in total
To http://uit.mpei.ru/git/KorneevMaxA/cs-lab02.git
   5fab05e..1e62b23  main -> main
  1. У Боба. Загрузим изменения Алисы
maksimkorneev@MacBook-Air-Maksim project % git pull
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 361 bytes | 90.00 KiB/s, done.
From http://uit.mpei.ru/git/KorneevMaxA/cs-lab02
   5fab05e..1e62b23  main       -> origin/main
Updating 5fab05e..1e62b23
Fast-forward
 main.cpp | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
  1. У Алисы. Дополним программу выводом максимума, закоммитим и отправим на сервер
maksimkorneev@MacBook-Air-Maksim project % git commit -a -m "code: добавил вывод максимума"
[main 60cb826] code: добавил вывод максимума
 1 file changed, 2 insertions(+), 1 deletion(-)

maksimkorneev@MacBook-Air-Maksim project % git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 388 bytes | 388.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: . Processing 1 references
remote: Processed 1 references in total
To http://uit.mpei.ru/git/KorneevMaxA/cs-lab02.git
   1e62b23..60cb826  main -> main
  1. На машине Боба: Не обновляя локальный репозитарий, добавим вывод минимума, сделаем коммит и попытаемся отправить на сервер
maksimkorneev@MacBook-Air-Maksim project % git commit -a -m "code: добавил вывод минимума"
[main 8267e0c] code: добавил вывод минимума
 1 file changed, 2 insertions(+), 1 deletion(-)
maksimkorneev@MacBook-Air-Maksim project % git push
To http://uit.mpei.ru/git/KorneevMaxA/cs-lab02
 ! [rejected]        main -> main (fetch first)
error: failed to push some refs to 'http://uit.mpei.ru/git/KorneevMaxA/cs-lab02'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Видно, что Git не дайт этого сделать, так как коммит Боба основан не на последнем существующем коммите

  1. Посмотрим всю историю коммитов, предварительно загрузим их
maksimkorneev@MacBook-Air-Maksim project % git fetch
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 368 bytes | 73.00 KiB/s, done.
From http://uit.mpei.ru/git/KorneevMaxA/cs-lab02
   1e62b23..60cb826  main       -> origin/main

maksimkorneev@MacBook-Air-Maksim project % git log --oneline --decorate --all --graph
* 8267e0c (HEAD -> main) code: добавил вывод минимума
| * 60cb826 (origin/main, origin/HEAD) code: добавил вывод максимума
|/  
* 1e62b23 code: добавил вывод частного
* 5fab05e code: добавил печать произведения
* 321522b git
* 773cad6 code: добавлен вывод разности
* 5be8964 code: добавлен вывод суммы
* 2b0c211 code: заготовка программы

Видно, что возник конфликт. Появилось две версии ветки main

  1. Попытаемся перенести коммит Боба поверх коммита Алисы, то есть поверх origin/main
vatarishin@MacBook-Air-Vatari project % git rebase origin/main

Auto-merging main.cpp
CONFLICT (content): Merge conflict in main.cpp
error: could not apply 6514e20... code: добавил вывод минимума
hint: Resolve all conflicts manually, mark them as resolved with
hint: "git add/rm <conflicted_files>", then run "git rebase --continue".
hint: You can instead skip this commit: run "git rebase --skip".
hint: To abort and get back to the state before "git rebase", run "git rebase --abort".
Could not apply 6514e20... code: добавил вывод минимума

Получаем сообщение о конфликте. Необходимо сначала привести код Боба к тому виду, как у Алисы, а потом добавлять его изменения Сделаем это вручную

  1. После изменения кода нужно добавить файл и продолжить прерванную операцию rebase После этого отправим изменения на сервер
maksimkorneev@MacBook-Air-Maksim project % git add main.cpp
maksimkorneev@MacBook-Air-Maksim project % git rebase --continue
[detached HEAD 7ad893e] добавил вывод
 1 file changed, 2 insertions(+), 1 deletion(-)
Successfully rebased and updated refs/heads/main.

maksimkorneev@MacBook-Air-Maksim project % git push
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 382 bytes | 382.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: . Processing 1 references
remote: Processed 1 references in total
To http://uit.mpei.ru/git/KorneevMaxA/cs-lab02
   60cb826..7ad893e  main -> main
  1. Перейдём на машину Алисы. Создадим ветку double и перейдём в неё
maksimkorneev@MacBook-Air-Maksim project % git branch double
maksimkorneev@MacBook-Air-Maksim project % git checkout double

Switched to branch 'double'

Видим сообщение о том, что мы перешли на другую ветку

  1. Поменяем типы переменных на double, закомиттим
maksimkorneev@MacBook-Air-Maksim project % git commit -a -m "code: изменен тип переменных на double"
[double 8ae5b23] изменен тип переменных на double
 1 file changed, 2 insertions(+), 2 deletions(-)

  1. Перейдём в ветку main, синхронзируем репозитарии и посмотрим историю:
maksimkorneev@MacBook-Air-Maksim project % git log --oneline --decorate --all --graph
* 8ae5b23 (double) code: изменен тип переменных на double
| * 7ad893e (HEAD -> main, origin/main) code: добавил вывод минимума
|/  
* 60cb826 code: добавил вывод максимума 
* 1e62b23 code: добавил вывод частного
* 5fab05e code: добавил печать произведения
* 321522b git
* 773cad6 code: добавлен вывод разности
* 5be8964 code: добавлен вывод суммы
* 2b0c211 code: заготовка программы

Видим две вещи:

  1. Версия кода Алисы совпадает с версией кода Боба.
  2. коммит с хэшем 8ae5b23, в котором мы меняли тип переменной в другой ветке
  1. Сольём ветку double с главной
maksimkorneev@MacBook-Air-Maksim project % git merge double       

Auto-merging main.cpp
Merge made by the 'ort' strategy.
 main.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
  1. Попытаемся отправить изменения на сервер, т.к. ранее мы видели, что версии ветки main совпадают всё происходит без проблем.
maksimkorneev@MacBook-Air-Maksim project % git push
Enumerating objects: 11, done.
Counting objects: 100% (11/11), done.
Delta compression using up to 8 threads
Compressing objects: 100% (7/7), done.
Writing objects: 100% (7/7), 763 bytes | 763.00 KiB/s, done.
Total 7 (delta 3), reused 0 (delta 0), pack-reused 0
remote: . Processing 1 references
remote: Processed 1 references in total
To http://uit.mpei.ru/git/KorneevMaxA/cs-lab02.git
   7ad893e..eb684c6  main -> main

  1. Посмотрим историю всех веток репозитария
maksimkorneev@MacBook-Air-Maksim project % git log --oneline --decorate --all --graph
*   eb684c6 (HEAD -> main, origin/main) Merge branch 'double'
|\  
| * 9ea296a (double) fix
| * 8ae5b23 изменен тип переменных на double
* | 7ad893e добавил вывод минимума
|/  
* 60cb826 добавил вывод максимума
* 1e62b23 добавил вывод частного
* 5fab05e code: добавил печать произведения
* 321522b git
* 773cad6 code: добавлен вывод разности
* 5be8964 code: добавлен вывод суммы
* 2b0c211 code: заготовка программы

Видно, что три предпоследних коммита находятся в другой ветке А последний коммит — слияние веток