class: center, middle # Git и Gitlab --- # Всем знакомая ситуация ```no-highlight Магистерская работа/1.cpp Магистерская работа/1-Copy1.cpp Магистерская работа/1-Copy2.cpp Магистерская работа/2.cpp Магистерская работа/3.cpp Магистерская работа/4.cpp Магистерская работа/5.cpp Магистерская работа/5-Copy1.cpp Магистерская работа/5-Copy2.cpp Магистерская работа/5-Copy2-Alexis.cpp Магистерская работа/5-Copy2-Alexis-Copy1.cpp Магистерская работа/5-Copy2-Alexis-Copy2.cpp Магистерская работа/5-Copy2-Alexis-Copy3.cpp Магистерская работа/5-Copy2-Alexis-Copy4.cpp Магистерская работа/5-Copy3.cpp Магистерская работа/6.cpp ``` --- ## А в серьезном исследовании? -- ```no-highlight ./1200km/!New_noise/!Filter/NZDSF_SSMF/t8.cpp ./1200km/!New_noise/!Filter/NZDSF/t8.cpp ./1200km/!New_noise/!Filter/SSMF_NZDSF/t8.cpp ./1200km/!New_noise/!Filter/SSMF/t8.cpp ./1200km/!New_noise/NZDSF_SSMF/t8.cpp ./1200km/!New_noise/NZDSF/t8.cpp ./1200km/!New_noise/SSMF_NZDSF/t8.cpp ./1200km/!New_noise/SSMF/t8.cpp ./1200km/!New_pulses/!60GHz_filter/NZDSF/t8.cpp ./1200km/!New_pulses/!60GHz_filter/SSMF_NZDSF/t8.cpp ./1200km/!New_pulses/!60GHz_filter/SSMF/t8.cpp ./1200km/!New_pulses/!multich/S100GHz_F30GHz/SSMF/t8.cpp ./1200km/!New_pulses/!multich/S100GHz_F60GHz/SSMF/t8.cpp ./1200km/!New_pulses/!multich/S50GHz_F30GHz/SSMF/t8.cpp ./1200km/!New_pulses/!multich/S50GHz_F60GHz/SSMF/t8.cpp ./1200km/!New_pulses/NZDSF/t8.cpp ./1200km/!New_pulses/SSMF_NZDSF/t8.cpp ./1200km/!New_pulses/SSMF/t8.cpp ./1200km/NZDSF_SSMF/t8.cpp ./1200km/NZDSF/t8.cpp ./1200km/!Right_noise/!30GHz_filter1/NZDSF_SSMF/t8.cpp ./1200km/!Right_noise/!30GHz_filter1/NZDSF/t8.cpp ./1200km/!Right_noise/!30GHz_filter1/SSMF_NZDSF/t8.cpp ./1200km/!Right_noise/!30GHz_filter1/SSMF/t8.cpp ./1200km/!Right_noise/!30GHz_filter/NZDSF_SSMF/t8.cpp ./1200km/!Right_noise/!30GHz_filter/NZDSF/t8.cpp ./1200km/!Right_noise/!30GHz_filter/SSMF_NZDSF/t8.cpp ./1200km/!Right_noise/!30GHz_filter/SSMF/t8.cpp ./1200km/!Right_noise/NZDSF_SSMF/t8.cpp ./1200km/!Right_noise/NZDSF/t8.cpp ./1200km/!Right_noise/SSMF_NZDSF/t8.cpp ./1200km/!Right_noise/SSMF/t8.cpp ./1200km/SSMF_NZDSF/t8.cpp ./1200km/SSMF/t8.cpp ./maxL/!11channels/NZDSF/t8.cpp ./maxL/!11channels/SSMF/1024/t8.cpp ./maxL/!11channels/SSMF/16384/t8.cpp ./maxL/!11channels/SSMF/2048/t8.cpp ./maxL/!11channels/SSMF/32768/t8.cpp ./maxL/!11channels/SSMF/4096/t8.cpp ./maxL/!11channels/SSMF/512/t8.cpp ./maxL/!11channels/SSMF/65536_32/t8.cpp ./maxL/!11channels/SSMF/65536/t8.cpp ./maxL/!11channels/SSMF/8192/t8.cpp ./maxL/!11channels/SSMF_NZDSF/t8.cpp ./maxL/!11channels/SSMF/t8.cpp ./maxL/!11channels/SSMF/test/1024/t8.cpp ./maxL/!11channels/SSMF/test1/2048/t8.cpp ./maxL/!11channels/SSMF/test1/32768/t8.cpp ./maxL/!11channels/SSMF/test1/512/t8.cpp ./maxL/!11channels/SSMF/test/16384/t8.cpp ./maxL/!11channels/SSMF/test1/65536/t8.cpp ./maxL/!11channels/SSMF/test1/8192/t8.cpp ./maxL/!11channels/SSMF/test2/131072/t8.cpp ./maxL/!11channels/SSMF/test2/2048/t8.cpp ./maxL/!11channels/SSMF/test2/32768/t8.cpp ./maxL/!11channels/SSMF/test2/512/t8.cpp ./maxL/!11channels/SSMF/test2/65536/t8.cpp ./maxL/!11channels/SSMF/test2/65536_up/t8.cpp ./maxL/!11channels/SSMF/test2/8192/t8.cpp ./maxL/!11channels/SSMF/test/32768/t8.cpp ./maxL/!11channels/SSMF/test/4096/t8.cpp ./maxL/!11channels/SSMF/test/t8.cpp ./maxL/!Large_research/NZDSF/t8.cpp ./maxL/!Large_research/NZDSF_test/t8.cpp ./maxL/!Large_research/SSMF_DCF/t8.cpp ./maxL/!Large_research/SSMF_NZDSF/t8.cpp ./maxL/!Large_research/SSMF_NZDSF_test/t8.cpp ./maxL/!Large_research/SSMF/t8.cpp ./maxL/!Large_research/SSMF_VF1/t8.cpp ./maxL/!Large_research/SSMF_VF2/t8.cpp ./maxL/!Large_research/SSMF_VF3/t8.cpp ./maxL/!Large_research/ULA_DCF/t8.cpp ./maxL/!Large_research/ULA/t8.cpp ./maxL/!Large_research/ULL_DCF/t8.cpp ./maxL/!Large_research/ULL/t8.cpp ./maxL/!Large_research/z_TOD/NZDSF/t8.cpp ./maxL/!Large_research/z_TOD/SSMF_NZDSF/t8.cpp ./maxL/!Large_research/z_TOD/SSMF/t8.cpp ./maxL/!New_noise_and_filter/75SSMF_25NZDSF/t8.cpp ./maxL/!New_noise_and_filter/NZDSF/t8.cpp ./maxL/!New_noise_and_filter/SSMF_NZDSF/t8.cpp ./maxL/!New_noise_and_filter/SSMF/t8.cpp ./maxL/NZDSF_SSMF/t8.cpp ./maxL/NZDSF/t8.cpp ./maxL/!Right_noise1/NZDSF_SSMF/t8.cpp ./maxL/!Right_noise1/NZDSF/t8.cpp ./maxL/!Right_noise1/SSMF_NZDSF/t8.cpp ./maxL/!Right_noise1/SSMF/t8.cpp ./maxL/!Right_noise/NZDSF/t8.cpp ./maxL/!Right_noise/SSMF_NZDSF/t8.cpp ./maxL/!Right_noise/SSMF/t8.cpp ./maxL/SSMF_NZDSF/t8.cpp ./maxL/SSMF/t8.cpp ./OSNR_margin/!Large_research/!osnr_req/!new/NZDSF/t8.cpp ./OSNR_margin/!Large_research/!osnr_req/!new/SSMF_DCF/t8.cpp ./OSNR_margin/!Large_research/!osnr_req/!new/SSMF_NZDSF/t8.cpp ./OSNR_margin/!Large_research/!osnr_req/!new/SSMF/t8.cpp ./OSNR_margin/!Large_research/!osnr_req/!new/ULA_DCF/t8.cpp ./OSNR_margin/!Large_research/!osnr_req/!new/ULA/t8.cpp ./OSNR_margin/!Large_research/!osnr_req/!new/ULL_DCF/t8.cpp ./OSNR_margin/!Large_research/!osnr_req/!new/ULL/t8.cpp ./OSNR_margin/!Large_research/!osnr_req/SSMF_NZDSF/t8.cpp ./OSNR_margin/!Large_research/!osnr_req/SSMF/t8.cpp ./OSNR_margin/!Large_research/!osnr_req/test7/t8.cpp ./OSNR_margin/!Large_research/!osnr_req/ULA_DCF/t8.cpp ./OSNR_margin/!Large_research/!osnr_req/ULA/t8.cpp ./OSNR_margin/!Large_research/!osnr_req/ULL_DCF/t8.cpp ./OSNR_margin/!Large_research/!osnr_req/ULL/t8.cpp ./OSNR_margin/!Large_research/SSMF_DCF/t8.cpp ./OSNR_margin/!Large_research/SSMF_NZDSF/t8.cpp ./OSNR_margin/!Large_research/SSMF/t8.cpp ./OSNR_margin/!Large_research/ULA_DCF/t8.cpp ./OSNR_margin/!Large_research/ULA/t8.cpp ./OSNR_margin/!Large_research/ULL_DCF/t8.cpp ./OSNR_margin/!Large_research/ULL/t8.cpp ``` -- .overlay[ 486 версий одного файла. Все разные. ] --- # План доклада 1. Системы контроля версий, основные термины 2. Установка и настройка git 3. Создание репозитория 4. Добавление изменений 5. Публикация на Gitlab 6. Клонирование репозитория 7. Разрешение конфликтов 8. Полезные советы --- # Системы контроля версий Система контроля версий - это ПО для упрощения работы с часто изменяющимися документами. Она хранит всю историю изменений. .center[![Versions](img/play-changes.svg)] - Никогда ничего не теряется - Всегда есть возможность вернуться к любой предыдущей версии - Легко разобраться когда, кем и зачем было сделано изменение - Помогает в разрешении конфликтов при совместной работе .right[.footnote[Картинка [Software Carpentry](https://swcarpentry.github.io/git-novice/01-basics/)]] --- #
Git - это распределенная система контроля версий. Создана в 2005 году для управления исходным кодом ядра Linux. Лучше всего работает с текстовыми документами: - исходный код программ - статьи, презентации (Latex, Markdown) .right[.footnote[Картинка [Jason Long](https://git-scm.com/downloads/logos)]] --- # Определения **Репозиторий** - набор документов управляемых git. **Коммит** - одно изменение набора документов. **Рабочая копия** - текущее состояние набора документов. --- # Установка: Linux Используйте ваш пакетный менеджер .center[![XKCD universal install script](img/universal_install_script.png)] .right[.footnote[Автор картинки и скрипта [Randall Munroe](xkcd.com/1654/)]] --- # Установка: Windows Git for Windows - [git-for-windows.github.io](https://git-for-windows.github.io) Будем использовать командную оболочку Git Bash. Чтобы все хорошо работало с русскими буквами: - При установке поставить галочку "Use a TrueType font in all console windows" - В настройках Git Bash (правая кнопка по заголовку -> Options) на вкладке Text выбрать Locale: C, Character set: UTF-8 - `git config --global core.quotepath false` .right[.footnote[Можно еще попробовать [GitHub Desktop](https://desktop.github.com) и [TortoiseGit](https://tortoisegit.org/)]] ??? challenge accepted --- # Базовая настройка Имя пользователя и e-mail: ``` $ git config --global user.email "you@example.com" $ git config --global user.name "Your Name" ``` Текстовый редактор по умолчанию: ``` $ git config --global core.editor "nano" ``` или (для Windows): ``` $ git config --global core.editor "notepad" ``` **!** `notepad` без `.exe`, иначе будут чудеса с переводами строк. ??? notepad без exe, так будут правильные переводы строк $ - это приглашение командной строки --- # Создание репозитория ``` alice@work:~ $ mkdir rocket-science alice@work:~/rocket-science $ cd rocket-science/ alice@work:~/rocket-science $ git init Initialized empty Git repository in /home/alice/rocket-science/.git/ alice@work:~/rocket-science $ ls -a
. .. .git
``` ??? В директории .git лежит вся история --- # Добавление изменений Алиса написала программу: ```fortran C calculating pi by throwing stones PROGRAM stones IMPLICIT none REAL*8 area, x, y INTEGER niter, i, j, pi pi=0 niter=0 call RANDOM_SEED() DO i=1,10 DO j=1,100 call RANDOM_NUMBER(x) call RANDOM_NUMBER(y) x = x*2-1 y = y*2-1 IF ((x*x + y*y) .LT. 1) THEN pi = pi+1 ENDIF END DO niter = niter+100 area = 4.0 * pi/REAL(niter) WRITE(*,10) niter, area 10 FORMAT('Number of trials is: 'i5,' estimate of pi is:',f8.5) END DO END ``` и хочет добавить её в свой репозиторий. --- # git status Самая полезная команда. Показывает текущее состояние рабочей копии и подсказывает дальнейшие действия. ``` alice@work:~/rocket-science $ git status On branch master Initial commit Untracked files: (use "git add <file>..." to include in what will be committed)
pi.f
nothing added to commit but untracked files present (use "git add" to track) ``` --- # Состояния файлов в git .center[
] .right[.footnote[Картинка из [Git Book](https://git-scm.com/book/ru/v2/%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B-Git-%D0%97%D0%B0%D0%BF%D0%B8%D1%81%D1%8C-%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B9-%D0%B2-%D1%80%D0%B5%D0%BF%D0%BE%D0%B7%D0%B8%D1%82%D0%BE%D1%80%D0%B8%D0%B9)]] --- # Первый коммит Коммит в git происходит в два этапа. Сначала изменения рабочей копии переносятся в индекс (stage): ``` alice@work:~/rocket-science $ ls pi.f alice@work:~/rocket-science $ git add pi.f alice@work:~/rocket-science $ git status On branch master Initial commit Changes to be committed: (use "git rm --cached <file>..." to unstage)
new file: pi.f
``` --- # Первый коммит Коммит в git происходит в два этапа. Затем все изменения индекса фиксируются (commit): ``` alice@work:~/rocket-science $ git commit -m "Added pi program" [master (root-commit) 94c4404] Added pi program 1 file changed, 27 insertions(+) create mode 100644 pi.f alice@work:~/rocket-science $ git status On branch master nothing to commit, working directory clean ``` ??? Комментарии к тексту: сообщение коммита, хэш коммита --- # Внесение изменений Алиса продолжает работу над проектом. Она внесла изменения в программу и добавила Makefile для её сборки. ``` alice@work:~/rocket-science $ git status On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory)
modified: pi.f
Untracked files: (use "git add <file>..." to include in what will be committed)
Makefile
no changes added to commit (use "git add" and/or "git commit -a") ``` --- # git diff Команда `git diff` показывает изменения между различными версиями репозитория. По умолчанию она показывает изменения рабочей копии, не внесенные в индекс ``` alice@work:~/rocket-science $ git diff diff --git a/pi.f b/pi.f
diff --git a/pi.f b/pi.f
index a43f8d6..7764dde 100644
--- a/pi.f
+++ b/pi.f
@@ -10,7 +10,7 @@
C calculating pi by throwing stones call RANDOM_SEED() DO i=1,10
- DO j=1,100
+
DO j=1,200
call RANDOM_NUMBER(x) call RANDOM_NUMBER(y) x = x*2-1 ``` Makefile не отображается, т.к. еще не является отслеживаемым git. --- # git diff --staged Используется для просмотра изменений внесенных в индекс. ``` alice@work:~/rocket-science $ git add pi.f alice@work:~/rocket-science $ git diff alice@work:~/rocket-science $ git diff --staged
diff --git a/pi.f b/pi.f
index a43f8d6..7764dde 100644
--- a/pi.f
+++ b/pi.f
@@ -10,7 +10,7 @@
C calculating pi by throwing stones call RANDOM_SEED() DO i=1,10
- DO j=1,100
+
DO j=1,200
call RANDOM_NUMBER(x) call RANDOM_NUMBER(y) x = x*2-1 ``` Так можно проверить, что войдет в состав следующего коммита. --- # Коммит части изменений ``` alice@work:~/rocket-science $ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage)
modified: pi.f
Untracked files: (use "git add <file>..." to include in what will be committed)
Makefile
alice@work:~/rocket-science $ git commit -m "more iterations" [master ba8ec06] more iterations 1 file changed, 1 insertion(+), 1 deletion(-) alice@work:~/rocket-science $ git add Makefile alice@work:~/rocket-science $ git commit -m "add Makefile" [master ec5dd35] add Makefile 1 file changed, 2 insertions(+) create mode 100644 Makefile ``` --- # git log Отображает историю изменений репозитория. ``` alice@work:~/rocket-science $ git log
commit ec5dd35969d1ae54bffe9570312b9d6a00a47b28
Author: Alice <alice@example.com> Date: Tue Dec 6 12:37:18 2016 +0700 add Makefile
commit ba8ec060c7b323049561f08896dff0636f933fe2
Author: Alice <alice@example.com> Date: Tue Dec 6 12:36:53 2016 +0700 more iterations
commit 94c44048062dbb6bd9b94b47c600caba9878f26c
Author: Alice <alice@example.com> Date: Tue Dec 6 12:36:22 2016 +0700 Added pi program ``` ??? Потом я покажу как это же делать в Gitlab. Так должно быть удобнее. --- # Gitlab Gitlab - веб-оболочка для публикации и управления git-репозиториями. [gitlab.com](https://gitlab.com) бесплатно предоставляет: - Неограниченное число репозиториев - Приватные репозитории - Средства для создания сайтов - Систему отслеживания ошибок - Continious integration .right[.footnote[Для сотрудников ИВТ есть также внутренний сервер [gitlab.ict.sbras.ru](https://gitlab.ict.sbras.ru). Для получения доступа напишите на [kikht@ict.nsc.ru](mailto:kikht@ict.nsc.ru).]] --- # Создание проекта в Gitlab .center[
] --- # Создание проекта в Gitlab .center[
] --- # Создание проекта в Gitlab .center[
] --- # Создание ssh-ключа ``` alice@work:~/rocket-science $ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/alice/.ssh/id_rsa): Created directory '/home/alice/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/alice/.ssh/id_rsa. Your public key has been saved in /home/alice/.ssh/id_rsa.pub. The key fingerprint is: SHA256:4rGetQkx8Wn0jsp9UKAzExPy2XT7usaefzMNhE9OdY0 alice@work The key's randomart image is: +---[RSA 2048]----+ | . ... . ..| | oo+.. . E +| | ++o.. . ..| | =+ o... + | | =+S.. .* | | . B.o . + | | + ooo o | | o * o+o + .| | = +++... o | +----[SHA256]-----+ ``` --- # Печать публичного ключа ``` alice@work:~/rocket-science $ cat /home/alice/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCd86csqhu8VtDMZsiXvZZ1S8Y8N5sEkOmYW2t76IMisgYn4/kvl8pl2z9L4s1MIIBWAvYXJyiEfR5cPw2Uyokc+a90zlv8VoOVbavnQCxeIKdtNZgwdyCktvPi0VTkKNRpBMKS7vQXE52wtv7cPYzRGtaaMX5Mf1SbifYAM3Hd3CDWDwTFOybGnLjYM5HLVJ5Jo276OQmGr0OrwOJMjVEF3koTogfiUK40Dynj3sMx86/4uENWRVjLGFimQZ440fYEmg+xe13bMdzUbQmdBpsyGJ2fRU4k/efmj/oKnT+C/uNasu7uO+2EdYFB0fqiNhvPO9X5wTaB56F34z5uMtIH alice@work ``` Эту строчку нужно скопировать в настройки Gitlab. .right[.footnote[Ключ также можно создать с помощью [puttygen](http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html)]] --- # Добавление ключа в Gitlab .center[
] --- # Добавление ключа в Gitlab .center[
] --- ## Загрузка репозитория на Gitlab ``` alice@work:~/rocket-science $ git remote add origin \ git@gitlab.ict.sbras.ru:alice/pi.git alice@work:~/rocket-science $ git push -u origin master The authenticity of host 'gitlab.ict.sbras.ru (84.237.92.75)' can't be established. RSA key fingerprint is SHA256:syRFqFxwEGbajxd3A6RDCXUx2y+94HuVJfQUNTpydVI. RSA key fingerprint is MD5:6c:2b:ca:54:de:8f:43:0c:56:28:8c:71:25:5c:d5:61. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'gitlab.ict.sbras.ru,84.237.92.75' (RSA) to the list of known hosts. Counting objects: 9, done. Delta compression using up to 4 threads. Compressing objects: 100% (6/6), done. Writing objects: 100% (9/9), 995 bytes | 0 bytes/s, done. Total 9 (delta 1), reused 0 (delta 0) To git@gitlab.ict.sbras.ru:alice/pi.git * [new branch] master -> master Branch master set up to track remote branch master from origin. ``` --- # Предоставление доступа .center[
] --- # Предоставление доступа .center[
] --- # Предоставление доступа .center[
] --- # Клонирование репозитория ``` bob@work:~ $ git clone git@gitlab.ict.sbras.ru:alice/pi.git rocket-science Cloning into 'rocket-science'... The authenticity of host 'gitlab.ict.sbras.ru (84.237.92.75)' can't be established. RSA key fingerprint is SHA256:syRFqFxwEGbajxd3A6RDCXUx2y+94HuVJfQUNTpydVI. RSA key fingerprint is MD5:6c:2b:ca:54:de:8f:43:0c:56:28:8c:71:25:5c:d5:61. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'gitlab.ict.sbras.ru,84.237.92.75' (RSA) to the list of known hosts. remote: Counting objects: 9, done. remote: Compressing objects: 100% (6/6), done. remote: Total 9 (delta 1), reused 0 (delta 0) Receiving objects: 100% (9/9), done. Resolving deltas: 100% (1/1), done. Checking connectivity... done. bob@work:~ $ ls rocket-science bob@work:~ $ cd rocket-science bob@work:~/rocket-science $ ls Makefile pi.f ``` --- ## Отправка изменений на Gitlab ``` bob@work:~/rocket-science $ git add paper.tex bob@work:~/rocket-science $ git commit -m "Start writing paper" [master 5694e7d] Start writing paper 1 file changed, 26 insertions(+) create mode 100644 paper.tex bob@work:~/rocket-science $ git push Counting objects: 3, done. Delta compression using up to 4 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 498 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To git@gitlab.ict.sbras.ru:alice/pi.git ec5dd35..f385e19 master -> master ``` ??? bob@work:~/rocket-science $ git status On branch master Your branch is up-to-date with 'origin/master'. Untracked files: (use "git add <file>..." to include in what will be committed)
paper.tex
nothing added to commit but untracked files present (use "git add" to track) --- ## Получение изменений c Gitlab ``` alice@work:~/rocket-science $ git pull remote: Counting objects: 3, done. remote: Compressing objects: 100% (3/3), done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From gitlab.ict.sbras.ru:alice/pi ec5dd35..f385e19 master -> origin/master Updating ec5dd35..f385e19 Fast-forward paper.tex | 26
++++++++++++++++++++++++++
1 file changed, 26 insertions(+) create mode 100644 paper.tex alice@work:~/rocket-science $ ls Makefile paper.tex pi.f ``` --- # Слияние изменений Алиса решила добавить оптимизацию в Makefile. ``` alice@work:~/rocket-science $ git diff
diff --git a/Makefile b/Makefile
index b9c95c3..a9c5ff1 100644
--- a/Makefile
+++ b/Makefile
@@ -1,2 +1,2 @@
pi: pi.f
- gfortran -o pi pi.f
+
gfortran -O2 -o pi pi.f
alice@work:~/rocket-science $ git add Makefile alice@work:~/rocket-science $ git commit -m "we need optimization" [master c9c6b02] we need optimization 1 file changed, 1 insertion(+), 1 deletion(-) alice@work:~/rocket-science $ git push ... ``` --- # Слияние изменений А Боб в то же время добавил сборку статьи в Makefile. ``` bob@work:~/rocket-science $ git diff
diff --git a/Makefile b/Makefile
index b9c95c3..0eadf06 100644
--- a/Makefile
+++ b/Makefile
@@ -1,2 +1,5 @@
pi: pi.f gfortran -o pi pi.f
+
+
paper.pdf: paper.tex
+
pdflatex paper.tex
bob@work:~/rocket-science $ git add Makefile bob@work:~/rocket-science $ git commit -m "add paper to Makefile" [master fde3e9f] add paper to Makefile 1 file changed, 3 insertions(+) ``` --- # Слияние изменений У Боба не получится сделать `git push`: ``` bob@work:~/rocket-science $ git push To git@gitlab.ict.sbras.ru:alice/pi.git ! [rejected] master -> master (fetch first) error: failed to push some refs to 'git@gitlab.ict.sbras.ru:alice/pi.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. ``` Это произойдет потому, что в удаленном репозитории появились изменения, про которые Боб (и его репозиторий) еще не знает. --- # Слияние изменений Бобу придется сперва загрузить изменения командой `git pull`: ``` bob@work:~/rocket-science $ git pull remote: Counting objects: 3, done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From gitlab.ict.sbras.ru:alice/pi f385e19..c9c6b02 master -> origin/master Auto-merging Makefile CONFLICT (content): Merge conflict in Makefile Automatic merge failed; fix conflicts and then commit the result. ``` и он обнаружит конфликт в Makefile. Если бы Алиса и Боб изменяли бы разные файлы, то конфликта бы не было и слияние произошло бы автоматически. А теперь Бобу придется разрешить конфликт вручную. --- # Разрешение конфликтов Как всегда команда `git status` подскажет, что именно нужно сделать: ``` bob@work:~/rocket-science $ git status On branch master Your branch and 'origin/master' have diverged, and have 1 and 1 different commit each, respectively. (use "git pull" to merge the remote branch into yours) You have unmerged paths. (fix conflicts and run "git commit") Unmerged paths: (use "git add <file>..." to mark resolution)
both modified: Makefile
no changes added to commit (use "git add" and/or "git commit -a") ``` --- # Разрешение конфликтов В настоящий момент Makefile выглядит так: ```make pi: pi.f <<<<<<< HEAD gfortran -o pi pi.f paper.pdf: paper.tex pdflatex paper.tex ======= gfortran -O2 -o pi pi.f >>>>>>> c9c6b02a843ed00e278d3ca4410ae31c37e9303c ``` Для конфликтных фрагментов показаны обе версии файла. .right[.footnote[Различные утилиты и IDE могут показывать конфликты в более приятном виде]] --- # Разрешение конфликтов Приведем все в порядок: ```make pi: pi.f gfortran -O2 -o pi pi.f paper.pdf: paper.tex pdflatex paper.tex ``` и пометим разрешение конфликта: ``` bob@work:~/rocket-science $ git add Makefile bob@work:~/rocket-science $ git commit -m "Merged Makefile changes" [master ff15706] Merged Makefile changes ``` --- # Разрешение конфликтов Теперь Боб может загрузить свои изменения на Gitlab. ``` bob@work:~/rocket-science $ git push Counting objects: 6, done. Delta compression using up to 4 threads. Compressing objects: 100% (6/6), done. Writing objects: 100% (6/6), 706 bytes | 0 bytes/s, done. Total 6 (delta 0), reused 0 (delta 0) To git@gitlab.ict.sbras.ru:alice/pi.git c9c6b02..ff15706 master -> master ``` --- ## Просмотр истории изменений .center[
] --- ## Просмотр истории изменений В командной строке: ``` bob@work:~/rocket-science $ git log --graph --oneline *
ff15706
Merged Makefile changes
|
\
|
*
c9c6b02
we need optimization *
|
fde3e9f
add paper to Makefile
|
/
*
f385e19
Start writing paper *
ec5dd35
add Makefile *
ba8ec06
more iterations *
94c4404
Added pi program ``` --- # .gitignore Иногда нужно, чтобы git игнорировал некоторые файлы в рабочей копии (собранные бинарные файлы, файлы конфигурации, временные файлы и т.п.) Имена таких файлов можно внести в `.gitignore`: ``` bob@work:~/rocket-science $ cat .gitignore pi *.tmp bob@work:~/rocket-science $ ls Makefile paper.tex
pi
pi.f pi.f.tmp bob@work:~/rocket-science $ git status On branch master Your branch is up-to-date with 'origin/master'. Untracked files: (use "git add <file>..." to include in what will be committed) .gitignore nothing added to commit but untracked files present (use "git add" to track) ``` .right[.footnote[Не забудьте закоммитить сам `.gitignore`]] --- class: center, middle # Полезные советы --- # Общие рекомендации - Сохраняйте изменения (commit) как можно раньше и как можно чаще. - Пишите полезные сообщения к изменениям. - Не бойтесь экспериментировать. - Используйте много репозиториев. - Научитесь пользоваться ветками (branch). - Не меняйте уже опубликованные коммиты. --- # Что не стоит хранить в git - То что можно автоматически сгенерировать (бинарные файлы программ, pdf для статей и т.п.) - Очень большие файлы - Результаты расчетов .right[.footnote[Для больших файлов обратите внимание на Git LFS]] --- # Кодировка windows-1251 Лучше сконвертировать все в utf-8: ``` find . -name "*.f" \ -exec iconv -f cp1251 -t utf8 {} -o {}.new \; \ -exec mv -f {}.new {} \; \ -print ``` --- # Кодировка windows-1251 `git diff` сломается. Можно настроить конвертирование всего вывода: ``` $ git config --local core.pager "iconv -f cp1251 -t utf-8 | less" ``` но тогда будут проблемы с отображением текста коммитов. Это можно частично исправить: ``` $ git config --local i18n.commitEncoding utf8 $ git config --local i18n.logoutputencoding cp1251 ``` .center[
] ??? TODO: пример сломавшегося и починенного --- # Литература - [Git Book](https://git-scm.com/book/ru/) - RTFM: ``` $ git help <команда> $ git <команда> --help $ man git-<команда> ``` - Эта презентация доступна по адресу [cluster-web.esemc.nsc.ru/~kikht/git-slides/slides.html](http://cluster-web.esemc.nsc.ru/~kikht/git-slides/slides.html) --- class: center, middle # Вопросы и ответы