# Отчёт по лабораторной работе №2 "Применение системы контроля версий в Git" # ## Вход в терминал и создание структуры каталогов ## Создаю каталог lab02 для данной ЛР и запускаю в нём Git Bash. Вижу приглашение, указывающее путь к рабочему каталогу и символ $: ``` /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02 $ ``` Создаю папки lab02/alice и lab02/bob, имитирующие компьютеры Алисы и Боба: ``` mkdir alice mkdir bob ``` Создаю на компьютере Алисы каталог Project и перехожу в него ``` $ cd alice ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice $ mkdir project ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice $ cd project ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project ``` Поднимаюсь на уровень выше и возвращаюсь в Project ``` $ cd .. ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice $ cd project ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project ``` ## Инициализация репозитария и настройка Git ## Инициализирую репозитарий в текущем каталоге project (при установке Git был настроен так, чтобы ветка по умолчанию нахывалась main): ``` $ git init Initialized empty Git repository in D:/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project/.git/ ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` Настройка репозитария Алисы ``` $ git config user.name 'Alice (BadaninaSP)' ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) $ git config user.email 'BadaninaSP@mpei.ru' ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` ## Создание коммитов ## Запускаю CodeBlocks и создаю проект в репозитарии Алисы: *Project title: project *Folder to create project in: C:\Users\user\Desktop\lab02\alice *Project filename: project.cbp *Resulting filename: *C:\Users\user\Desktop\lab02\alice\project\project.cbp После сборки проекта получена нужная структура файлов и каталогов. ## Занесение файлов под контроль версий ## Просмотр состояния рабочей копии ``` $ 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.depend nothing added to commit but untracked files present (use "git add" to track) ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` В ветке main нет коммитов, папки bin/, obj/ и файлы main.c, project.cbp, project.depend не отслеживаются. Добавляю main.cpp в индекс ``` $ git add main.cpp ``` Снова смотрю состояние рабочей копии ``` $ git status On branch main 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) bin/ obj/ project.cbp project.depend ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` В очередной коммит войдёт только файл main.cpp, остальные файлы и папки не отслеживаются. Делаю коммит с этим файлом ``` $ git commit -m 'code: заготовка программы' [main (root-commit) 0cda65b] code: заготовка программы 1 file changed, 9 insertions(+) create mode 100644 main.cpp ``` ## Составление сообщений к коммитам ## Добавляю файл проекта в индекс ``` $ git add project.cbp warning: in the working copy of 'project.cbp', LF will be replaced by CRLF the next time Git touches it ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/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.depend ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` и делаю коммит с ним ``` $ git commit -m 'build: добавлен файл проекта' [main fab7219] build: добавлен файл проекта 1 file changed, 40 insertions(+) create mode 100644 project.cbp ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` ## Создание коммитов с изменениями ## 1. Состояние рабочей копии до изменения main.cpp ``` $ git status On branch main Untracked files: (use "git add ..." to include in what will be committed) bin/ obj/ project.depend nothing added to commit but untracked files present (use "git add" to track) ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` Заменяю содержимое функции main(): ``` cout << "Enter A and B: "; int a, b; cin >> a >> b; ``` После изменения main.cpp Git отображает наличие изменений в файле main.cpp, которые не выставлены на коммит ``` $ 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.depend no changes added to commit (use "git add" and/or "git commit -a") ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` Делаю коммит с обновлённым файлом ``` $ git add main.cpp ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) $ git commit -m 'code: добавлен ввод двух чисел' [main fca14d8] code: добавлен ввод двух чисел 1 file changed, 3 insertions(+), 2 deletions(-) ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` 2. Добавляю в программу вывод суммы a и b, дописав в конце main() строку ```cout << "A + B = " << a + b;``` и снова делаю коммит ``` $ git add -u ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) $ git status On branch main Changes to be committed: (use "git restore --staged ..." to unstage) modified: main.cpp Untracked files: (use "git add ..." to include in what will be committed) bin/ obj/ project.depend ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) $ git commit -m 'code: добавлен вывод суммы a и b' [main da84366] code: добавлен вывод суммы a и b 1 file changed, 1 insertion(+) ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` 3. Добавляю в программу вывод разности a и b, изменив инструкцию cout в main(): ``` cout << "A + B = " << a + b << '\n' << "A - B = " << a - b << '\n'; ``` и делаю коммит ``` $ git commit -a -m 'code: добавлен вывод разности a и b' [main 703d751] code: добавлен вывод разности a и b 1 file changed, 2 insertions(+), 1 deletion(-) ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` ## Игнорирование файлов ## Создаю файл .gitignore, в котором указываю файлы, которые не нуждаются в контроле версий и должны игнорироваться: ``` /bin /obj *.layout project.depend ``` Теперь эти файлы не отображаются как неотслеживаемые и просто игнорируются: ``` $ git status On branch main Untracked files: (use "git add ..." to include in what will be committed) .gitignore nothing added to commit but untracked files present (use "git add" to track) ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` Создаю коммит с .gitignore ``` $ git add .gitignore ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) $ git commit -m 'git: добавлен .gitignore' [main 59cb19c] git: добавлен .gitignore 1 file changed, 4 insertions(+) create mode 100644 .gitignore ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` ## Просмотр истории ## ### Работа с журналом репозитария ### Вывод команды git log --stat для последнего коммита: ``` $ git log --stat commit 59cb19c306ff2257f830406d60ad1fc785c88c33 (HEAD -> main) Author: Alice (BadaninaSP) Date: Mon Feb 2 01:25:04 2026 +0400 git: добавлен .gitignore .gitignore | 4 ++++ 1 file changed, 4 insertions(+) ``` Первая строка - хэш текущего коммита и указание на ветку, в которой он находится. Вторая строка - автор коммита (здесь это Алиса). Третья строка - дата и время, когда совершён коммит. Четвёртая строка - заголовок коммита. Пятая строка - имя изменённого файла и количество изменений. Шестая строка - один файл изменён, 4 вставки. Вывод коммитов по теме build: ``` $ git log --grep "build:" commit fab7219f8b1c6faf26857c85e61a86f759905b87 Author: Alice (BadaninaSP) Date: Sun Feb 1 02:03:46 2026 +0400 build: добавлен файл проекта ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` Вывод коммитов, затрагивающих project.cbp: ``` $ git log -- project.cbp commit fab7219f8b1c6faf26857c85e61a86f759905b87 Author: Alice (BadaninaSP) Date: Sun Feb 1 02:03:46 2026 +0400 build: добавлен файл проекта ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` ### Просмотр коммитов ### Просмотр предпоследнего коммита ``` $ git show HEAD~1 commit 703d7515ac3c339930c278c035cbfb96bb5a65f1 Author: Alice (BadaninaSP) Date: Mon Feb 2 01:15:24 2026 +0400 code: добавлен вывод разности a и b diff --git a/main.cpp b/main.cpp index 4364dbc..65442c3 100644 --- a/main.cpp +++ b/main.cpp @@ -7,5 +7,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'; } ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` ### Просмотр изменений ### Добавляю в программу вывод произведения a и b, изменив инструкцию cout в main(): ``` cout << "A + B = " << a + b << '\n' << "A - B = " << a - b << '\n' << "A * B = " << a * b << '\n'; ``` коммит пока не делаю. Просматриваю изменения в рабочей копии: ``` $ git diff diff --git a/main.cpp b/main.cpp index 65442c3..f94f092 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' - << "A - B = " << a - b << '\n'; + << "A - B = " << a - b << '\n' + << "A * B = " << a * b << '\n'; } ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` Первая строка вывода - заголовок, сравниваются две версии одного файла: a/ - версия до изменений (в последнем коммите) и b/ - версия после изменений (в рабочей директории). Вторая строка - хэши файлов (blob-объектов, 65442c3 - старый файл из предыдущего коммита, f94f092 - новый файл в рабочей директории) и режим доступа к этим файлам. Третья строка - имя старой версии файла. Четвёртая строка - имя новой версии файла. Пятая строка - диапазон выведенных строк: начиная с 8-й строки выведены 5 строк старого файла и 6 строк нового файла, нижеприведённый фрагмент находится в функции main. Далее - выведены строки с изменениями и строки контекста до и после строк с изменениями (по умолчанию 3). Вывод различий между самым первым и предпоследним коммитом (там где был добавлен вывод разницы между a и b): ``` $ git diff HEAD~5 HEAD~1 diff --git a/main.cpp b/main.cpp index b4392ec..65442c3 100644 --- a/main.cpp +++ b/main.cpp @@ -4,6 +4,9 @@ using namespace std; int main() { - cout << "Hello world!" << endl; - return 0; + cout << "Enter A and B: "; + int a, b; + cin >> a >> b; + cout << "A + B = " << a + b << '\n' + << "A - B = " << a - b << '\n'; } diff --git a/project.cbp b/project.cbp new file mode 100644 index 0000000..99bb702 --- /dev/null +++ b/project.cbp @@ -0,0 +1,40 @@ + + + + + + ``` Видно, что в файле main.cpp заменено содержимое функции main. Также был добавлен файл project.cbp, выведено его содержимое на экран. Файл .gitignore на этом этапе ещё не создан. ## Откат изменений ## Закоммитила вывод произведения чисел ``` $ git status On branch main Changes to be committed: (use "git restore --staged ..." to unstage) modified: main.cpp ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) $ git commit -m 'code: добавлен вывод произведения a и b' [main a4f0f70] code: добавлен вывод произведения a и b 1 file changed, 2 insertions(+), 1 deletion(-) ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` Отменила этот коммит и вернулась к предыдущему ``` $ git reset --hard HEAD~1 HEAD is now at 59cb19c git: добавлен .gitignore ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` Содержимое файла main.cpp вернулось к тому, которое было до внесения изменений. Добавлю перед функцией строку main() ``` // you may type whatever you want ``` и восстановлю исходное содержимое файла, которое было в последнем коммите ``` $ git checkout HEAD -- main.cpp ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` Содержимое файла вернулось к исходному. ## Обмен кодом через удаленное хранилище ## ### Настройка SSH ### Создаю пару ключей (открытый и закрытый) ``` $ ssh-keygen Generating public/private ed25519 key pair. Enter file in which to save the key (/c/Users/ibada/.ssh/id_ed25519): Created directory '/c/Users/ibada/.ssh'. Enter passphrase for "/c/Users/ibada/.ssh/id_ed25519" (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /c/Users/ibada/.ssh/id_ed25519 Your public key has been saved in /c/Users/ibada/.ssh/id_ed25519.pub The key fingerprint is: SHA256:Sc1dFrpQOHqeUycF6oRoR0G1JB/ids+0jKXT7DsZQdc ibada@Meouw The key's randomart image is: +--[ED25519 256]--+ | .*o+.o.+o | | + Oo*.+o E| | o *.Xo=o | | . +.=.%+o. | | So=oO+ | | +o. | | ..o | | o. | | .. | +----[SHA256]-----+ ``` Запуск агента для упрощения использования ключа ``` $ eval $(ssh-agent -s) Agent pid 539 ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) $ ssh-add Enter passphrase for /c/Users/ibada/.ssh/id_ed25519: Identity added: /c/Users/ibada/.ssh/id_ed25519 (ibada@Meouw) ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` Получение открытого ключа $ cat ~/.ssh/id_ed25519.pub ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIO3mZ2XPvcseBx4hMd7jdwbRhhDWsMfcHYN3n6jWpKjv ibada@Meouw ### Отправка проекта на сервер ### Создаю на сервере пустой репозитарий под названием cs-lab02 и настраиваю связь с удаленным хранилищем ``` $ git remote add origin git@uit.mpei.ru:BadaninaSP/cs-lab02.git ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) $ git push -u origin main The authenticity of host 'uit.mpei.ru (193.233.68.149)' can't be established. ED25519 key fingerprint is: SHA256:Q5w0UKEzQKA3J6NyMtjwCLvtAykoxdugIXjx6NwU4NA This key is not known by any other names. Are you sure you want to continue connecting (yes/no/[fingerprint])? yes Warning: Permanently added 'uit.mpei.ru' (ED25519) to the list of known hosts. Enumerating objects: 18, done. Counting objects: 100% (18/18), done. Delta compression using up to 22 threads Compressing objects: 100% (16/16), done. Writing objects: 100% (18/18), 2.35 KiB | 1.17 MiB/s, done. Total 18 (delta 2), reused 0 (delta 0), pack-reused 0 (from 0) remote: . Processing 1 references remote: Processed 1 references in total To uit.mpei.ru:BadaninaSP/cs-lab02.git * [new branch] main -> main branch 'main' set up to track 'origin/main'. ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` ### Получение проекта с сервера ### Открываю новый терминал Git Bash в каталоге bob. Клонирую проект ``` $ git clone git@uit.mpei.ru:BadaninaSP/cs-lab02.git project Cloning into 'project'... Enter passphrase for key '/c/Users/ibada/.ssh/id_ed25519': remote: Enumerating objects: 18, done. remote: Counting objects: 100% (18/18), done. remote: Compressing objects: 100% (16/16), done. remote: Total 18 (delta 2), reused 0 (delta 0), pack-reused 0 Receiving objects: 100% (18/18), done. Resolving deltas: 100% (2/2), done. ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/bob ``` Переход в каталог проекта «на машине Боба» ``` $ cd project ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/bob/project (main) ``` и настройка его Git ``` $ git config user.name 'Bob (BadaninaSP)' ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/bob/project (main) $ git config user.email 'BadaninaSP@mpei.ru' ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/bob/project (main) ``` ## Совместная работа над проектом без конфликтов правок ## Добавлю в main.cpp вывод произведения чисел: ``` #include 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' << "A * B = " << a * b << '\n'; } ``` сделаю коммит от имени Боба ``` $ git add main.cpp $ git commit -m 'code: добавлен вывод произведения a и b' [main d3c32a5] code: добавлен вывод произведения a и b 1 file changed, 2 insertions(+), 1 deletion(-) ``` Проверка того, что этот коммит сделан от имени Боба: ``` $ git log --stat commit d3c32a5794c394f82d80104db7916703e4b4244b (HEAD -> main) Author: Bob (BadaninaSP) Date: Tue Feb 3 23:43:43 2026 +0400 code: добавлен вывод произведения a и b main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) ``` Отправка на сервер ``` $ git push Enter passphrase for key '/c/Users/ibada/.ssh/id_ed25519': Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 22 threads Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 428 bytes | 428.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 uit.mpei.ru:BadaninaSP/cs-lab02.git 59cb19c..d3c32a5 main -> 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), 408 bytes | 136.00 KiB/s, done. From uit.mpei.ru:BadaninaSP/cs-lab02 59cb19c..d3c32a5 main -> origin/main ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` В рабочей копии изменений ещё не произошло. Ветка main отстает на один коммит от ветки origin/main: ``` $ git log --oneline 59cb19c (HEAD -> main) git: добавлен .gitignore 703d751 code: добавлен вывод разности a и b da84366 code: добавлен вывод суммы a и b fca14d8 code: добавлен ввод двух чисел fab7219 build: добавлен файл проекта 0cda65b code: заготовка программы ``` Продвижение ветки main к скачанной версии ``` $ git pull --ff-only Updating 59cb19c..d3c32a5 Fast-forward main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) $ git log --oneline d3c32a5 (HEAD -> main, origin/main, origin/HEAD) code: добавлен вывод произведения a и b 59cb19c git: добавлен .gitignore 703d751 code: добавлен вывод разности a и b da84366 code: добавлен вывод суммы a и b fca14d8 code: добавлен ввод двух чисел fab7219 build: добавлен файл проекта 0cda65b code: заготовка программы ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` Рабочая копия проекта «у Алисы» соответствует версии «у Боба». Добавление в программу печати деления ``` #include 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' << "A * B = " << a * b << '\n' << "A / B = " << a / b << '\n'; } ``` Коммит этого от имени Алисы ``` $ git add main.cpp ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) $ git commit -m 'code: добавлен вывод деления a на b' [main 917427b] code: добавлен вывод деления a на b 1 file changed, 2 insertions(+), 1 deletion(-) ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` Отправка на сервер ``` $ git push Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 22 threads Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 421 bytes | 421.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 uit.mpei.ru:BadaninaSP/cs-lab02.git d3c32a5..917427b main -> main ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` Приём Бобом ``` $ git pull --ff-only Enter passphrase for key '/c/Users/ibada/.ssh/id_ed25519': remote: Enumerating objects: 5, done. remote: Counting objects: 100% (5/5), done. remote: Compressing objects: 100% (3/3), done. remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (3/3), 401 bytes | 44.00 KiB/s, done. From uit.mpei.ru:BadaninaSP/cs-lab02 d3c32a5..917427b main -> origin/main Updating d3c32a5..917427b Fast-forward main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/bob/project (main) ``` Рабочая копия проекта «у Боба» соответствует версии «у Алисы». ## Разрешение конфликтов правок при совместной работе ## Алиса дополняет программу печатью максимума ``` #include 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' << "A * B = " << a * b << '\n' << "A / B = " << a / b << '\n' << "max(A, B) = " << max(a, b) << '\n'; } ``` делает коммит и отправляет его на сервер ``` $ git add main.cpp ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) $ git commit -m 'code: добавлен вывод максимума' [main 8a335dc] code: добавлен вывод максимума 1 file changed, 2 insertions(+), 1 deletion(-) ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) $ git push Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 22 threads Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 430 bytes | 430.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 uit.mpei.ru:BadaninaSP/cs-lab02.git 917427b..8a335dc main -> main ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` Боб дополняет программу печатью минимума ``` #include 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' << "A * B = " << a * b << '\n' << "A / B = " << a / b << '\n' << "min(A, B) = " << min(a, b) << '\n'; } ``` делает коммит ``` $ git add main.cpp ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/bob/project (main) $ git commit -m 'code: добавлен вывод минимума' [main 25a8e7e] code: добавлен вывод минимума 1 file changed, 2 insertions(+), 1 deletion(-) ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/bob/project (main) ``` и пытается отправить его на сервер ``` $ git push Enter passphrase for key '/c/Users/ibada/.ssh/id_ed25519': To uit.mpei.ru:BadaninaSP/cs-lab02.git ! [rejected] main -> main (fetch first) error: failed to push some refs to 'uit.mpei.ru:BadaninaSP/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. ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/bob/project (main) ``` что заканчивается неудачей из-за наличия в удалённом репозитарии изменений, которые отсутствуют в локальном. «От лица Боба» загрузим коммиты из удаленного хранилища и отобразим историю всех веток. ```$ git fetch Enter passphrase for key '/c/Users/ibada/.ssh/id_ed25519': remote: Enumerating objects: 5, done. remote: Counting objects: 100% (5/5), done. remote: Compressing objects: 100% (3/3), done. remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (3/3), 410 bytes | 45.00 KiB/s, done. From uit.mpei.ru:BadaninaSP/cs-lab02 917427b..8a335dc main -> origin/main ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/bob/project (main) $ git log --stat commit 8a335dcd242cc24b19edce92f6f5d34284e1e851 (HEAD, origin/main, origin/HEAD) Author: Alice (BadaninaSP) Date: Wed Feb 4 01:30:47 2026 +0400 code: добавлен вывод максимума main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 917427b54001612eed18042cab81c877f327c2af Author: Alice (BadaninaSP) Date: Wed Feb 4 01:04:41 2026 +0400 code: добавлен вывод деления a на b main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit d3c32a5794c394f82d80104db7916703e4b4244b Author: Bob (BadaninaSP) Date: Tue Feb 3 23:43:43 2026 +0400 code: добавлен вывод произведения a и b main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit 59cb19c306ff2257f830406d60ad1fc785c88c33 Author: Alice (BadaninaSP) Date: Mon Feb 2 01:25:04 2026 +0400 git: добавлен .gitignore .gitignore | 4 ++++ 1 file changed, 4 insertions(+) commit 703d7515ac3c339930c278c035cbfb96bb5a65f1 Author: Alice (BadaninaSP) Date: Mon Feb 2 01:15:24 2026 +0400 code: добавлен вывод разности a и b main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) commit da843664d255aa6bbd04695c8e26b4424f3fcd28 Author: Alice (BadaninaSP) Date: Mon Feb 2 01:03:41 2026 +0400 code: добавлен вывод суммы a и b main.cpp | 1 + 1 file changed, 1 insertion(+) commit fca14d80ac2a78122441e9b7157481d374a33ecc Author: Alice (BadaninaSP) Date: Mon Feb 2 00:24:16 2026 +0400 code: добавлен ввод двух чисел main.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) commit fab7219f8b1c6faf26857c85e61a86f759905b87 Author: Alice (BadaninaSP) Date: Sun Feb 1 02:03:46 2026 +0400 build: добавлен файл проекта project.cbp | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) commit 0cda65b553627021651c8584ded99f55eb1b39a4 Author: Alice (BadaninaSP) Date: Sun Feb 1 01:58:32 2026 +0400 code: заготовка программы main.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) ``` Попытка поместить коммит Боба поверх коммита Алисы заканчивается ошибкой (конфликт слияния в файле main.cpp) ``` $ git rebase origin/main Auto-merging main.cpp CONFLICT (content): Merge conflict in main.cpp error: could not apply 25a8e7e... 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 25a8e7e... # code: добавлен вывод минимума ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/bob/project (main|REBASE 1/1) ``` Состояние хранилища ``` $ git status interactive rebase in progress; onto 8a335dc Last command done (1 command done): pick 25a8e7e # code: добавлен вывод минимума No commands remaining. You are currently rebasing branch 'main' on '8a335dc'. (fix conflicts and then run "git rebase --continue") (use "git rebase --skip" to skip this patch) (use "git rebase --abort" to check out the original branch) Unmerged paths: (use "git restore --staged ..." to unstage) (use "git add ..." to mark resolution) both modified: main.cpp no changes added to commit (use "git add" and/or "git commit -a") ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/bob/project (main|REBASE 1/1) ``` Продолжается процесс перебазирования; на коммите 8a335dc Проделана команда включения коммита "25a8e7e # code: добавлен вывод минимума" в процесс интерактивного перебазирования Нет оставшихся комманд Сейчас вы перебазируете main на 8a335dc. Исправьте конфликты и запустите "git rebase --continue" Неслившиеся пути: оба изменённых main.cpp Нет изменений добавленных для коммита. В файле отмечено место конфликта Отредактирую код так, чтобы он включал и правки Алисы, и правки Боба. ``` #include 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' << "A * B = " << a * b << '\n' << "A / B = " << a / b << '\n' << "max(A, B) = " << max(a, b) << '\n' << "min(A, B) = " << min(a, b) << '\n'; } ``` Добавляю файл в индекс и продолжаю прерванную операцию rebase: ``` git add main.cpp git rebase --continue ``` Проверяю историю хранилища ``` $ git log --oneline fe639cd (HEAD -> main) code: добавлен вывод минимума 8a335dc (origin/main, origin/HEAD) code: добавлен вывод максимума 917427b code: добавлен вывод деления a на b d3c32a5 code: добавлен вывод произведения a и b 59cb19c git: добавлен .gitignore 703d751 code: добавлен вывод разности a и b da84366 code: добавлен вывод суммы a и b fca14d8 code: добавлен ввод двух чисел fab7219 build: добавлен файл проекта 0cda65b code: заготовка программы ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/bob/project (main) ``` Она имеет желаемый вид, отправляю её на сервер ``` $ git push Enter passphrase for key '/c/Users/ibada/.ssh/id_ed25519': Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 22 threads Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 433 bytes | 433.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 uit.mpei.ru:BadaninaSP/cs-lab02.git 8a335dc..fe639cd main -> main ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/bob/project (main) ``` ## Использование веток ## Пока Боб синхронизировал изменения, Алиса решила изменить тип чисел с целых на действительные. Предполагая, что это займет время, Алиса ведет работу в отдельной ветке. На момент начала работы репозитарий Алисы не синхронизирован с сервером, то есть последний коммит добавляет печать максимума. Все действия ведутся «на машине Алисы». Создаю ветку double: ``` $ git branch double ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` Переключаюсь на нее: ``` $ git checkout double Switched to branch 'double' ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (double) ``` Заменяю тип переменных a и b на double ``` #include using namespace std; int main() { cout << "Enter A and B: "; double 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' << "max(A, B) = " << max(a, b) << '\n'; } ``` и делаю коммит ``` $ git add main.cpp ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (double) $ git commit -m 'code: заменён тип переменных a и b на double' [double 52b8fb1] code: заменён тип переменных a и b на double 1 file changed, 1 insertion(+), 1 deletion(-) ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (double) ``` Синхронизация ветки main «на машине Алисы» с сервером ``` $ 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), 413 bytes | 22.00 KiB/s, done. From uit.mpei.ru:BadaninaSP/cs-lab02 8a335dc..fe639cd main -> origin/main Updating 8a335dc..fe639cd Fast-forward main.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) $ git log --oneline --all 52b8fb1 (double) code: заменён тип переменных a и b на double fe639cd (HEAD -> main, origin/main, origin/HEAD) code: добавлен вывод минимума 8a335dc code: добавлен вывод максимума 917427b code: добавлен вывод деления a на b d3c32a5 code: добавлен вывод произведения a и b 59cb19c git: добавлен .gitignore 703d751 code: добавлен вывод разности a и b da84366 code: добавлен вывод суммы a и b fca14d8 code: добавлен ввод двух чисел fab7219 build: добавлен файл проекта 0cda65b code: заготовка программы ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` Сливаю ветку double в main: ``` $ git merge double Auto-merging main.cpp Merge made by the 'ort' strategy. main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` История всех изменений ``` $ git log --oneline --all d1bd17c (HEAD -> main) code: заменён тип переменных a и b на double Merge branch 'double' 52b8fb1 (double) code: заменён тип переменных a и b на double fe639cd (origin/main, origin/HEAD) code: добавлен вывод минимума 8a335dc code: добавлен вывод максимума 917427b code: добавлен вывод деления a на b d3c32a5 code: добавлен вывод произведения a и b 59cb19c git: добавлен .gitignore 703d751 code: добавлен вывод разности a и b da84366 code: добавлен вывод суммы a и b fca14d8 code: добавлен ввод двух чисел fab7219 build: добавлен файл проекта 0cda65b code: заготовка программы ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` Отправляю на сервер ``` $ git push Enumerating objects: 10, done. Counting objects: 100% (10/10), done. Delta compression using up to 22 threads Compressing objects: 100% (6/6), done. Writing objects: 100% (6/6), 803 bytes | 803.00 KiB/s, done. Total 6 (delta 2), reused 0 (delta 0), pack-reused 0 (from 0) remote: . Processing 1 references remote: Processed 1 references in total To uit.mpei.ru:BadaninaSP/cs-lab02.git fe639cd..d1bd17c main -> main ibada@Meouw MINGW64 /d/Учёба/Разработка программного обеспечения систем управления/Модуль 2/lab02/alice/project (main) ``` Все изменения появились на сервере.