feat: новый раздел Шпаргалки. новая статья Git Workflow для Hugo блога
This commit is contained in:
@@ -0,0 +1,398 @@
|
||||
---
|
||||
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)
|
||||
```
|
||||
|
||||
**Принцип:** Одна папка, две ветки. Переключение через `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
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Помни:** Dev для экспериментов, main для проверенного контента. Всегда тестируй перед публикацией.
|
||||
Reference in New Issue
Block a user