Задача выделения объекта на изображении: хаотично-фазовая синхронизация и аси...
Software engineering seminars: git
1. Технологии разработки программного обеспечения
(практика)
Мартынов Семён, Хозяинов Иван
Санкт-Петербургского политехнического университета Петра Великого
Института компьютерных наук и технологий
Кафедра компьютерных систем и программных технологий
21 октября 2017 г.
Мартынов Семён, Хозяинов Иван ТРПО (практика) 21 октября 2017 г. 1 / 31
2. Содержание
1 Итоги прошлого семинара
Итоги теста
Docker compose
Новый тест
2 Git
Введение
Основные команды
Git best practices
Решение конфликтов
3 Прочее
Мартынов Семён, Хозяинов Иван ТРПО (практика) 21 октября 2017 г. 2 / 31
3. Итоги теста
Всего сдано работ: 23
Уровень владения Linux: A15 = 3.4, Var = 1.68
Уровень владения Java: A21 = 5.1, Var = 1.39
Знакомые языки: C, C++, Java, Pascal, Python, C#, Lua, Bash,
Kotlin, SQL, ASM, JS, PHP, HTML (???), CSS, Fortran, Matlab
Hello World:
C: 7
Java: 7
C++: 4
PHP: 2
Python: 1
Работающих решений: 68.18%
Мартынов Семён, Хозяинов Иван ТРПО (практика) 21 октября 2017 г. 3 / 31
7. Docker compose: example
Example (docker-compose.yml)
version: ’3’
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
Мартынов Семён, Хозяинов Иван ТРПО (практика) 21 октября 2017 г. 7 / 31
8. Docker compose: WP
Example (docker-compose.yml)
wordpress:
image: wordpress
links:
- mariadb:mysql
environment:
- WORDPRESS_DB_PASSWORD=<password>
ports:
- "<server public IP>:80:80"
volumes:
- ./code:/code
- ./html:/var/www/html
mariadb:
image: mariadb
environment:
- MYSQL_ROOT_PASSWORD=<password>
- MYSQL_DATABASE=wordpress
volumes:
- ./database:/var/lib/mysql
Мартынов Семён, Хозяинов Иван ТРПО (практика) 21 октября 2017 г. 8 / 31
9. Тест
ФИО, Группа?
Сделал(а) ли я ДЗ?
Как я оцениваю свой уровень владения git?
В чём отличие Docker от полноценной виртуализации (VirtualBOX)
и контейнерной (LXC)?
Программа принимает на вход конечную строку чисел. На любимом
ЯП, найдите где начинается самая длинная подпоследовательность.
Вход: 1567779844645556664444416541467
Выход: 19
У меня приложение на Java + MongoDB. Мои шаги по деплою?
Мартынов Семён, Хозяинов Иван ТРПО (практика) 21 октября 2017 г. 9 / 31
11. Системы управления версиями
Системы управления версиями:
Папки (архивы)
CVS (Concurrent Versions System) – 1990, GPL
Perforce Helix (Perforce, P4) – 1995, Proprietary
Subversion (SVN) – 2000, Apache License 2.0
Team Foundation Server (TFS) – 2005(?), Microsoft Trialware
Git (гит, не джит!!!) – 7 апреля 2005, GNU GPL 2
Mercurial (Hg) – 19 апреля 2005, GNU GPL 2
Мартынов Семён, Хозяинов Иван ТРПО (практика) 21 октября 2017 г. 11 / 31
16. Основные возможности, плюсы
(почти) Все локально, можно работать без интернета
Контроль, можно удалить коммит, разбить на несколько,
поменять местами
Мерджить ветки одно удовольствие
Коммит изменений, а не файлов
Наглядные и мощные диф и лог
Stash для многостаночников
Bisect и Blame чтобы найти крайнего
Субмодули для сложных проектов
Ориентация на работу в команде
GUI для котиков и консоль для красноглазиков
Платформы GitHub, BitBucket
Мартынов Семён, Хозяинов Иван ТРПО (практика) 21 октября 2017 г. 16 / 31
17. Основные возможности, минусы
Отсутствие сквозной нумерации коммитов
Использование такииииих длиииииинных хешей SHA1 для
идентификации ревизий
SHA1 (Линус сказал что у него есть план)
Система работает только с файлами и их содержимым, и не
отслеживает пустые каталоги
Накладные расходы при работе с несвязными данными
(Используйте p4?!)
3 шага чтобы показать свой код...
Мартынов Семён, Хозяинов Иван ТРПО (практика) 21 октября 2017 г. 17 / 31
18. Три шага вместо одного (в SVN)
Мартынов Семён, Хозяинов Иван ТРПО (практика) 21 октября 2017 г. 18 / 31
19. Основные команды
Создание репозитория
$ git init
Клонирование из определённого источника
$ git clone [url]
Добавление/Удаление файлов в индекс
$ git add file1 file2 ...
$ git add dir
$ git add --all
$ git rm file1 file2 ...
Коммит в локальный репозиторий
$ git commit file1 file2 ... [-m msg]
$ git commit -a [-m msg]
$ git commit --amend file1 file2 ... [-m msg]
Мартынов Семён, Хозяинов Иван ТРПО (практика) 21 октября 2017 г. 19 / 31
20. Основные команды: статус
Отправка своих изменений на сервер
$ git push [remote]
$ git push remote branch
$ git pull remote
Статус и изменения
$ git status
$ git diff
Просмотр истории
$ git log
$ git log --author=author
$ git log --after="MMM DD YYYY"
$ git blame file rev
Мартынов Семён, Хозяинов Иван ТРПО (практика) 21 октября 2017 г. 20 / 31
21. Работа с ветками
Просмотр веток
$ git branch
$ git branch -r
Переключение между ветками и коммитами
$ git checkout branch
$ git checkout rev
Создание/удаление веток
$ git checkout -b branch
$ git branch -d hotfix
Переключение веток без потери изменений
$ git stash
$ git checkout branch
$ git git stash pop
Мартынов Семён, Хозяинов Иван ТРПО (практика) 21 октября 2017 г. 21 / 31
22. Git best practices
Первичная настройка (опционально: gravatar)
$ git config --global user.name "YOUR NAME"
$ git config --global user.email "YOUR_EMAIL@EXAMPLE.COM"
Всегда смотреть индекс перед коммитом
$ git status
Делать связь между номером задачи и коммитом
$ git commit -am "issue-123: blah-blah-blah..."
Делать частые коммиты при работе, но пушить одним изменением
$ git rebase -i HEAD~3
Удалить (откатить) последний локальный коммит
$ git reset HEAD~
Мартынов Семён, Хозяинов Иван ТРПО (практика) 21 октября 2017 г. 22 / 31
23. Git best practices
Перемещение файлов и директорий
$ git mv path1 path2
Не комитить (т.е. стараться избегать) бинарные ресурсы
$ echo "Git is not intended for it."
Комбинировать коммиты
$ git commit --amend --no-edit
Не делать rebase уже отданных изменений
$ git rebase --interactive
... не использовать –force на отданных ветках!
$ git push --force
Мартынов Семён, Хозяинов Иван ТРПО (практика) 21 октября 2017 г. 23 / 31
24. Модели работы с git
Git flow (Vincent Driessen)
GitHub flow (Scott Chacon)
GitLab Flow (Sytse
Sijbrandij)
Мартынов Семён, Хозяинов Иван ТРПО (практика) 21 октября 2017 г. 24 / 31
25. Основные ветки
Центральный репозиторий
всегда содержит две ветки с
неограниченным сроком жизни:
master – в любой момент
времени содержит
production-ready код,
каждый коммит в эту ветку
считается новым релизом
продукта
develop – содержит
последний срез разработки,
который готовится к релизу
Мартынов Семён, Хозяинов Иван ТРПО (практика) 21 октября 2017 г. 25 / 31
26. Ветки поддержки
Feature branches
Используется для разработки новых функциональных возможностей и
исправления ошибок. Когда начинается реализация функции, может
быть неизвестно, в какой релиз она будет включена, но обычно
существует 2-3 дня. Порождается и вливается в ветку develop.
Release branches
Ветка предназначена для подготовки кода к релизу. Позволяет вставить
последние минорные изменения и добавить мета-данные (номер версии,
дата сборки, и т.д.). Срок жизни 1-2 часа, порождается от develop,
вливается в develop и master.
Hotfix branches
Эти ветки необходимы, когда в уже выпущено продукте обнаруживается
критический баг, который необходимо срочно исправить. Срок жизни –
чем меньше, тем лучше. Порождаются от master, должны вливаться в
develop и master.
Мартынов Семён, Хозяинов Иван ТРПО (практика) 21 октября 2017 г. 26 / 31
28. Решение конфликтов
В какой ситуации могут возникнуть конфликты?
Получили конфликт
$ git checkout featuredo-something-god
Switched to branch ’featuredo-something-god’
$ git merge develop
Auto-merging lib/hello.html
CONFLICT (content): Merge conflict in lib/hello.html
Automatic merge failed; fix conflicts and then commit the resul
Мартынов Семён, Хозяинов Иван ТРПО (практика) 21 октября 2017 г. 28 / 31
29. Решение конфликтов
Как выглядит конфликтный файл?
Файл: lib/hello.html
<!-- Author: Semen Martynov (semen.martynov@gmail.com) -->
<html>
<head>
<<<<<<< HEAD
<link type="text/css" rel="stylesheet" media="all" href="st
=======
<!-- no style -->
>>>>>>> develop
</head>
<body>
<h1>Hello,World! Life is great!</h1>
</body>
</html>
Мартынов Семён, Хозяинов Иван ТРПО (практика) 21 октября 2017 г. 29 / 31
30. Решение конфликтов
Возможные решения:
Отредактировать файл
git checkout –ours lib/hello.html
git checkout –theirs lib/hello.html
сохранить:
Файл: lib/hello.html
$ git add lib/hello.html
$ git commit -m "Merged master fixed conflict."
Recorded resolution for ’lib/hello.html’.
[style 645c4e6] Merged master fixed conflict.
И это победа!
Мартынов Семён, Хозяинов Иван ТРПО (практика) 21 октября 2017 г. 30 / 31
31. ДЗ:
Написать сервис валидации JSON файлов.
На вход поступает некий файл, на выход либо форматированный JSON
либо сообщение об ошибке.
Работу вести в публичном git репозитории.
Обеспечить запуск из Docker.
Вопросы?
Замечания?
Дополнения?
Мартынов Семён, Хозяинов Иван ТРПО (практика) 21 октября 2017 г. 31 / 31