---
title: "Git Workflow для Hugo блога"
date: 2026-02-23
draft: false
description: "Универсальная шпаргалка по работе с Hugo блогом через Git с двумя окружениями. Префиксы коммитов, откаты, типичные ошибки и решения."
tags: ["git", "workflow", "hugo", "cheatsheet"]
categories: ["Шпаргалки"]
---

## Структура проекта

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