# Отчет по лабораторной работе № 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 ``` 3. Инициализировал репозитарий: ``` maksimkorneev@MacBook-Air-Maksim project % git init Initialized empty Git repository in /Users/maksimkorneev/Desktop/labs/lab_02/alice/project/.git/ ``` 4. Поменял имя ветки и настроил имя пользователя и 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' ``` 5. Просмотрим статус репозитария ``` maksimkorneev@MacBook-Air-Maksim project % git status On branch main No commits yet Untracked files: (use "git add ..." to include in what will be committed) main.cpp nothing added to commit but untracked files present (use "git add" to track) ``` Увидели, на какой ветке стоим, сообщение о том, что не было ни одного коммита, а так же файлы, которые присутствуют в каталоге, но не добавлены в git. 6. Добавим main.cpp и повторим команду ``` maksimkorneev@MacBook-Air-Maksim project % git status On branch main No commits yet Changes to be committed: (use "git rm --cached ..." to unstage) new file: main.cpp ``` `git status` показывает изменения, которые войдут в следующий коммит. Сейчас это только `main.cpp` 7. Сделаем коммит ``` maksimkorneev@MacBook-Air-Maksim project % git commit -m 'code: заготовка программы' [main (root-commit) 2b0c211] code: заготовка программы 1 file changed, 7 insertions(+) create mode 100644 main.cpp ``` 8. Изменим `main.cpp`, добавив ввод, но не обновим этот файл в git. Посмотрим статус репозитория: ``` maksimkorneev@MacBook-Air-Maksim project % git status On branch main Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git restore ..." 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`, т.е. измененный, а не новый, как было ранее. 9. Создадим коммит с вводом чисел и выводом суммы: ``` 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(-)`) 10. Добавим в программу вывод разности и сделаем коммит вторым указанным способом: ``` 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(-) ``` 11. Создал файл `.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 не будет обращать внимание на указанные файлы. 12. Посмотрим историю коммитов в трёх исполнениях Просто вывод, сжато и сжато+дерево ``` maksimkorneev@MacBook-Air-Maksim project % git log commit 321522b0e84fcb1debdd563600ecf1e5f8c4fddf (HEAD -> main) Author: Alice (KorneevMA) Date: Mon May 13 14:11:29 2024 +0300 git commit 773cad6d6385a4acafd1a72898bb37200a276d26 Author: Alice (KorneevMA) Date: Mon May 13 14:04:10 2024 +0300 code: добавлен вывод разности commit 5be8964f2d0f450e68ddd0a392b406c7785171f1 Author: Alice (KorneevMA) Date: Mon May 13 14:02:12 2024 +0300 code: добавлен вывод суммы commit 2b0c211b150436b5658422ac816c38551ad5290e Author: Alice (KorneevMA) 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: заготовка программы ``` 13. Введём `git log --stat` и посмотрим на вывод ``` maksimkorneev@MacBook-Air-Maksim project % git log --stat commit 321522b0e84fcb1debdd563600ecf1e5f8c4fddf (HEAD -> main) Author: Alice (KorneevMA) Date: Mon May 13 14:11:29 2024 +0300 git .gitignore | 2 ++ 1 file changed, 2 insertions(+) ``` Показывается хэш коммита, автор, точное время создания коммита, тема коммита, добавленный файл. Так же видим сколько файлов изменено и сколько строк в этом файле добавлено 14. Посмотрим предпоследний коммит ``` maksimkorneev@MacBook-Air-Maksim project % git show 773cad6 commit 773cad6d6385a4acafd1a72898bb37200a276d26 Author: Alice (KorneevMA) 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'; } ``` Показывается хэш, автор, дата, время, тема. Код программы: - означает удаление указанной строки, а + добавление 15. Добавим печать произведения в программу, но коммитить пока не будем Посмотрим изменения в рабочей копии ``` 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'; } ``` Как можно видеть, вывод изменился. `-` показывает, какая сточка была удалена, а `+`, что было добавлено. (В добавок ко всему я привел вывод к нужному виду) 16. Посмотрим изменения между самым первым коммитом и коммитом, добавляющим вывод разности Для этого используем хэши этих коммитов, которые написаны выше ``` 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'; } ``` 17. Закоммитим изменения в рабочей копии (вывод произведения) ``` maksimkorneev@MacBook-Air-Maksim project % git commit -a -m "code: добавил вывод произведения" [main ddcc9a9] code: добавил вывод произведения 1 file changed, 2 insertions(+), 1 deletion(-) ``` 18. Откатимся к предпоследнему коммиту: ``` maksimkorneev@MacBook-Air-Maksim project % git reset --hard HEAD~1 HEAD is now at 321522b git ``` 19. Добавим над функцией main() комментарий и откатим этот файл к состоянию в последнем коммите: ``` vatarishin@MacBook-Air-Vatari project % git checkout HEAD -- main.cpp ``` 20. Из-за того, что через 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'. ``` 21. На машине Боба. Клонируем репозитарий с облака, указав 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 ``` 22. Изменим имя пользователя и email ``` maksimkorneev@MacBook-Air-Maksim project % git config user.name 'Bob (KorneevMA)' maksimkorneev@MacBook-Air-Maksim project % git config user.email 'korneevmaxa@mpei.ru' ``` 23. Добавим вывод произведения, закоммитим и отправим на сервер ``` 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 ``` 24. На машине Алисы загрузим изменения Боба ``` 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` к скачанной версии 25. Добавим в программу вывод частного, закоммитим и отправим на сервер ``` 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 ``` 26. У Боба. Загрузим изменения Алисы ``` 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(-) ``` 27. У Алисы. Дополним программу выводом максимума, закоммитим и отправим на сервер ``` 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 ``` 28. На машине Боба: Не обновляя локальный репозитарий, добавим вывод минимума, сделаем коммит и попытаемся отправить на сервер ``` 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 не дайт этого сделать, так как коммит Боба основан не на последнем существующем коммите 29. Посмотрим всю историю коммитов, предварительно загрузим их ``` 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` 30. Попытаемся перенести коммит Боба поверх коммита Алисы, то есть поверх 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 ", 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: добавил вывод минимума ``` Получаем сообщение о конфликте. Необходимо сначала привести код Боба к тому виду, как у Алисы, а потом добавлять его изменения Сделаем это вручную 31. После изменения кода нужно добавить файл и продолжить прерванную операцию 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 ``` 32. Перейдём на машину Алисы. Создадим ветку double и перейдём в неё ``` maksimkorneev@MacBook-Air-Maksim project % git branch double maksimkorneev@MacBook-Air-Maksim project % git checkout double Switched to branch 'double' ``` Видим сообщение о том, что мы перешли на другую ветку 33. Поменяем типы переменных на `double`, закомиттим ``` maksimkorneev@MacBook-Air-Maksim project % git commit -a -m "code: изменен тип переменных на double" [double 8ae5b23] изменен тип переменных на double 1 file changed, 2 insertions(+), 2 deletions(-) ``` 34. Перейдём в ветку 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`, в котором мы меняли тип переменной в другой ветке 35. Сольём ветку `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(-) ``` 36. Попытаемся отправить изменения на сервер, т.к. ранее мы видели, что версии ветки `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 ``` 37. Посмотрим историю всех веток репозитария ``` 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: заготовка программы ``` Видно, что три предпоследних коммита находятся в другой ветке А последний коммит — слияние веток