Для чего нужен гит?
- На большом проекте, где есть несколько разработчиков, появляется проблема - один человек может затереть правки другого. Для решения этой проблемы есть ветки.
- Сложно переносить вручную правки (деплоить), когда они в десятках отдельных файлов. Тут в дело вступают удаленные репозитории, команды git push и git pull.
- После какой-то правки на сайте появился баг, кто конкретно допустил ошибку и когда - не известно. Для поиска нужного коммита используйте git bisect.
- Как посмотреть состояние сайта, которое было год назад? Используйте git checkout имя_коммита
Множество проблем решает установка гит.
Удаленный репозиторий - это не репо, который удалили, а репо, который находится на внешнем сервере, например на Github.
Создаем .gitignore
В битрикс большинство страниц хранятся как физические файлы на сервере - это дает нам возможность отслеживать их через гит.
Кроме страниц, хочется в гит иметь шаблон и папку php_interface. Они могут храниться в папках bitrix и local. Если всю папку local мы можем добавить в гит, то с bitrix - сложнее. В папке /bitrix/php_interface/ есть файл с доступами к базе данных, который не желательно хранить в гит.
В корне сайта из гит убираем .htaccess и robots.txt, так как их в них часто прописывается хост сайта. А при работе с тестовыми сайтами бывает требуется прописать туда адреса тестовые.
В корне сайта еще бывают файлы IDE разработчиков, xml карты сайта, некоторые любят дампы базы данных держать в кроне сайта - не пускаем всё это в гит.
В итоге получается то, что ниже. Выкладываю оптимальный .gitignore для Bitrix, который максимально отслеживает всё файлы и не видит ядро:
#
# Source: https://github.com/MashinaMashina/Bitrix/blob/master/gitignore
#
.idea
/.htaccess
/upload/
logs/
/*.html
/sitemap*.xml
~*
*.log
/*.sql
Thumbs.db
.DS_Store
._.DS_Store
/robots.txt
/bitrix/.settings.php
/bitrix/activities/
/bitrix/admin/
/bitrix/backup/
/bitrix/click.php
/bitrix/components/
/bitrix/coupon_activation.php
/bitrix/footer.php
/bitrix/gadgets/
/bitrix/header.php
/bitrix/image_uploader/
/bitrix/images/
/bitrix/index.php
/bitrix/js/
/bitrix/css/
/bitrix/license_key.php
/bitrix/modules/
/bitrix/otp/
/bitrix/p3p.xml
/bitrix/redirect.php
/bitrix/rk.php
/bitrix/rss.php
/bitrix/sounds/
/bitrix/spread.php
/bitrix/stop_redirect.php
/bitrix/template/
/bitrix/themes/
/bitrix/tmp/
/bitrix/tools/
/bitrix/urlrewrite.php
/bitrix/virtual_file_system.php
/bitrix/web.config
/bitrix/wizards/
/bitrix/catalog_export/
/bitrix/updates/
/bitrix/panel/
/bitrix/services/
/bitrix/php_interface/include/sale_payment/
/bitrix/php_interface/include/sale_delivery/
/bitrix/php_interface/dbconn.php
/bitrix/cache/
/bitrix/managed_cache/
/bitrix/stack_cache/
/bitrix/html_pages/
/bitrix/blocks/
/bitrix/resize_cache/
Создание Git Bitrix для 1 сайта
Проще всего создавать гит, когда у вас только 1 сайт. А тестовые делать уже, когда система управления версиями готова.
Когда у нас только один сайт, достаточно в папке сайта инициализировать гит, установить гитигнор, добавить все файлы в гит, закоммитить.
Необходимые команды:
cd /site_path
wget -O .gitignore https://raw.githubusercontent.com/MashinaMashina/Bitrix/master/gitignore
git init
git add -A
git config user.name "Your Name" && git config user.email "your@email.com"
git commit -m "Initial commit"
Где /site_path - путь к папке сайта
"Your Name" - ваше имя и фамилия латинскими символами
"your@email.com" - ваш емаил, желательно тот, что использовался при регистрации аккаунта в хранилище git репозитория (на Github, Gitlab...).
С помощью wget мы скачиваем гитигнор для Битрикс в папку сайта. Можно так же вручную вставить в файл .gitinore контент отсюда.
Добавление удаленного репозитория (хранилища Github, gitlab...):
git remote add origin https://github.com/youname/project.git
git push -u origin master
Где https://github.com/youname/project - ссылка на ваш репозиторий
Создание Git для двух сайтов
Когда сайта два, появляется проблема с тем, что они не всегда идентичны. Какие-то правки могут быть на одном сайте и не быть на другом.
Создавая два отдельных гита на двух сайтах - их не получается просто слить вместе, потому что нет общей точки в истории коммитов.
Чтобы решить данные проблемы, поступим так: возьмем первый сайт за актуальный, в случае конфликта, не будем сливать, а возьмем файл отсюда. При первом слиянии разрешим слияние отдельных репозиториев, коммит слияния будет первой общей точкой.
Первый сайт, с актуальными файлами буду называть прод, второй сайт - тестовый.
Подготовка:
- На проде создаем гит аналогично инструкции для одного сайта. Отправляем (пушим) в удаленный репозиторий.
- На тестовом тоже так же создаем гит, добавляем удаленный репозиторий (git remote add...), но не пушим.
После подготовки, работаем на тестовом.
Команды:
git fetch origin
git checkout origin/master
git checkout -b tmp
git merge master --strategy=ours --allow-unrelated-histories
git checkout master
git merge tmp
git push
После этого у нас репозитории свяжутся.
Разберем подробнее все команды
git fetch origin - получаем данные, которые мы отправили с прода, с помощью git push. git fetch - почти то же самое, что и git pull, только не происходит слияния.
git checkout origin/master - переключаем файлы на версию, как на проде. Получается сейчас у нас две отдельных истории коммитов в гит.
git checkout -b tmp - из текущего состояния создаем ветку, чтобы можно было проводить слияния.
git merge master --strategy=ours --allow-unrelated-histories - тут самая магия. Мы сливаем два отдельных гита в один. При конфликтах будет использоваться стратегия ours (наше), файлы будут как на проде, так как мы переключены на ветку с прода. --allow-unrelated-histories - разрешает сливать гиты, у которых нет общей точки. Без этого вы получите ошибку "refusing to merge unrelated histories".
git checkout master - обратно переключаемся в состояние тестового сайта
git merge tmp - сливаемся с веткой tmp, в которой: уже есть общий коммит с историей тестового и прода, нет конфликтов.
git push - всё отправляем обратно в удаленный репозиторий. А дальше и на прод. На проде никаких изменений не произойдет, потому что мы брали версию прода при слиянии.