понедельник, 12 августа 2019 г.

Использование GIT

Использование GIT

Установка и первичная настройка на рабочем сервере
Установка git на сервере, где ведется разработка (рабочем сервере)
# yum install git
Настройка базовых вещей – установка автора и раскраска вывода консоли
# git config --global user.name "User"
# git config --global user.email user@yandex.ru
# git config --global color.ui auto
# git config --global color.branch auto
# git config --global color.diff auto
# git config --global color.interactive auto
# git config --global color.status auto

Создаем приватный репозитарий на Github.com. Для конкретики наш проект будет носить имя dosya-client.
1) Заходим под своей учеткой
user@yandex.ru / xxxxxxxxxxx
2) Справа вверху нажимаем на "+" и выбираем "New repository"
3) Вписываем название репозитария dosya-client,
выбираем тип репозитария - Private
4) Нажимаем кнопку "Create repository"

Создаем рабочую директорию на рабочем сервере и заходим в нее:
# mkdir /home/dosya-client
# cd /home/dosya-client
Инициализация проекта на рабочем сервер выполняется командой:
# git init
В данной рабочей директории будем вести разработку.
Сам репозитарий будет создан в скрытой папке /home/dosya-client/.git/
Начало разработки в рабочей директории:
Формирование шаблона файла описания проекта:
# echo "# dosya-client" >> README.md
Добавление удаленного репозитария с именем по умолчанию "origin"
# git remote add origin https://github.com/user/dosya-client.git

Связь между рабочей директорией и удаленным репозитарием


В рабочей директории добавляем файлы, например index.html и style.css.
Для включения файла в коммит выполняем команду:
# git add index.html
Или сразу все файлы в директории добавляем в коммит:
# git add . (git add -A)
Выполняем коммит - после завершения некоторого этапа разработки.
Обязательно пишем комментарий
# git commit -m "Старт разработки. Только html, без Javascript"
Выполняем загрузку текущего состояния в удаленный репозиторий, который создали ранее с именем orign:
# git push origin master
Здесь orign - имя, которое мы дали удаленному репозитарию, master - имя ветки.
По умолчанию считается, что ветка master - основная.
После этой операции на сервере github.com на страничке https://github.com/user/dosya-client
будут содержаться файлы нашего текущего состояния разработанного кода

Ведя разработку в домашнем каталоге нужно видеть код в браузере.
Для этого можно запустить тестовый web-сервер с утилитой browser-sync
Установка утилиты:
# npm install -g browser-sync
Утилита browser-sync создает нам web-сервер на 3000 порту
Запускается командой:
# browser-sync start --server --files "*"

Настройка продакшен-сервера и рабочего сервера для обновления с помощью GIT.
Продакшен сервер несет рабочую версию программы, которой пользуются юзеры.


На продакшен сервер будем закачивать код обновления с рабочего сервера.
Для этого на продакшен сервере разместим git репозитарий типа bare (голый).
При создании такого репозитария папка с файлами проекта находиться отдельно от репозитария,
и мы може не светить директорию .git в корне web-сервера.
Создаем директорию репозитария уровнем выше, чем директория web-сервера:
# mkdir /var/www/dosya-client.git
# cd /var/www/dosya-client.git/
# git init --bare
Данная команда разместит репозитарий прямо в папке /var/www/dosya-client.git/,
без скрытой папки .git
Создаем специальный "хук". Это команда, которая будет выполнятся после какого-то события.
Будем выполнять команду выкладывания рабочих файлов в каталог web-сервера (/var/www/html)
после выполнения процедуры приема обновлений файлов с рабочей машины
# touch /var/www/dosya-client.git/hooks/post-receive
# chmod +x /var/www/dosya-client.git/hooks/post-receive
Содержимое файла:
#!/bin/sh
GIT_WORK_TREE=/var/www/html git checkout -f
Теперь на рабочем сервере добавим еще один репозитарий - продакшен сервер
# git remote add prod ssh://root@IPсервера/var/www/dosya-client.git/
Обновлять данные на продакшен сервере будем командой:
# git push prod master

Файл .gitignore
Файл .gitignore в корне рабочей папки используется для настройки
перечня файлов, которые должны игнорироваться git при индексации
и не закачиваться в удаленный репозитарий
# nano .gitignore
помещает туда маски файлов, которые нужно игнорировать, например:
.gitignore
*.log
*~
style-develop.css
Здесь не будет никуда передавать сам файл .gitignore, а так же файлы имеющие расширение Log, файлы заканчивающиеся ~ и файл style-develop.css

Текущая разработка.
Перед началом разработки вытягиваем изменения с github
# git pull orign master
ТЕПЕРЬ ВЕДЕМ РАЗРАБОТКУ И ВЫПОЛНЯЕМ ПОСЛЕДУЮЩИЕ ОБНОВЛЕНИЯ:
Из рабочей директории рабочего сервера после выполнения этапа разработки
# git add .
# git commit -m "Поменял то-то и то-то"
# git push origin master (загрузка на github)
# git push prod master (загрузка на продакшен сервер)

Откат на предыдущие версии кода
Отмена последнего коммита
# git reset --hard HEAD~1
Отмена до определенного коммита
# git reset --hard HEAD <хэш коммита>
Хеш коммита узнаем из команды git log или из web-интерфейса github.com
Например
# git reset --hard HEAD 50dc282971ed2611370c49e55cbf962d1529584a
Теперь загружаем в удаленный репозитарий, но при этом используем опцию –f
# git push -f origin master
# git push -f prod master
Она необходима для принудительной загрузки. Если ее не использовать, то git будет считать происходящее конфликтом, так как в репозитарии более новая версия и мы пытаемся обновить ее старыми данными.
Если не использовать команду –f, то сначало нужно выполнить
# git pull origin master
И вручную пофиксить ошибки - вручную исправить файл до требуемого состояния

Ветвление кода
Базовая модель ветвления содержит основную ветку master, ветку с фиксирование багов fix и ветку разработки develop:


Создание новой ветки из текущей позиции
# git branch develop
Переключение на новую ветку:
# git checkout develop
Слияние ветки master c develop:
# git checkout master
# git merge develop

И затем:
# git add .
# git commit -m "слил ветки"
# git push origin master (загрузка на github)
# git push prod master (загрузка на продакшен сервер)

Удаление ветки:
# git branch –d develop

Статусы работы в git:
# git status - статус репозитария. Какие файлы есть для обновления, какие изменились.
# git log - лог изменений
# git remote -v - список удаденных репозитариев
# git branch – Список веток проекта
# git log --oneline --decorate --graph --all     – отображение веток в псевдографическом интерфейсе