399 lines
8.9 KiB
Markdown
399 lines
8.9 KiB
Markdown
---
|
||
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` для проверенного контента. Всегда тестируй перед публикацией.
|