# Отчет по лабораторной работе № 2 «Система контроля версий Git» Выполнил: Гордиевских Д. А. \ Группа: А-01-23 \ Проверил: Козлюк Д. А. Примечание: работа выполнялась на Windows в IDE Visual studio 2022. Это значит, что на этапе добавления файлов проекта будет добавлено больше файлов 1. Создал на рабочем столе каталог LABA2 и запустил в нем Git Bash, приглашение: ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2 $ ``` 2. Просмотрел файлы в рабочем каталоге можно командой `ls` — пусто: ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2 $ ls gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2 $ ``` 3. Создал каталоги Алисы и Боба, создал каталог `project`, изучил команду `cd` в процессе: ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2 $ mkdir alice gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2 $ mkdir bob gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2 $ cd alice/ gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice $ mkdir project gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice $ cd project/ gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project $ cd .. gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice $ cd project/ ``` 4. Инициализировал репозитарий: ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project $ git init Initialized empty Git repository in C:/Users/gorda/OneDrive/Рабочий стол/LABA2/alice/project/.git/ gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (master) ``` У меня имя ветки по умолчанию не настроено. Git создал ветку под названием `master`, что видно в приглашении терминала. Подсказка о смене ветки не появилась. Позже имя ветки будет изменено на `main` 5. Настраиваем имя пользователя и email ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (master) $ git config user.name "Alice (GordiyevskikDA)" gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (master) $ git config user.email "gordiyevskikda@mpei.ru" ``` 6. Просмотрим статус репозитария ``` $ git status On branch master No commits yet Untracked files: (use "git add ..." to include in what will be committed) .vs/ main.cpp main.sln main.vcxproj main.vcxproj.filters main.vcxproj.user nothing added to commit but untracked files present (use "git add" to track) ``` В ветке MASTER отсутствуют коммиты. Приведён список файлов, незанесённых под контроль версий Подсказка: Для добавления файлов нужно написать команду из скобок 7. Добавим main.cpp и посмотрим статус репозитария ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (master) $ git add main.cpp gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (master) $ git status On branch master No commits yet Changes to be committed: (use "git rm --cached ..." to unstage) new file: main.cpp Untracked files: (use "git add ..." to include in what will be committed) .vs/ main.sln main.vcxproj main.vcxproj.filters main.vcxproj.user ``` Git status показывает, что в изменениях для следующего коммита присутствует новый файл main.cpp 8. Закоммитим main.cpp ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (master) $ git commit -m 'code: заготовка программы' [master (root-commit) 6f61cde] code: заготовка программы 1 file changed, 20 insertions(+) create mode 100644 main.cpp ``` 9. Переименуем ветку из master в main Добавим под контроль версий файлы проекта. Т.к используется VS, необходимо добавить 4 файла И, соответственно, сразу создаём коммит "code:..." ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (master) $ git branch -m main gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git add main.sln gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git add main.vcxproj gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git add main.vcxproj.filters gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git add main.vcxproj.user gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git commit -m 'biuld: добавлены файлы проекта' [main ff38e89] biuld: добавлены файлы проекта 4 files changed, 192 insertions(+) create mode 100644 main.sln create mode 100644 main.vcxproj create mode 100644 main.vcxproj.filters create mode 100644 main.vcxproj.user ``` 10. Изменим main.cpp, добавив ввод, но не обновим этот файл в git. Посмотрим статус репозитория: ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ 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 Untracked files: (use "git add ..." to include in what will be committed) .vs/ no changes added to commit (use "git add" and/or "git commit -a") ``` Видим, что в ветке main есть изменения не поставленные в очередь коммита, т.е изменённые: main.cpp. Если файл изменён, пишется "MODIFIED", если добавлен "New file" 11. Создадим коммит с вводом чисел: ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git add main.cpp gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git commit -m "code: Добавлена сумма" [main 8691b4c] code: Добавлена сумма 1 file changed, 6 insertions(+), 16 deletions(-) ``` Здесь я написал неправильную тему коммита: случайно посмотрел на следующий шаг с суммой Т.к VS 2022 в новом проекте создаёт текстовые подсказки, соответственно, они были добавлены при первом коммите "16 deletions(-)" означает, что я стёр эти 16 строк подсказок от VS 12. Добавим в программу вывод суммы и сделаем коммит, а потом и разность: ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git add -u gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git commit -m "code: Теперь точно сумма" [main 8420143] code: Теперь точно сумма 1 file changed, 1 insertion(+) gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git commit -a -m "code: Вывод разности" [main 666c1db] code: Вывод разности 1 file changed, 1 insertion(+), 1 deletion(-) ``` 13. Создал файл .gitignore и занёс в него сначала "/x64" и "IgnoreMe.txt" Между занесениями вводил git status Также внесём в git данный файл ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git status On branch main Untracked files: (use "git add ..." to include in what will be committed) .gitignore .vs/ nothing added to commit but untracked files present (use "git add" to track) gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git status On branch main Untracked files: (use "git add ..." to include in what will be committed) .gitignore .vs/ nothing added to commit but untracked files present (use "git add" to track) gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git add .gitignore gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git commit -m "git: Добавлен gitignore" [main 47a638a] git: Добавлен gitignore 1 file changed, 2 insertions(+) create mode 100644 .gitignore ``` Теперь в git не будут заноситься каталог /x64 и IgnoreMe.txt 14. Посмотрим историю коммитов в трёх исполнениях Просто вывод, сжато и сжато+дерево ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git log commit 47a638ac2e5b67440d3b54789198e27d6f0b96a6 (HEAD -> main) Author: Alice (GordiyevskikDA) Date: Sat Feb 24 08:06:21 2024 +0300 git: Добавлен gitignore commit 666c1db22fe3d91cbbdfa0e5f5bfe57422085a44 Author: Alice (GordiyevskikDA) Date: Sat Feb 24 08:03:11 2024 +0300 code: Вывод разности commit 8420143b31550bed0968db18177865aa4abd663c Author: Alice (GordiyevskikDA) Date: Sat Feb 24 08:02:25 2024 +0300 code: Теперь точно сумма commit 8691b4cd655d37576450d0c7f1c13f25443d21b1 Author: Alice (GordiyevskikDA) Date: Sat Feb 24 08:01:13 2024 +0300 code: Добавлена сумма commit ff38e89c0504016c1e017d7a0a92036a71024ba8 Author: Alice (GordiyevskikDA) Date: Sat Feb 24 07:58:44 2024 +0300 biuld: добавлены файлы проекта commit 6f61cde9d24a041fa32fd9a7dc0bdd84c5413d54 Author: Alice (GordiyevskikDA) Date: Sat Feb 24 07:57:05 2024 +0300 gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git log --oneline --decorate 47a638a (HEAD -> main) git: Добавлен gitignore 666c1db code: Вывод разности 8420143 code: Теперь точно сумма 8691b4c code: Добавлена сумма ff38e89 biuld: добавлены файлы проекта 6f61cde code: заготовка программы gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git log --oneline --decorate --all --graph * 47a638a (HEAD -> main) git: Добавлен gitignore * 666c1db code: Вывод разности * 8420143 code: Теперь точно сумма * 8691b4c code: Добавлена сумма * ff38e89 biuld: добавлены файлы проекта * 6f61cde code: заготовка программы ``` 15. Введём git log --stat и посмотрим, что он скажет относительно последнего коммита ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git log --stat commit 47a638ac2e5b67440d3b54789198e27d6f0b96a6 (HEAD -> main) Author: Alice (GordiyevskikDA) Date: Sat Feb 24 08:06:21 2024 +0300 git: Добавлен gitignore .gitignore | 2 ++ 1 file changed, 2 insertions(+) ``` Показывается хэш коммита, кто его сделал, точное время создания коммита с часовым поясом, тема коммита, добавленный файл. Показывается, сколько файлов изменено и сколько строк в этом файле вставлено 16. Посмотрим коммиты с темой "build" и коммиты, относящиеся к main.cpp ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git log -- main.sln commit ff38e89c0504016c1e017d7a0a92036a71024ba8 Author: Alice (GordiyevskikDA) Date: Sat Feb 24 07:58:44 2024 +0300 biuld: добавлены файлы проекта gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git log --grep "biuld" commit ff38e89c0504016c1e017d7a0a92036a71024ba8 Author: Alice (GordiyevskikDA) Date: Sat Feb 24 07:58:44 2024 +0300 biuld: добавлены файлы проекта ``` 17. Посмотрим предпоследний коммит ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git show HEAD~1 commit 666c1db22fe3d91cbbdfa0e5f5bfe57422085a44 Author: Alice (GordiyevskikDA) Date: Sat Feb 24 08:03:11 2024 +0300 code: Вывод разности diff --git a/main.cpp b/main.cpp index 74516c3..8b0c291 100644 --- a/main.cpp +++ b/main.cpp @@ -7,5 +7,5 @@ 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'; } \ No newline at end of file ``` Показывается хэш, автор, дата, время, тема. Код программы: - означает удаление указанной строки, а + добавление 18. Добавим печать произведения в программу но не станем пока делать коммит Посмотрим изменения в рабочей копии ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git diff diff --git a/main.cpp b/main.cpp index 8b0c291..6192c68 100644 --- a/main.cpp +++ b/main.cpp @@ -7,5 +7,5 @@ int main() cout << "Enter A and B: "; int a, b; cin >> a >> b; - cout << "A + B = " << a + b << '\n' << "A - B = " << a - b << '\n'; + cout << "A + B = " << a + b << '\n' << "A - B = " << a - b << '\n' << "A * B = " << a * b << '\n'; } \ No newline at end of file ``` Показывается хэш, автор, дата, время, тема. Код программы: - означает удаление указанной строки, а + добавление 19. Посмотрим изменения между самым первым коммитом и коммитом, добавляющим вывод разности Для этого используем хэши этих коммитов, которые написаны сильно выше ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git diff 6f61cde 666c1db diff --git a/main.cpp b/main.cpp index 8118e09..8b0c291 100644 --- a/main.cpp +++ b/main.cpp @@ -1,20 +1,11 @@ -// main.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы. -// +#include -#include +using namespace std; int main() { - std::cout << "Hello World!\n"; -} - -// Запуск программы: CTRL+F5 или меню "Отладка" > "Запуск без отладки" -// Отладка программы: F5 или меню "Отладка" > "Запустить отладку" - -// Советы по началу работы -// 1. В окне обозревателя решений можно добавлять файлы и управлять ими. -// 2. В окне Team Explorer можно подключиться к системе управления версиями. -// 3. В окне "Выходные данные" можно просматривать выходные данные сборки и другие сообщения. -// 4. В окне "Список ошибок" можно просматривать ошибки. -// 5. Последовательно выберите пункты меню "Проект" > "Добавить новый элемент", чтобы создать файлы кода, или "Проект" > "Добавить существующий элемент", чтобы добавить в проект существующие файлы кода. -// 6. Чтобы снова открыть этот проект позже, выберите пункты меню "Файл" > "Открыть" > "Проект" и выберите SLN-файл. + cout << "Enter A and B: "; + int a, b; + cin >> a >> b; + cout << "A + B = " << a + b << '\n' << "A - B = " << a - b << '\n'; +} ``` Перед первым коммитом я не почистил cpp файл от подсказок IDE. Видно, что потом они были удалены 6f61cde — хэш самого первого коммита, а 666c1db — коммита вывода разности 20. Закоммитим изменения в рабочей копии (вывод произведения) ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git add main.cpp gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git commit -m "code: вывод произведения" [main 2c1b088] code: вывод произведения 1 file changed, 1 insertion(+), 1 deletion(-) ``` 21. Откатимся к предпоследнему коммиту: ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git reset --hard HEAD~1 HEAD is now at 47a638a git: Добавлен gitignore ``` 22. Добавим над функцией main() комментарий и Уберем изменения в main.cpp другим способом — откатив этот файл к состоянию в последнем коммите (HEAD): ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git checkout HEAD -- main.cpp ``` 23. Сгенерируем приватный ключ для gitea на сайте кафедры ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ ssh-keygen Generating public/private ed25519 key pair. Enter file in which to save the key (/c/Users/gorda/.ssh/id_ed25519): ........ ``` 24. Запустим ssh-agent и загрузим ключ ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ eval $(ssh-agent -s) Agent pid 660 gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ ssh-add Identity added: /c/Users/gorda/.ssh/id_ed25519 (gorda@DESKTOP-2IL75KC) ``` 25. После добавления открытого ключа в профиль на git сайта кафедры связываем локальный и удалённый репозитарий и отправляем всё в облако ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git remote add origin http://uit.mpei.ru/git/GordiyevskikDA/cs-lab02.git gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git push -u origin main Enumerating objects: 21, done. Counting objects: 100% (21/21), done. Delta compression using up to 8 threads Compressing objects: 100% (19/19), done. Writing objects: 100% (21/21), 4.55 KiB | 1.51 MiB/s, done. Total 21 (delta 7), reused 0 (delta 0), pack-reused 0 remote: . Processing 1 references remote: Processed 1 references in total To http://uit.mpei.ru/git/GordiyevskikDA/cs-lab02.git * [new branch] main -> main branch 'main' set up to track 'origin/main'. ``` 26. На машине Боба. Клонируем репозитарий с облака, указав URL и папку Перейдём в папку проекта ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/bob $ git clone http://uit.mpei.ru/git/GordiyevskikDA/cs-lab02.git project Cloning into 'project'... remote: Enumerating objects: 24, done. remote: Counting objects: 100% (24/24), done. remote: Compressing objects: 100% (22/22), done. remote: Total 24 (delta 9), reused 0 (delta 0), pack-reused 0 Receiving objects: 100% (24/24), 4.81 KiB | 2.41 MiB/s, done. Resolving deltas: 100% (9/9), done. gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/bob $ cd project/ ``` 27. Настроим локальный репозитарий для Боба Изменим имя пользователя и email ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/bob/project (main) $ git config user.name "Bob (GordiyevskikDA)" gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/bob/project (main) $ git config user.email "gordiyevskikda@mpei.ru" ``` 28. Добавим печать произведения, сделаем коммит и отправим на сервер ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/bob/project (main) $ git add main.cpp gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/bob/project (main) $ git commit -m "code: Добавил произведение" [main fa9ce57] code: Добавил произведение 1 file changed, 1 insertion(+), 1 deletion(-) gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/bob/project (main) $ 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), 337 bytes | 337.00 KiB/s, done. Total 3 (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/GordiyevskikDA/cs-lab02.git 20f7ad4..fa9ce57 main -> main ``` 29. На машине Алисы загрузим изменения Боба ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ 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 2), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (3/3), 317 bytes | 31.00 KiB/s, done. From http://uit.mpei.ru/git/GordiyevskikDA/cs-lab02 20f7ad4..fa9ce57 main -> origin/main gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git log --oneline --decorate --all --graph * fa9ce57 (origin/main) code: Добавил произведение * 20f7ad4 (HEAD -> main) code: Вывод произведения * 47a638a git: Добавлен gitignore * 666c1db code: Вывод разности * 8420143 code: Теперь точно сумма * 8691b4c code: Добавлена сумма * ff38e89 biuld: добавлены файлы проекта * 6f61cde code: заготовка программы gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git pull --ff-only Updating 20f7ad4..fa9ce57 Fast-forward main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) ``` После введения первой команды земетим, что в рабочей копии изменений еще не произошло Просмотрим историю и увидим, ветка main отстает на один коммит от ветки origin/main (версии ветки main из удаленного репозитария под названием origin, то есть на сервере). Пододвинем Main к скачанной версии 29. Добавим в программу печать деления, сделаем коммит и отправим на сервер ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git add main.cpp gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git commit -m "code: Добавил частное" [main 22dd72f] code: Добавил частное 1 file changed, 1 insertion(+), 1 deletion(-) gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ 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), 358 bytes | 358.00 KiB/s, done. Total 3 (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/GordiyevskikDA/cs-lab02.git fa9ce57..22dd72f main -> main ``` 30. У Алисы. Дополним программу печатью максимума, сделаем коммит и отправим на сервер ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git add main.cpp gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git commit -m "code: Добавлена печать максимума" [main 92284ce] code: Добавлена печать максимума 1 file changed, 6 insertions(+) gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ 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), 390 bytes | 390.00 KiB/s, done. Total 3 (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/GordiyevskikDA/cs-lab02.git 22dd72f..92284ce main -> main ``` 31. На машине Боба: Не обновляя локальный репозитарий, добавим печать минимума, сделаем коммит и попытаемся отправить на сервер ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/bob/project (main) $ git add main.cpp gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/bob/project (main) $ git commit -m "code: Добавлена печать минимума" [main debe504] code: Добавлена печать минимума 1 file changed, 6 insertions(+) gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/bob/project (main) $ git push To http://uit.mpei.ru/git/GordiyevskikDA/cs-lab02.git ! [rejected] main -> main (fetch first) error: failed to push some refs to 'http://uit.mpei.ru/git/GordiyevskikDA/cs-lab02.git' hint: Updates were rejected because the remote contains work that you do not hint: have locally. This is usually caused by another repository pushing to hint: the same ref. If you want to integrate the remote changes, use hint: 'git pull' before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details. ``` Видно, что Git не дайт этого сделать, так как коммит Боба основан не на последнем существующем коммите 32. Посмотрим всю историю коммитов, предварительно загрузим их ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/bob/project (main) $ 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 2), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (3/3), 370 bytes | 37.00 KiB/s, done. From http://uit.mpei.ru/git/GordiyevskikDA/cs-lab02 22dd72f..92284ce main -> origin/main gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/bob/project (main) $ git log --oneline --decorate --all --graph * debe504 (HEAD -> main) code: Добавлена печать минимума | * 92284ce (origin/main, origin/HEAD) code: Добавлена печать максимума |/ * 22dd72f code: Добавил частное * fa9ce57 code: Добавил произведение * 20f7ad4 code: Вывод произведения * 47a638a git: Добавлен gitignore * 666c1db code: Вывод разности * 8420143 code: Теперь точно сумма * 8691b4c code: Добавлена сумма * ff38e89 biuld: добавлены файлы проекта * 6f61cde code: заготовка программы ``` Видно, что возник конфликт коммитов. Это можно понять по символам "|" перед последним удачно отправленным коммитом 33. Попытаемся перенести коммит Боба поверх коммита Алисы, то есть поверх origin/main ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/bob/project (main) $ git rebase origin/main Auto-merging main.cpp CONFLICT (content): Merge conflict in main.cpp error: could not apply debe504... 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 debe504... code: Добавлена печать минимума ``` На что получаем сообщение о конфликте кода. Необходимо сначала привести код Боба к тому виду, как у Алисы, а потом добавлять его функцию Сделаем это вручную. VS 2022 подсвечивает места конфликтов версий 34. После изменения кода нужно добавить файл в индекс и продолжить прерванную операцию rebase, а также отправим изменения на сервер: ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/bob/project (main|REBASE 1/1) $ git add main.cpp gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/bob/project (main|REBASE 1/1) $ git rebase --continue hint: Waiting for your editor to close the file... 0 [sig] bash 926! sigpacket::process: Suppressing signal 18 to win32 process (pid 20196) [detached HEAD cdf30fd] code: Добавлена печать минимума 1 file changed, 6 insertions(+) Successfully rebased and updated refs/heads/main. gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/bob/project (main) $ 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), 363 bytes | 363.00 KiB/s, done. Total 3 (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/GordiyevskikDA/cs-lab02.git 92284ce..cdf30fd main -> main ``` 35. Перейдём на машину Алисы. Создадим ветку double и перейдём в неё ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git branch double gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git checkout double Switched to branch 'double' gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (double) $ ``` Видим, что приглашение в командной строке изменилось. "(main)" стало "(double)" 36. Перейдём в ветку main, синхронзируем репозитарии и посмотрим историю: ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (double) $ git checkout main Switched to branch 'main' Your branch is up to date with 'origin/main'. gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ 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 2), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (3/3), 343 bytes | 31.00 KiB/s, done. From http://uit.mpei.ru/git/GordiyevskikDA/cs-lab02 92284ce..cdf30fd main -> origin/main gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git log --oneline --decorate --all --graph * dbeedcb (double) code: Изменён тип переменной | * cdf30fd (origin/main) code: Добавлена печать минимума |/ * 92284ce (HEAD -> main) code: Добавлена печать максимума * 22dd72f code: Добавил частное * fa9ce57 code: Добавил произведение * 20f7ad4 code: Вывод произведения * 47a638a git: Добавлен gitignore * 666c1db code: Вывод разности * 8420143 code: Теперь точно сумма * 8691b4c code: Добавлена сумма * ff38e89 biuld: добавлены файлы проекта * 6f61cde code: заготовка программы ``` Видим две вещи: 1) Версия кода Алисы не совпадает с версией кода Боба. Т.к. перед созданием ветки мы не сделали обновление локального репозитария 2) коммит с хэшем "dbeedcb", в котором мы меняли тип переменной в другой ветке 37. Сольём ветку double с главной ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git merge double Updating 92284ce..dbeedcb Fast-forward main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) ``` 38. Попытаемся отправить изменения на сервер Но т.к. существует конфликт версий, о котором я писал в шаге 36, получаем ошибку ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git push To http://uit.mpei.ru/git/GordiyevskikDA/cs-lab02.git ! [rejected] main -> main (non-fast-forward) error: failed to push some refs to 'http://uit.mpei.ru/git/GordiyevskikDA/cs-lab02.git' hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. If you want to integrate the remote changes, hint: use 'git pull' before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details. ``` Для исправления переключлся в ветку double, добавил правки Боба, создал коммит и отправил на сервер ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git checkout double Switched to branch 'double' M main.cpp gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (double) $ git add main.cpp gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (double) $ git commit -m "code: Изменён тип переменной (double)" [double ad91778] code: Изменён тип переменной (double) 1 file changed, 6 insertions(+) gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (double) $ git checkout main Switched to branch 'main' Your branch and 'origin/main' have diverged, and have 1 and 1 different commits each, respectively. (use "git pull" if you want to integrate the remote branch with yours) gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git merge double Updating dbeedcb..ad91778 Fast-forward main.cpp | 6 ++++++ 1 file changed, 6 insertions(+) gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ 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), 802 bytes | 802.00 KiB/s, done. Total 7 (delta 5), reused 0 (delta 0), pack-reused 0 remote: . Processing 1 references remote: Processed 1 references in total To http://uit.mpei.ru/git/GordiyevskikDA/cs-lab02.git cdf30fd..d77ebc2 main -> main ``` По причине того, что я не удалил коммит, который был сделан для кода бз правок Боба, но с изменением переменной Алисы, Он тоже загрузился на сервер, но его сразу перекрыл нужный. 39. Посмотрим историю всех веток репозитария ``` gorda@DESKTOP-2IL75KC MINGW64 ~/OneDrive/Рабочий стол/LABA2/alice/project (main) $ git log --oneline --decorate --all --graph * d77ebc2 (HEAD -> main, origin/main) merge branch 'main' of http://uit.mpei.ru/git/GordiyevskikDA/cs-lab02 |\ * | ad91778 (double) code: Изменён тип переменной (double) * | dbeedcb code: Изменён тип переменной |/ * cdf30fd code: Добавлена печать минимума * 92284ce code: Добавлена печать максимума * 22dd72f code: Добавил частное * fa9ce57 code: Добавил произведение * 20f7ad4 code: Вывод произведения * 47a638a git: Добавлен gitignore * 666c1db code: Вывод разности * 8420143 code: Теперь точно сумма * 8691b4c code: Добавлена сумма * ff38e89 biuld: добавлены файлы проекта * 6f61cde code: заготовка программы ``` Видно, что два предпоследних коммита находятся в другой ветке А последний коммит — слияние веток