--- title: "Git Workflow для Hugo блога" date: 2026-02-23 draft: false description: "Универсальная шпаргалка по работе с Hugo блогом через Git с двумя окружениями. Префиксы коммитов, откаты, типичные ошибки и решения." tags: ["git", "workflow", "hugo", "cheatsheet"] categories: ["Шпаргалки"] showComments: true --- ## Структура проекта ``` ~/projects/blog/ ← одна папка, две ветки ├── main ← production (blog.ru) └── dev ← development (dev.blog.ru) ``` >[!IMPORTANT] **Принцип:** Одна папка, две ветки. Переключение через `git checkout`, не через разные директории. --- ## Золотые правила ✅ **ВСЕ изменения только через dev** ✅ В main попадает только через `git merge dev` ✅ Никогда не редактировать находясь на main ✅ Всегда `git pull` перед началом работы ✅ Проверяй на dev окружении перед публикацией ❌ Не редактировать на ветке main ❌ Не делать `git push --force` в main ❌ Не забывать `git pull` перед merge --- ## Префиксы для commit сообщений ### Основные **feat:** - новая функциональность ```bash feat: новая статья про Kubernetes feat: добавил комментарии ``` **fix:** - исправление ошибки ```bash fix: опечатка в статье fix: сломанная ссылка ``` **style:** - форматирование, стили ```bash style: настроил CSS для тёмной темы style: исправил отступы ``` **docs:** - изменения в документации ```bash docs: обновил README ``` **refactor:** - рефакторинг без изменения функций ```bash refactor: упростил структуру конфигов ``` **chore:** - рутинные задачи ```bash chore: обновил зависимости chore: удалил старые файлы ``` **revert:** - откат коммита ```bash revert: "feat: добавил комментарии" ``` ### Дополнительные **perf:** - улучшение производительности **test:** - тесты **build:** - изменения сборки **ci:** - изменения CI/CD --- ## Создание новой статьи ```bash cd ~/projects/blog # Переключаемся на dev git checkout dev git pull origin dev # Создаём статью hugo new content posts/название-статьи/index.md # Локальный предпросмотр hugo server -D --bind 0.0.0.0 # Редактируем, сохраняем, проверяем в браузере # Коммитим git add . git commit -m "feat: новая статья про X" git push origin dev # → Автосборка → dev.blog.ru ``` --- ## Публикация в production ```bash cd ~/projects/blog # Убеждаемся что dev актуален git checkout dev git pull origin dev # Переключаемся на main и мержим git checkout main git pull origin main git merge dev --no-edit git push origin main # → Автосборка → blog.ru ``` --- ## Исправление опечатки ```bash cd ~/projects/blog # ВСЕ изменения через dev! git checkout dev git pull origin dev # Исправляем nano content/posts/статья/index.md # Коммитим git add . git commit -m "fix: опечатка в статье" git push origin dev # Проверяем на dev, если ОК - публикуем git checkout main git merge dev --no-edit git push origin main ``` --- ## Обновление темы (Git submodule) ```bash cd ~/projects/blog git checkout dev git pull origin dev # Обновляем тему git submodule update --remote themes/название-темы # Коммитим git add themes/название-темы git commit -m "chore: обновил тему" git push origin dev # Проверяем на dev, если ОК - публикуем git checkout main git merge dev --no-edit git push origin main ``` --- ## Откат изменений ### Когда откатывать vs когда делать fix **ОТКАТ → Эксперимент провалился:** - Функция не работает - Стили сломали дизайн - Тестировал - не зашло **НОВЫЙ КОММИТ → Исправление правильного:** - Опечатка в статье - Обновление информации - Улучшение формулировок --- ### Вариант 1: Git revert (безопасный) ```bash # Смотрим последние коммиты git log --oneline -5 # Создаём коммит который отменяет изменения git revert HEAD git push origin dev ``` **Плюсы:** История сохранена **Минусы:** Создаёт дополнительный коммит --- ### Вариант 2: Git reset (жёсткий откат) ```bash # Откатываемся на предыдущий коммит git log --oneline -5 git reset --hard HEAD~1 # Принудительно пушим git push origin dev --force ``` **Плюсы:** Чистая история **Минусы:** Опасно, нужен `--force` --- ### Откат несохранённых изменений ```bash # Откатить один файл git checkout -- путь/к/файлу # Откатить всё git reset --hard HEAD ``` --- ## Проверка статуса ```bash # На какой ветке? git branch # * dev ← текущая ветка # Что изменилось? git status # История коммитов git log --oneline -10 # Разница между dev и main git diff main..dev # График веток git log --oneline --graph --all -10 ``` --- ## Типичные ошибки и их решения ### Случайно начал работать на main ```bash # Отменяем все изменения (НЕ коммитили) git checkout -- . # Переключаемся на dev git checkout dev ``` --- ### Случайно сделал `git add` на main ```bash # Убираем из staging git reset # Переключаемся на dev git checkout dev # Добавляем правильно git add . git commit -m "feat: ..." git push origin dev ``` --- ### Случайно закоммитил в main ```bash # Откатываем коммит (изменения остаются) git reset --soft HEAD~1 # Переключаемся на dev git checkout dev # Коммитим правильно git add . git commit -m "feat: ..." git push origin dev ``` --- ### Случайно запушил в main ```bash # Откатываем на main git checkout main git reset --hard HEAD~1 git push origin main --force # Переключаемся на dev и делаем правильно git checkout dev git add . git commit -m "feat: ..." git push origin dev ``` --- ## Быстрые команды ```bash # Переключиться на dev и подтянуть изменения git checkout dev && git pull origin dev # Опубликовать dev в main git checkout main && git pull origin main && git merge dev --no-edit && git push origin main # Проверить доступность сайта curl -I https://blog.ru curl -I https://dev.blog.ru ``` --- ## Полезные алиасы для ~/.gitconfig ```ini [alias] st = status co = checkout br = branch ci = commit unstage = reset HEAD -- last = log -1 HEAD visual = log --oneline --graph --all -10 dev = checkout dev prod = checkout main ``` После этого можно: ```bash git dev # → git checkout dev git prod # → git checkout main git visual # → git log --oneline --graph --all -10 ``` --- ## Стандартный workflow ```bash # 1. Начало работы cd ~/projects/blog git checkout dev git pull origin dev # 2. Создаём/редактируем контент hugo new content posts/название/index.md hugo server -D --bind 0.0.0.0 # 3. Коммитим git add . git commit -m "feat: новая статья" git push origin dev # 4. Проверяем на dev окружении # 5. Публикуем в production git checkout main git pull origin main git merge dev --no-edit git push origin main ``` --- >[!IMPORTANT] **Важно:** `Dev` для экспериментов, `main` для проверенного контента. Всегда тестируй перед публикацией.