oakazanin/content/cheatsheets/git-workflow/index.md

399 lines
8.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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