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

Выполнил: Чернов Д.Е.
Группа:   А-01-22
Проверил: 

Примечание: работа выполнялась на MacOS.

1) Создал на рабочем столе каталог lab02

2) Просмотрел файлы в рабочем каталоге можно командой "ls»(пусто):
r.aliyakbyarov@a-aliyakbyarov-r lab02 % 

3) Создал каталоги Алисы и Боба (mkdir Alice, mkdir bob), создал каталог "project",
изучил команду "cd" в процессе.

4) Инициализировал репозитарий (git init) и через команду ls -A увидел его наличие:
Initialized empty Git repository in /Users/r.aliyakbyarov/Desktop/lab02/alice/project/.git/

.git
r.aliyakbyarov@a-aliyakbyarov-r project % 

5) Настроил репозитарий, чтобы коммиты были от моего имени:
r.aliyakbyarov@a-aliyakbyarov-r project % git config user.name 'Chernov DE'
r.aliyakbyarov@a-aliyakbyarov-r project % git config user.email 'chernovdy@mpei.ru'

6) Запустил CodeBlocks и создал проект в репозитарии Алисы:
r.aliyakbyarov@a-aliyakbyarov-r project % git status
On branch master

No commits yet

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

	main.cpp

7) Заношу файл main.cpp под Git(git add main.cpp):
r.aliyakbyarov@a-aliyakbyarov-r project % git status
On branch master

No commits yet

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

	new file:   main.cpp
8) Закомитил файл main.cpp и назвал заготовкой программы:
r.aliyakbyarov@a-aliyakbyarov-r project % git commit -m "code: заготовка программы"
[master (root-commit) c4b85fe] code: заготовка программы
 1 file changed, 7 insertions(+)
 create mode 100644 main.cpp
r.aliyakbyarov@a-aliyakbyarov-r project % 

9) Использование команды $ git status после изменения файла main.cpp:
r.aliyakbyarov@a-aliyakbyarov-r project % git status
On branch master
nothing to commit, working tree clean
r.aliyakbyarov@a-aliyakbyarov-r project % 

10) 1 способ закомитить изменения:

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

2 способ закомитить изменения:

Добавить в индекс все изменения, затем сделать коммит. 

r.aliyakbyarov@a-aliyakbyarov-r project % git add -u
r.aliyakbyarov@a-aliyakbyarov-r project % git commit -m "Добавил вывод"
[master d67c777] Добавил вывод
 1 file changed, 2 insertions(+), 2 deletions(-)

3 способ закомитить изенения:

Добавить все изменения в индекс и сделать коммит в один шаг.

r.aliyakbyarov@a-aliyakbyarov-r project % git commit -a -m "Добавил вывод разницы"
[master 1fd04d1] Добавил вывод разницы
 1 file changed, 1 insertion(+), 1 deletion(-)

11) Создал файл .gitignore, который игнорирует obj, bin, project.layout.

Сделал коммит:
r.aliyakbyarov@a-aliyakbyarov-r project % git add .gitignore
r.aliyakbyarov@a-aliyakbyarov-r project % git commit -m "git: Игнорирование файлов"
[master 50051e7] git: Игнорирование файлов
 1 file changed, 3 insertions(+)
 create mode 100644 .gitignore

12)Просмотрел коммиты репозитария:

r.aliyakbyarov@a-aliyakbyarov-r project % git log --stat
commit 50051e7e4018b9a9e9fc76451b5306ab5b1d37dd (HEAD -> master)
Author: Chernov DE <chernovdy@mpei.ru>
Date:   Sun Mar 26 16:18:57 2023 +0300

    git: Игнорирование файлов

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

commit 1fd04d13e480e130c33f1348f0a8454fd6878471
Author: Chernov DE <chernovdy@mpei.ru>
Date:   Sun Mar 26 16:13:27 2023 +0300

    Добавил вывод разницы

 main.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

commit d67c7772ee8fa28d4d6e1e7c260467cacd1fde4e //Хэш коммита
Author: Chernov DE <chernovdy@mpei.ru> //Я автор
Date:   Sun Mar 26 16:11:28 2023 +0300 //Дата

    Добавил вывод

Другой вариант:
r.aliyakbyarov@a-aliyakbyarov-r project % git log --oneline --decorate
50051e7 (HEAD -> master) git: Игнорирование файлов
1fd04d1 Добавил вывод разницы
d67c777 Добавил вывод
c4b85fe code: заготовка программы

Другой вариант часть 2:
r.aliyakbyarov@a-aliyakbyarov-r project % git log --oneline --decorate --all --graph
* 50051e7 (HEAD -> master) git: Игнорирование файлов
* 1fd04d1 Добавил вывод разницы
* d67c777 Добавил вывод
* c4b85fe code: заготовка программы

Просмотр определенного коммита:
r.aliyakbyarov@a-aliyakbyarov-r project %  git log -- .gitignore
commit 50051e7e4018b9a9e9fc76451b5306ab5b1d37dd (HEAD -> master)
Author: Chernov DE <chernovdy@mpei.ru>
Date:   Sun Mar 26 16:18:57 2023 +0300

    git: Игнорирование файлов

Просмотр определенного коммита по теме «git:»:
r.aliyakbyarov@a-aliyakbyarov-r project % git log --grep "git: "
commit 50051e7e4018b9a9e9fc76451b5306ab5b1d37dd (HEAD -> master)
Author: Chernov DE <chernovdy@mpei.ru>
Date:   Sun Mar 26 16:18:57 2023 +0300

    git: Игнорирование файлов

13) Просмотр журнала/определенного коммита:

Текущий коммит:
r.aliyakbyarov@a-aliyakbyarov-r project % git show HEAD
commit 50051e7e4018b9a9e9fc76451b5306ab5b1d37dd (HEAD -> master)
Author: Chernov DE <chernovdy@mpei.ru>
Date:   Sun Mar 26 16:18:57 2023 +0300

    git: Игнорирование файлов

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..bdcd1e7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+/bin
+/obj
+/project.layout
\ No newline at end of file

Коммит по имени ветки:
r.aliyakbyarov@a-aliyakbyarov-r project % git show master
commit 50051e7e4018b9a9e9fc76451b5306ab5b1d37dd (HEAD -> master)
Author: Chernov DE <chernovdy@mpei.ru>
Date:   Sun Mar 26 16:18:57 2023 +0300

    git: Игнорирование файлов

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..bdcd1e7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+/bin
+/obj
+/project.layout
\ No newline at end of file

По хешу нужного коммита:
r.aliyakbyarov@a-aliyakbyarov-r project % git show 50051e7e4018b9a9e9fc76451b5306ab5b1d37dd
commit 50051e7e4018b9a9e9fc76451b5306ab5b1d37dd (HEAD -> master)
Author: Chernov DE <chernovdy@mpei.ru>
Date:   Sun Mar 26 16:18:57 2023 +0300

    git: Игнорирование файлов

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..bdcd1e7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+/bin
+/obj
+/project.layout
\ No newline at end of file

14) Просмотр изменений:

Просмотрим изменения рабочей копии:
r.aliyakbyarov@a-aliyakbyarov-r project % git diff
diff --git a/main.cpp b/main.cpp
index 94f324b..a771f65 100644
--- a/main.cpp
+++ b/main.cpp
@@ -3,5 +3,5 @@ using namespace std;
 int main(){
     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;
 }

Показ изменений определенного комита через указание аргумента команды:
r.aliyakbyarov@a-aliyakbyarov-r project %  git diff HEAD~2
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..bdcd1e7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,3 @@
+/bin
+/obj
+/project.layout
\ No newline at end of file
diff --git a/main.cpp b/main.cpp
index d12efe0..a771f65 100644
--- a/main.cpp
+++ b/main.cpp
@@ -3,5 +3,5 @@ using namespace std;
 int main(){
     int A,B;
     cin>>A>>B;
-    cout << "A + B = " << a + b << '\n';
+    cout << "A + B = " << A + B << '\n'<< "A - B = " << A - B << '\n'<<"A * B = "<< A*B;
 }

Просмотр изменений первого и последнего коммита:

r.aliyakbyarov@a-aliyakbyarov-r project % git diff c4b85fe 1fd04d1
diff --git a/main.cpp b/main.cpp
index 3a81897..94f324b 100644
--- a/main.cpp
+++ b/main.cpp
@@ -2,6 +2,6 @@
 using namespace std;
 int main(){
     int A,B;
-    cin>>A;
-    cin>>B;
+    cin>>A>>B;
+    cout << "A + B = " << a + b << '\n'<< "A - B = " << a - b << '\n';
 }

15) Откат изменений

Во-первых, сделал изменение в программе (добавил произведение) и закомитил изменения
Далее делаем откат изменений к предыдущей версии:
r.aliyakbyarov@a-aliyakbyarov-r project % git reset --hard HEAD~1
HEAD is now at 50051e7 git: Игнорирование файлов

или добавим комментарий над main() и откатим этот файл к состоянию в последнем коммите:
r.aliyakbyarov@a-aliyakbyarov-r project % git checkout HEAD
M	main.cpp

16) Создание пары ключей для доступа к серверу

17) Создаем репозитарий под названием cs-lab02.

Далее клонируем проект в каталог Bob:
r.aliyakbyarov@a-aliyakbyarov-r project % git clone git@uit.mpei.ru:Danila_Chernov/cs-lab2.git project

После настраиваем git конфиг как с Alice:
r.aliyakbyarov@a-aliyakbyarov-r project % git config user.name "Bob (ChernovDE)"
r.aliyakbyarov@a-aliyakbyarov-r project %  git config user.email 'Chernovdy@mpei.ru' 

18)Совместная работа над проектом без конфликтов правок:

«На машине Боба» добавляем в программу печать произведения чисел и делаем коммит:
r.aliyakbyarov@a-aliyakbyarov-r project % git add main.cpp
r.aliyakbyarov@a-aliyakbyarov-r project % git commit -m "Вывод произведения боба"
[master 9a5bee8] Вывод произведения боба
 1 file changed, 1 insertion(+), 1 deletion(-)

Отправляем коммит на сервер:
r.aliyakbyarov@a-aliyakbyarov-r project % git push
Enter passphrase for key '/Users/r.aliyakbyarov/.ssh/id_rsa': 
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 392 bytes | 392.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: . Processing 1 references
remote: Processed 1 references in total
To uit.mpei.ru:Danila_Chernov/cs-lab2.git
   50051e7..9a5bee8  master -> master
r.aliyakbyarov@a-aliyakbyarov-r project % 

«На машине Алисы» выполнить загрузку изменений:
r.aliyakbyarov@a-aliyakbyarov-r project % git fetch
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From uit.mpei.ru:Danila_Chernov/cs-lab2
   50051e7..9a5bee8  master     -> origin/master
r.aliyakbyarov@a-aliyakbyarov-r project % 

Просмотрим историю всех веток:
r.aliyakbyarov@a-aliyakbyarov-r project % git log --oneline --decorate --all --graph
* 9a5bee8 (origin/master) Вывод произведения боба
* 50051e7 (HEAD -> master) git: Игнорирование файлов
* 1fd04d1 Добавил вывод разницы
* d67c777 Добавил вывод
* c4b85fe code: заготовка программы

Как можно видеть, ветка master отстает на один коммит от ветки origin/master. Продвинем ветку master к скачанной версии: git pull --ff-only

r.aliyakbyarov@a-aliyakbyarov-r project % git pull --ff-only
Updating 50051e7..9a5bee8
Fast-forward
 main.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

r.aliyakbyarov@a-aliyakbyarov-r project % git log --oneline --decorate --all --graph

* 9a5bee8 (HEAD -> master, origin/master) Вывод произведения боба
* 50051e7 git: Игнорирование файлов
* 1fd04d1 Добавил вывод разницы
* d67c777 Добавил вывод
* c4b85fe code: заготовка программы

18) Разрешение конфликтов при совместной работе:

Дополним у Alice вывод максимума, у Bob - вывод минимума, попробуем сделать коммит и отправить его на сервер:

Для Alice:
r.aliyakbyarov@a-aliyakbyarov-r project % git add main.cpp
r.aliyakbyarov@a-aliyakbyarov-r project % git commit -m "алиса ищет максимум"
[master c5dcc2d] алиса ищет максимум
 1 file changed, 1 insertion(+), 1 deletion(-)
r.aliyakbyarov@a-aliyakbyarov-r project % git add main.cpp
r.aliyakbyarov@a-aliyakbyarov-r project % git commit -m "вывод макс с кавычками"
[master f2baa24] вывод макс с кавычками
 1 file changed, 3 insertions(+), 2 deletions(-)
r.aliyakbyarov@a-aliyakbyarov-r project % git push
Counting objects: 6, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 678 bytes | 678.00 KiB/s, done.
Total 6 (delta 2), reused 0 (delta 0)
remote: . Processing 1 references
remote: Processed 1 references in total
To uit.mpei.ru:Danila_Chernov/cs-lab2.git
   f6267f9..f2baa24  master -> master
Для Bob:
r.aliyakbyarov@a-aliyakbyarov-r project % git add main.cpp
r.aliyakbyarov@a-aliyakbyarov-r project % git commit -m "Минимум с кавычками"
[master deaadf7] Минимум с кавычками
 1 file changed, 2 insertions(+), 2 deletions(-)
r.aliyakbyarov@a-aliyakbyarov-r project % git push
Enter passphrase for key '/Users/r.aliyakbyarov/.ssh/id_rsa': 
To uit.mpei.ru:Danila_Chernov/cs-lab2.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'git@uit.mpei.ru:Danila_Chernov/cs-lab2.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Удаленный репозитарий не принимает изменений: коммит Боба основан не на последнем существующем коммите.

Загрузим коммит из удаленного хранилища и после отобразим историю всех веток:

r.aliyakbyarov@a-aliyakbyarov-r project % git pull --ff-only
Enter passphrase for key '/Users/r.aliyakbyarov/.ssh/id_rsa': 
remote: Enumerating objects: 8, done.
remote: Counting objects: 100% (8/8), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 6 (delta 2), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (6/6), done.
From uit.mpei.ru:Danila_Chernov/cs-lab2
   f6267f9..f2baa24  master     -> origin/master
fatal: Not possible to fast-forward, aborting.
r.aliyakbyarov@a-aliyakbyarov-r project %  git log --oneline --decorate --all --graph

* deaadf7 (HEAD -> master) Минимум с кавычками
* 05278b3 Поиск мин боб
* 508adc4 Нашел минимум у боба
| * f2baa24 (origin/master, origin/HEAD) вывод макс с кавычками
| * c5dcc2d алиса ищет максимум
|/  
* f6267f9 Добавил в Алису макс
* dd7d994 Добавил вывод деления
* 9a5bee8 Вывод произведения боба
* 50051e7 git: Игнорирование файлов
* 1fd04d1 Добавил вывод разницы
* d67c777 Добавил вывод
* c4b85fe code: заготовка программы

Можно видеть, что ветка main локального репозитария разошлась с веткой origin/master, то есть с веткой main на сервере.

Переместим коммит Bobа поверх коммита Алисы, то есть поверх origin/master:
r.aliyakbyarov@a-aliyakbyarov-r project % git rebase origin/master
First, rewinding head to replay your work on top of it...
Applying: Поиск мин боб
Using index info to reconstruct a base tree...
M	main.cpp
Falling back to patching base and 3-way merge...
Auto-merging main.cpp
CONFLICT (content): Merge conflict in main.cpp
error: Failed to merge in the changes.
Patch failed at 0001 Поиск мин боб
The copy of the patch that failed is found in: .git/rebase-apply/patch

Resolve all conflicts manually, mark them as resolved with
"git add/rm <conflicted_files>", then run "git rebase --continue".
You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".

r.aliyakbyarov@a-aliyakbyarov-r project % 

Команда завершается с ошибкой, сообщающей о конфликте в main.cpp.

Проверим статус репозитария:

r.aliyakbyarov@a-aliyakbyarov-r project % git status
rebase in progress; onto f2baa24
You are currently rebasing branch 'master' on 'f2baa24'.
  (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 reset HEAD <file>..." to unstage)
  (use "git add <file>..." to mark resolution)

	both modified:   main.cpp

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

	main
	main.dSYM/

Теперь разрешим конфликт и после добавляем файл в индекс, продолжаем прерванную операцию rebase:
r.aliyakbyarov@a-aliyakbyarov-r project % git add main.cpp
r.aliyakbyarov@a-aliyakbyarov-r project % git rebase --continue
Applying: Минимум с кавычками

Проверяем, чтобы история хранилища была в надлежащем виде:
r.aliyakbyarov@a-aliyakbyarov-r project % git log --oneline --decorate --all --graph
* e237ba1 (HEAD -> master) Минимум с кавычками
* 4504c5a Поиск мин боб
* f2baa24 (origin/master, origin/HEAD) вывод макс с кавычками
* c5dcc2d алиса ищет максимум
* f6267f9 Добавил в Алису макс
* dd7d994 Добавил вывод деления
* 9a5bee8 Вывод произведения боба
* 50051e7 git: Игнорирование файлов
* 1fd04d1 Добавил вывод разницы
* d67c777 Добавил вывод
* c4b85fe code: заготовка программы

19) Использование веток

Создадим ветку double:
r.aliyakbyarov@a-aliyakbyarov-r project % git branch double

Переключимся на нее:
r.aliyakbyarov@a-aliyakbyarov-r project %  git checkout double
Switched to branch 'double

Заменим тип переменных а и b на double и сделаем коммит:
r.aliyakbyarov@a-aliyakbyarov-r project % git add main.cpp
r.aliyakbyarov@a-aliyakbyarov-r project % git commit -m " Изменение типа на double"     
[double 673590f]  Изменение типа на double
 1 file changed, 1 insertion(+), 1 deletion(-)

Переключимся на ветку master: 
r.aliyakbyarov@a-aliyakbyarov-r project % git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.

Синхронизируем ветку master «на машине Алисы» с сервером.

Продвинем ветку master к скачанной версии.

Просмотрим историю всех веток:
r.aliyakbyarov@a-aliyakbyarov-r project % git log --oneline --decorate --all --graph
* 673590f (double)  Изменение типа на double
* f2baa24 (HEAD -> master, origin/master) вывод макс с кавычками
* c5dcc2d алиса ищет максимум
* f6267f9 Добавил в Алису макс
* dd7d994 Добавил вывод деления
* 9a5bee8 Вывод произведения боба
* 50051e7 git: Игнорирование файлов
* 1fd04d1 Добавил вывод разницы
* d67c777 Добавил вывод
* c4b85fe code: заготовка программы
r.aliyakbyarov@a-aliyakbyarov-r project % 

Сольем ветки double и master:
r.aliyakbyarov@a-aliyakbyarov-r project % git merge double
Updating f2baa24..673590f
Fast-forward
 main.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Просмотрим историю всех веток репозитария:
r.aliyakbyarov@a-aliyakbyarov-r project % git log --oneline --decorate --all --graph

* 673590f (HEAD -> master, double)  Изменение типа на double
* f2baa24 (origin/master) вывод макс с кавычками
* c5dcc2d алиса ищет максимум
* f6267f9 Добавил в Алису макс
* dd7d994 Добавил вывод деления
* 9a5bee8 Вывод произведения боба
* 50051e7 git: Игнорирование файлов
* 1fd04d1 Добавил вывод разницы
* d67c777 Добавил вывод
* c4b85fe code: заготовка программы
r.aliyakbyarov@a-aliyakbyarov-r project %