Отчёт по лабораторной работе №2 «Система контроля версий Git» Выполнила: Артеменко А.Е. Группа: А-01-24 1. Вход в терминал и создание структуры каталогов Создаю на рабочем столе каталог lab02 и запускаю в нём Git Bash, мне выводит приглашение: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02 $ Смотрю файлы в рабочем каталоге с помощью команды ls, так как в каталоге пусто, ls ничего не выводит: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02 $ ls Создаю папки Алисы и Боба: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02 $ mkdir alice user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02 $ mkdir bob Перехожу в каталог Алисы с помощью команды cd и создаю в ней папку project. user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02 $ cd alice user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice $ mkdir project Выполняю вход в каталог cd, а после поднимаю на уровень выше cd .. и снова возвращаюсь в папку project user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice $ cd project user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project $ cd .. user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice $ cd project 1. Инициализация репозитария и настройка Git Инициализируем репозиторий в текущем каталоге project: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project $ git init Initialized empty Git repository in C:/Users/user/Desktop/lab02/alice/project/.git/ К приглашению командной строки добавилось (master): имя текущий ветви Git. Меняю текущее имя ветви master на имя main. user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (master) $ git branch -m main Настраиваю репозитарий Алисы: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git config user.name 'Alice (ArtemenkoAY)' user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git config user.email 'ArtemenkoAY@mpei.ru' 2. Создание коммитов Посмотрим состояние рабочей копии: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git status On branch main No commits yet Untracked files: (use "git add ..." to include in what will be committed) bin/ main.cpp obj/ project.cbp project.layout nothing added to commit but untracked files present (use "git add" to track) 1 строка – говорит о том, что мы находимся на ветке main. 2 строка – говорит о том, что коммиты отсутствуют. 3, 5-7 строки – показывает файлы, которые не отслеживаются git. 4 строка – подсказывает, как создать коммит. 8 строка – подсказывает, что нет коммитом, но есть не отслеживаемые файлы, которые можно закоммитить. Добавим файл main.cpp в индекс, то есть в набор изменений, который войдет в очередной коммит: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git add main.cpp Смотрю состояние рабочей копии: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git status On branch main Changes to be committed: (use "git restore --staged ..." to unstage) new file: main.cpp Untracked files: (use "git add ..." to include in what will be committed) bin/ obj/ project.cbp project.layout Появилась строка с файлом, который можно добавить в коммит. Выполним коммит с файлом main.cpp и коротким сообщением: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git commit -m 'code: заготовка программы' [main (root-commit) f4f7fa5] code: заготовка программы 1 file changed, 9 insertions(+) create mode 100644 main.cpp user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git status On branch main Untracked files: (use "git add ..." to include in what will be committed) bin/ obj/ project.cbp project.layout nothing added to commit but untracked files present (use "git add" to track) Теперь добавим файл project.cbp, т.е. проделаем тот же самый алгоритм user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git add project.cbp warning: in the working copy of 'project.cbp', LF will be replaced by CRLF the next time Git touches it user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git status On branch main Changes to be committed: (use "git restore --staged ..." to unstage) new file: project.cbp Untracked files: (use "git add ..." to include in what will be committed) bin/ obj/ project.layout Выполним коммит с файлом project.cbp и коротким сообщением user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git commit -m 'build: добавлен файл проекта' [main 6ee4e6b] build: добавлен файл проекта 1 file changed, 38 insertions(+) create mode 100644 project.cbp Меняю тело функции main() на ввод двух чисел, смотрю состояние репозитория: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/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) bin/ obj/ project.layout no changes added to commit (use "git add" and/or "git commit -a") 1 строка – говорит о том, что мы находимся на основной ветке. 2-4 строки – предлагают удалить изменения или обновить коммит. 5 - строка пишет, что файл main.cpp был изменен. 6-10 строки – не отслеживаемые файлы. Проделываем ряд изменений с кодом программы и делаем коммиты суммы и разности: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git add main.cpp user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git commit -m 'code: вывод суммы' [main 13bafc2] code: вывод суммы 1 file changed, 5 insertions(+), 2 deletions(-) user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git add -u user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git commit -m 'code: вывод разности' [main 149da8c] code: вывод разности 1 file changed, 1 insertion(+) 3. Игнорирование файлов Создаю в CodeBlocks файл .gitignore, где будут написаны названия файлов, которые нужно будет игнорировать. Данный файл также коммичу. user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git add .gitignore user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git commit -m 'git: игнорирование файлов' [main c03016f] git: игнорирование файлов 1 file changed, 4 insertions(+) create mode 100644 .gitignore Проверяю, чтобы необходимые файлы и каталоги не отображались: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git status On branch main nothing to commit, working tree clean 4. Просмотр истории Работа с журналом репозитария: Команда git log --stat, которая показывает файлы, изменённые в коммитах: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git log --stat commit c03016f9f6abb51433cd08096949acef2648472c (HEAD -> main) commit c03016f9f6abb51433cd08096949acef2648472c (HEAD -> main) Author: Alice (ArtemenkoAY) Date: Sun Mar 23 19:51:53 2025 +0300 git: игнорирование файлов .gitignore | 4 ++++ 1 file changed, 4 insertions(+) commit 149da8cbebafc64e97026448c62d0ca592f1b1a7 Author: Alice (ArtemenkoAY) Date: Sun Mar 23 19:41:41 2025 +0300 code: вывод разности main.cpp | 1 + 1 file changed, 1 insertion(+) commit 13bafc29058a21adaec5542b3d8f901bd397c7ed Author: Alice (ArtemenkoAY) Date: Sun Mar 23 19:39:44 2025 +0300 code: вывод суммы user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git log --main.cpp fatal: unrecognized argument: --main.cpp user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git log -- main.cpp commit 149da8cbebafc64e97026448c62d0ca592f1b1a7 Author: Alice (ArtemenkoAY) Date: Sun Mar 23 19:41:41 2025 +0300 code: вывод разности commit 13bafc29058a21adaec5542b3d8f901bd397c7ed Author: Alice (ArtemenkoAY) Date: Sun Mar 23 19:39:44 2025 +0300 code: вывод суммы commit f4f7fa5d1bb021ac6732ce0ba0fd23d0b9cc0c01 Author: Alice (ArtemenkoAY) Date: Sun Mar 23 19:32:18 2025 +0300 code: заготовка программы Для последнего коммита данная команда показывает: 1 строка - хэш коммита 2 строка - автор 3 строка - дата и время создания 4 строка - комментарий 5 строка - файл, который был изменён, количество изменённых строчек 6 строчка - статистика изменений данных файлов Коммиты по теме build: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git log --grep 'build' commit 6ee4e6b18ec8209422a8ac1a41d406c9cdc43ca7 Author: Alice (ArtemenkoAY) Date: Sun Mar 23 19:36:01 2025 +0300 build: добавлен файл проекта Коммиты, затрагивающие project.cbp: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git log -- project.cbp commit 6ee4e6b18ec8209422a8ac1a41d406c9cdc43ca7 Author: Alice (ArtemenkoAY) Date: Sun Mar 23 19:36:01 2025 +0300 build: добавлен файл проекта Таким способом мы просмотрели информацию о коммите по измененному файлу и по теме коммита. Просмотр коммитов: Далее тремя эквивалентными способами просматриваем информацию о предпоследнем коммите. 1. При помощи отступа на 1 коммит: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git show HEAD~1 commit 149da8cbebafc64e97026448c62d0ca592f1b1a7 Author: Alice (ArtemenkoAY) Date: Sun Mar 23 19:41:41 2025 +0300 code: вывод разности diff --git a/main.cpp b/main.cpp index 1967dd8..f77bbcc 100644 --- a/main.cpp +++ b/main.cpp @@ -8,5 +8,6 @@ int main() int a, b; cin >> a >> b; cout << "A + B = " << a + b << '\n'; + cout << "A - B = " << a - b << '\n'; } 2. При помощи обращении к самой ветке main и отступу на 1 коммит: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git show main~1 commit 149da8cbebafc64e97026448c62d0ca592f1b1a7 Author: Alice (ArtemenkoAY) Date: Sun Mar 23 19:41:41 2025 +0300 code: вывод разности diff --git a/main.cpp b/main.cpp index 1967dd8..f77bbcc 100644 --- a/main.cpp +++ b/main.cpp @@ -8,5 +8,6 @@ int main() int a, b; cin >> a >> b; cout << "A + B = " << a + b << '\n'; + cout << "A - B = " << a - b << '\n'; } 3. Обращаясь к коммиту через его хеш user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git show 149da8cbebafc64e97026448c62d0ca592f1b1a7 commit 149da8cbebafc64e97026448c62d0ca592f1b1a7 Author: Alice (ArtemenkoAY) Date: Sun Mar 23 19:41:41 2025 +0300 code: вывод разности diff --git a/main.cpp b/main.cpp index 1967dd8..f77bbcc 100644 --- a/main.cpp +++ b/main.cpp @@ -8,5 +8,6 @@ int main() int a, b; cin >> a >> b; cout << "A + B = " << a + b << '\n'; + cout << "A - B = " << a - b << '\n'; } Просмотр изменений Внесем изменения в main.cpp: добавим печать произведения чисел, но не станем пока делать коммит. Просмотрим изменения в рабочей копии: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git diff diff --git a/main.cpp b/main.cpp index f77bbcc..8d75565 100644 --- a/main.cpp +++ b/main.cpp @@ -9,5 +9,5 @@ int main() cin >> a >> b; cout << "A + B = " << a + b << '\n'; cout << "A - B = " << a - b << '\n'; - + cout << "A * B = " << a * b << '\n'; } 1 строка - файлы, которые сравнивает команда: a/main.cpp (старая версия файла) и b/main.cpp (новая версия файла). 2 строка - хэши старой и новой версий файла. 5 строка - в каких строках произошли изменения и количество строк в старом и новом файлах. 6 - 10 строка - показывает, что изменилось в строках, что осталось таким же. Изменения между самым первым коммитом и коммитом, добавляющим вывод разности: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git diff f4f7fa5d1bb021ac6732ce0ba0fd23d0b9cc0c01 149da8cbebafc64e97026448c62d0ca592f1b1a7 diff --git a/main.cpp b/main.cpp index b4392ec..f77bbcc 100644 --- a/main.cpp +++ b/main.cpp @@ -4,6 +4,10 @@ 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'; + cout << "A - B = " << a - b << '\n'; + } diff --git a/project.cbp b/project.cbp new file mode 100644 index 0000000..c4697a9 --- /dev/null +++ b/project.cbp @@ -0,0 +1,38 @@ 5. Откат изменений Закоммитим изменения в рабочей копии (вывод произведения): user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git commit -m: 'code: вывод произведения' error: pathspec 'code: вывод произведения' did not match any file(s) known to git user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git add main.cpp user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git commit -m 'code: вывод произведения' [main c05dcd7] code: вывод произведения 1 file changed, 1 insertion(+), 1 deletion(-) Вносим изменения в код, а потом откатываем их до состояния в определенном коммите с помощью команды git reset: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git reset --hard HEAD~1 HEAD is now at c03016f git: игнорирование файлов Добавим над функцией main() комментарий: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ # you may type whatever you want Уберем изменения в main.cpp другим способом — откатив этот файл к состоянию в последнем коммите (HEAD): user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git checkout HEAD -- main.cpp 6. Обмен кодом через удаленное хранилище Обмен кодом через удалённое хранилище. Для загрузки данных в репозитарий GitHub будет использоваться протокол SSH. Поэтому для обмена данными с сервером нужно сгенерировать пару из открытого и закрытого ключей. user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ ssh-keygen Generating public/private ed25519 key pair. Enter file in which to save the key (/c/Users/user/.ssh/id_ed25519): 1234 Enter passphrase for "1234" (empty for no passphrase): Enter same passphrase again: Your identification has been saved in 1234 Your public key has been saved in 1234.pub The key fingerprint is: SHA256:TrF57TZXY8hnZk7BsMnOVdyMwMMX/7CO42xABSLAn1E user@WIN-0E2RN91IREF The key's randomart image is: +--[ED25519 256]--+ | .....E .+.o.=o| | . .. . * B.=| | . o. . *.+.| | o +..+ ooo| | S.. .=.Oo| | o ... oO..| | . .* o. | | +.+ | | .o | +----[SHA256]-----+ user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ eval $(ssh-agent -s) Agent pid 1632 user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ ssh-add user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ ssh-add 1234 Enter passphrase for 1234: Identity added: 1234 (user@WIN-0E2RN91IREF) user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ cat 1234.pub ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJsfdrIXpoRC8oz8Yb0nvDW/14kGjNtiaxVJW+gq2zje user@WIN-0E2RN91IREF Добавим репозитарий на который будем загружать хранилище git, и загрузим хранилище git на GitHub с помощью команды git push: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git remote set-url origin http://uit.mpei.ru/git/ArtemenkoAY/cs-lab02.git user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git push -u origin main warning: auto-detection of host provider took too long (>2000ms) warning: see https://aka.ms/gcm/autodetect for more information. warning: use of unencrypted HTTP remote URLs is not recommended; see https://aka.ms/gcm/unsaferemotes for more information. warning: auto-detection of host provider took too long (>2000ms) warning: see https://aka.ms/gcm/autodetect for more information. Enumerating objects: 15, done. Counting objects: 100% (15/15), done. Delta compression using up to 4 threads Compressing objects: 100% (13/13), done. Writing objects: 100% (15/15), 2.00 KiB | 146.00 KiB/s, done. Total 15 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0) remote: . Processing 1 references remote: Processed 1 references in total To http://uit.mpei.ru/git/ArtemenkoAY/cs-lab02.git * [new branch] main -> main branch 'main' set up to track 'origin/main'. user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git remote -v origin http://uit.mpei.ru/git/ArtemenkoAY/cs-lab02.git (fetch) origin http://uit.mpei.ru/git/ArtemenkoAY/cs-lab02.git (push) Получение проекта с сервера Предположим, к разработке проекта присоединяется Боб. Откроем рабочую копию с машины Боба: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/bob $ git clone http://uit.mpei.ru/git/ArtemenkoAY/cs-lab02.git project Cloning into 'project'... remote: Enumerating objects: 15, done. remote: Counting objects: 100% (15/15), done. remote: Compressing objects: 100% (13/13), done. remote: Total 15 (delta 1), reused 0 (delta 0), pack-reused 0 Receiving objects: 100% (15/15), done. Resolving deltas: 100% (1/1), done. user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/bob $ cd project Настроим хранилище Боба: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/bob/project (main) $ git config user.name 'Bob (ArtemenkoAY)' user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/bob/project (main) $ git config user.email 'ArtemenkoAYI@mpei.ru' 7. Совместная работа над проектом без конфликтов правок Боб добавляет новый коммит, опережающий версию на сервере, и загружает его на GitHub. «На машине Боба» добавляем в программу печать произведения чисел и делаем коммит: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/bob/project (main) $ git add main.cpp user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/bob/project (main) $ git commit -m 'code: вывод произведения' [main 98cdbca] code: вывод произведения 1 file changed, 1 insertion(+) Отправляем коммит на сервер: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/bob/project (main) $ git push warning: auto-detection of host provider took too long (>2000ms) warning: see https://aka.ms/gcm/autodetect for more information. Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 4 threads Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 420 bytes | 140.00 KiB/s, done. Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0) remote: . Processing 1 references remote: Processed 1 references in total To http://uit.mpei.ru/git/ArtemenkoAY/cs-lab02.git c03016f..98cdbca main -> main «На машине Алисы» (то есть в первом терминале, в каталоге alice/project) выполните загрузку изменений: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/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 1), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (3/3), 400 bytes | 14.00 KiB/s, done. From http://uit.mpei.ru/git/ArtemenkoAY/cs-lab02 c03016f..98cdbca main -> origin/main Убедимся, что в рабочей копии изменений еще не произошло. Для этого посмотрим историю всех веток: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git log --oneline --decorate --all --graph * 98cdbca (origin/main, origin/HEAD) code: вывод произведения * c03016f (HEAD -> main) git: игнорирование файлов * 149da8c code: вывод разности * 13bafc2 code: вывод суммы * 6ee4e6b build: добавлен файл проекта * f4f7fa5 code: заготовка программы Как можно видеть, ветка main отстает на один коммит от ветки origin/main. Продвинем ветку main к скачанной версии: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git pull --ff-only Updating c03016f..98cdbca Fast-forward main.cpp | 1 + 1 file changed, 1 insertion(+) «От имени Алисы» добавляем в программу печать деления, а после коммит: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git add main.cpp user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git commit -m 'code: вывод деления' [main 103f0b2] code: вывод деления 1 file changed, 1 insertion(+), 1 deletion(-) Загружаем изменения на сервер: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git push Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 4 threads Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 401 bytes | 401.00 KiB/s, done. Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0) remote: . Processing 1 references remote: Processed 1 references in total To http://uit.mpei.ru/git/ArtemenkoAY/cs-lab02.git 98cdbca..103f0b2 main -> main И получаем новую версию «на машине Боба»: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/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 1), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (3/3), 381 bytes | 6.00 KiB/s, done. From http://uit.mpei.ru/git/ArtemenkoAY/cs-lab02 98cdbca..103f0b2 main -> origin/main Ветка main, как мы знаем, отстает на один коммит от ветки origin/main. Продвинем ветку main к скачанной версии: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/bob/project (main) $ git pull --ff-only Updating 98cdbca..103f0b2 Fast-forward main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 8. Разрешение конфликтов правок при совместной работе Далее, Алиса решает добавить в программу печать максимума из чисел, а Боб — минимума. От лица Алисы, добавляем печать максимума: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git add main.cpp user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git commit -m 'code: вывод максимума' [main d777285] code: вывод максимума 1 file changed, 1 insertion(+) Загружаем изменения на сервер от лица Алисы: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git push Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 4 threads Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 409 bytes | 204.00 KiB/s, done. Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0) remote: . Processing 1 references remote: Processed 1 references in total To http://uit.mpei.ru/git/ArtemenkoAY/cs-lab02.git 103f0b2..d777285 main -> main От лица Боб, добавляем печать минимума: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/bob/project (main) $ git add main.cpp user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/bob/project (main) $ git commit -m 'code: вывод минимума' [main d84e249] code: вывод минимума 1 file changed, 1 insertion(+) Загружаем изменения на сервер от лица Боба: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/bob/project (main) $ git push To http://uit.mpei.ru/git/ArtemenkoAY/cs-lab02.git ! [rejected] main -> main (fetch first) error: failed to push some refs to 'http://uit.mpei.ru/git/ArtemenkoAY/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. Однако загрузить на сервер изменения получается только у Алисы потому, что Боб затем пытается загрузить версию, основанную на более старом коммите, чем самый новый коммит в репозитарии GitHub. Загрузим версию с сервера: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/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 1), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (3/3), 389 bytes | 7.00 KiB/s, done. From http://uit.mpei.ru/git/ArtemenkoAY/cs-lab02 103f0b2..d777285 main -> origin/main Можно видеть, что ветка main локального репозитария разошлась с веткой origin/main, то есть с веткой main на сервере. user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/bob/project (main) $ git log --oneline --decorate --all --graph * d84e249 (HEAD -> main) code: вывод минимума | * d777285 (origin/main, origin/HEAD) code: вывод максимума |/ * 103f0b2 code: вывод деления * 98cdbca code: вывод произведения * c03016f git: игнорирование файлов * 149da8c code: вывод разности * 13bafc2 code: вывд суммы * 6ee4e6b build: добавлен файл проекта * f4f7fa5 code: заготовка программы Бобу нужно переместить свой коммит поверх коммита Алисы, то есть поверх origin/main: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/bob/project (main) $ git rebase origin/main Auto-merging main.cpp CONFLICT (content): Merge conflict in main.cpp error: could not apply d84e249... 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". hint: Disable this message with "git config set advice.mergeConflict false" Could not apply d84e249... code: вывод минимума Комманда завершается с ошибкой из-за конфликта в файле с кодом main.cpp. Производный файл от файла Алисы и Боба записывается в рабочую копию с помеченными метками конфликта. Убираем метки конфликта, и дорабатываем код так, чтобы программа компилировалась и работала. Затем загружаем изменения в индекс и продолжаем операцию git rebase, с помощью флага –continue. user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/bob/project (main|REBASE 1/1) $ git add main.cpp user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/bob/project (main|REBASE 1/1) $ git rebase --continue hint: Waiting for your editor to close the file... (electron) Sending uncompressed crash reports is deprecated and will be removed in a future version of Electron. Set { compress: true } to opt-in to the new behavior. Crash reports will be uploaded gzipped, which most crash reporting servers support. (node:12404) electron: The default of contextIsolation is deprecated and will be changing from false to true in a future release of Electron. See https://github.com/electron/electron/issues/23506 for more information (node:2328) Electron: Loading non-context-aware native module in renderer: '\\?\C:\Users\user\AppData\Local\atom\app-1.63.1\resources\app.asar.unpacked\node_modules\superstring\build\Release\superstring.node'. This is deprecated, see https://github.com/electron/electron/issues/18397. (node:2328) Electron: Loading non-context-aware native module in renderer: '\\?\C:\Users\user\AppData\Local\atom\app-1.63.1\resources\app.asar.unpacked\node_modules\pathwatcher\build\Release\pathwatcher.node'. This is deprecated, see https://github.com/electron/electron/issues/18397. (node:2328) Electron: Loading non-context-aware native module in renderer: '\\?\C:\Users\user\AppData\Local\atom\app-1.63.1\resources\app.asar.unpacked\node_modules\oniguruma\build\Release\onig_scanner.node'. This is deprecated, see https://github.com/electron/electron/issues/18397. (node:2328) Electron: Loading non-context-aware native module in renderer: '\\?\C:\Users\user\AppData\Local\atom\app-1.63.1\resources\app.asar.unpacked\node_modules\tree-sitter-c\build\Release\tree_sitter_c_binding.node'. This is deprecated, see https://github.com/electron/electron/issues/18397. (node:2328) Electron: Loading non-context-aware native module in renderer: '\\?\C:\Users\user\AppData\Local\atom\app-1.63.1\resources\app.asar.unpacked\node_modules\tree-sitter-cpp\build\Release\tree_sitter_cpp_binding.node'. This is deprecated, see https://github.com/electron/electron/issues/18397. (node:2328) Electron: Loading non-context-aware native module in renderer: '\\?\C:\Users\user\AppData\Local\atom\app-1.63.1\resources\app.asar.unpacked\node_modules\tree-sitter-css\build\Release\tree_sitter_css_binding.node'. This is deprecated, see https://github.com/electron/electron/issues/18397. (node:2328) Electron: Loading non-context-aware native module in renderer: '\\?\C:\Users\user\AppData\Local\atom\app-1.63.1\resources\app.asar.unpacked\node_modules\tree-sitter-go\build\Release\tree_sitter_go_binding.node'. This is deprecated, see https://github.com/electron/electron/issues/18397. (node:2328) Electron: Loading non-context-aware native module in renderer: '\\?\C:\Users\user\AppData\Local\atom\app-1.63.1\resources\app.asar.unpacked\node_modules\tree-sitter-embedded-template\build\Release\tree_sitter_embedded_template_binding.node'. This is deprecated, see https://github.com/electron/electron/issues/18397. (node:2328) Electron: Loading non-context-aware native module in renderer: '\\?\C:\Users\user\AppData\Local\atom\app-1.63.1\resources\app.asar.unpacked\node_modules\tree-sitter-html\build\Release\tree_sitter_html_binding.node'. This is deprecated, see https://github.com/electron/electron/issues/18397. (node:2328) Electron: Loading non-context-aware native module in renderer: '\\?\C:\Users\user\AppData\Local\atom\app-1.63.1\resources\app.asar.unpacked\node_modules\tree-sitter-java-dev\build\Release\tree_sitter_java_binding.node'. This is deprecated, see https://github.com/electron/electron/issues/18397. (node:2328) Electron: Loading non-context-aware native module in renderer: '\\?\C:\Users\user\AppData\Local\atom\app-1.63.1\resources\app.asar.unpacked\node_modules\tree-sitter-javascript\build\Release\tree_sitter_javascript_binding.node'. This is deprecated, see https://github.com/electron/electron/issues/18397. (node:2328) Electron: Loading non-context-aware native module in renderer: '\\?\C:\Users\user\AppData\Local\atom\app-1.63.1\resources\app.asar.unpacked\node_modules\tree-sitter-jsdoc\build\Release\tree_sitter_jsdoc_binding.node'. This is deprecated, see https://github.com/electron/electron/issues/18397. (node:2328) Electron: Loading non-context-aware native module in renderer: '\\?\C:\Users\user\AppData\Local\atom\app-1.63.1\resources\app.asar.unpacked\node_modules\tree-sitter-regex\build\Release\tree_sitter_regex_binding.node'. This is deprecated, see https://github.com/electron/electron/issues/18397. (node:2328) Electron: Loading non-context-aware native module in renderer: '\\?\C:\Users\user\AppData\Local\atom\app-1.63.1\resources\app.asar.unpacked\node_modules\tree-sitter-json\build\Release\tree_sitter_json_binding.node'. This is deprecated, see https://github.com/electron/electron/issues/18397. (node:2328) Electron: Loading non-context-aware native module in renderer: '\\?\C:\Users\user\AppData\Local\atom\app-1.63.1\resources\app.asar.unpacked\node_modules\tree-sitter-python\build\Release\tree_sitter_python_binding.node'. This is deprecated, see https://github.com/electron/electron/issues/18397. (node:2328) Electron: Loading non-context-aware native module in renderer: '\\?\C:\Users\user\AppData\Local\atom\app-1.63.1\resources\app.asar.unpacked\node_modules\tree-sitter-ruby\build\Release\tree_sitter_ruby_binding.node'. This is deprecated, see https://github.com/electron/electron/issues/18397. (node:2328) Electron: Loading non-context-aware native module in renderer: '\\?\C:\Users\user\AppData\Local\atom\app-1.63.1\resources\app.asar.unpacked\node_modules\tree-sitter-rust\build\Release\tree_sitter_rust_binding.node'. This is deprecated, see https://github.com/electron/electron/issues/18397. (node:2328) Electron: Loading non-context-aware native module in renderer: '\\?\C:\Users\user\AppData\Local\atom\app-1.63.1\resources\app.asar.unpacked\node_modules\tree-sitter-bash\build\Release\tree_sitter_bash_binding.node'. This is deprecated, see https://github.com/electron/electron/issues/18397. (node:2328) Electron: Loading non-context-aware native module in renderer: '\\?\C:\Users\user\AppData\Local\atom\app-1.63.1\resources\app.asar.unpacked\node_modules\tree-sitter-typescript\build\Release\tree_sitter_tsx_binding.node'. This is deprecated, see https://github.com/electron/electron/issues/18397. (node:2328) Electron: Loading non-context-aware native module in renderer: '\\?\C:\Users\user\AppData\Local\atom\app-1.63.1\resources\app.asar.unpacked\node_modules\tree-sitter-typescript\build\Release\tree_sitter_typescript_binding.node'. This is deprecated, see https://github.com/electron/electron/issues/18397. (node:12404) electron: The default of contextIsolation is deprecated and will be changing from false to true in a future release of Electron. See https://github.com/electron/electron/issues/23506 for more information (node:2328) Electron: Loading non-context-aware native module in renderer: '\\?\C:\Users\user\AppData\Local\atom\app-1.63.1\resources\app.asar.unpacked\node_modules\spellchecker\build\Release\spellchecker.node'. This is deprecated, see https://github.com/electron/electron/issues/18397. (node:2328) Electron: Loading non-context-aware native module in renderer: '\\?\C:\Users\user\AppData\Local\atom\app-1.63.1\resources\app.asar.unpacked\node_modules\git-utils\build\Release\git.node'. This is deprecated, see https://github.com/electron/electron/issues/18397. (node:2328) Electron: Loading non-context-aware native module in renderer: '\\?\C:\Users\user\AppData\Local\atom\app-1.63.1\resources\app.asar.unpacked\node_modules\@atom\nsfw\build\Release\nsfw.node'. This is deprecated, see https://github.com/electron/electron/issues/18397. Attempting to call a function in a renderer window that has been closed or released. Function provided here: Object. (C:\Users\user\AppData\Local\atom\app-1.63.1\resources\app.asar\node_modules\github\lib\worker.js:64:22 Remote event names: crashed, destroyed [detached HEAD 92cf582] code: вывод минимума 1 file changed, 2 insertions(+) Successfully rebased and updated refs/heads/main. Отправим изменения на сервер: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/bob/project (main) $ git push Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 4 threads Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 416 bytes | 208.00 KiB/s, done. Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0) remote: . Processing 1 references remote: Processed 1 references in total To http://uit.mpei.ru/git/ArtemenkoAY/cs-lab02.git d777285..92cf582 main -> main user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git pull --ff-only 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), 396 bytes | 7.00 KiB/s, done. From http://uit.mpei.ru/git/ArtemenkoAY/cs-lab02 d777285..92cf582 main -> origin/main Updating d777285..92cf582 Fast-forward main.cpp | 2 ++ 1 file changed, 2 insertions(+) user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git log commit 92cf5822e746a681143206a7f8ca57857507fb73 (HEAD -> main, origin/main, origin/HEAD) Author: Bob (ArtemenkoAY) Date: Mon Mar 24 16:11:57 2025 +0300 code: вывод минимума commit d7772852e578b47185b4140824dc02cfa8744c3c Author: Alice (ArtemenkoAY) Date: Mon Mar 24 16:07:07 2025 +0300 code: вывод максимума commit 103f0b2532c5cfefe97a5bdd8e6bf13957204757 Author: Alice (ArtemenkoAY) Date: Mon Mar 24 13:38:56 2025 +0300 code: вывод деления commit 98cdbca4cd7bdfbd5795c326962db6de9e775736 Author: Bob (ArtemenkoAY) Date: Mon Mar 24 13:25:54 2025 +0300 Получили желаемый результат. 9. Использование веток Пока Боб синхронизирует изменения, Алиса меняет целые числа на действительные, для этого создадим отдельную ветку double т.к. это может занять время. user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git branch double Переключаюсь с ветки main на ветку double: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git checkout double Switched to branch 'double' Меняем тип данных и коммитим изменения в файле: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (double) $ git add main.cpp user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (double) $ git commit -m 'code: изменение типа данных' [double 44e5418] code: изменение типа данных 1 file changed, 1 insertion(+), 1 deletion(-) Обратно переключаемся на ветку main: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (double) $ git checkout main Switched to branch 'main' Your branch is up to date with 'origin/main'. Синхронизируем ветку main: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git fetch Получаем одновременно две ветки: user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git log --oneline --decorate --all --graph * 44e5418 (double) code: изменение типа данных * 92cf582 (HEAD -> main, origin/main, origin/HEAD) code: вывод минимума * d777285 code: вывод максимума * 103f0b2 code: вывод деления * 98cdbca code: вывод произведения * c03016f git: игнорирование файлов * 149da8c code: вывод разности * 13bafc2 code: вывод суммы * 6ee4e6b build: добавлен файл проекта * f4f7fa5 code: заготовка программы Объединяем ветки double и main. Вносим последние изменения и загружаем на GitHub. user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git merge double Updating 92cf582..44e5418 Fast-forward main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) user@WIN-0E2RN91IREF MINGW64 ~/Desktop/lab02/alice/project (main) $ git push Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 4 threads Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 396 bytes | 198.00 KiB/s, done. Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0) remote: . Processing 1 references remote: Processed 1 references in total To http://uit.mpei.ru/git/ArtemenkoAY/cs-lab02.git 92cf582..44e5418 main -> main