148 lines
6.6 KiB
Go
148 lines
6.6 KiB
Go
package devopsmodules
|
||
|
||
import (
|
||
"rubric/utils"
|
||
)
|
||
|
||
var GitModule = Module{
|
||
Key: "git",
|
||
Aliases: []string{"g", "vcs"},
|
||
Title: "Git — система контроля версий",
|
||
Description: "Основы, ветвление, merge/rebase, удалённые репозитории, рабочие процессы",
|
||
Run: showGit,
|
||
}
|
||
|
||
func showGit() {
|
||
utils.Header("DevOps — Git")
|
||
|
||
utils.Section("Основы и настройка")
|
||
utils.Code(`# Первоначальная настройка:
|
||
git config --global user.name "Alice Smith"
|
||
git config --global user.email "alice@example.com"
|
||
git config --global core.editor vim
|
||
git config --global init.defaultBranch main
|
||
git config --global pull.rebase false # merge при pull
|
||
git config --list`)
|
||
|
||
utils.Println(utils.ColorBold + "Создание репозитория:" + utils.ColorReset)
|
||
utils.Command("git init", "инициализировать в текущей папке")
|
||
utils.Command("git clone https://github.com/user/repo", "клонировать")
|
||
utils.Command("git clone --depth 1 https://github.com/user/repo", "только последний коммит")
|
||
utils.Command("git clone -b develop https://github.com/user/repo", "конкретная ветка")
|
||
|
||
utils.Section("Базовые операции")
|
||
utils.Code(`git status # состояние рабочей директории
|
||
git status -s # краткий формат
|
||
|
||
# Staging:
|
||
git add file.txt # конкретный файл
|
||
git add . # все изменения
|
||
git add -p # интерактивно по кускам
|
||
|
||
# Коммит:
|
||
git commit -m "feat: добавить авторизацию"
|
||
git commit -am "fix: исправить баг" # add + commit
|
||
git commit --amend # изменить последний коммит
|
||
|
||
# История:
|
||
git log --oneline --graph --all # граф всех веток
|
||
git log --since="2 weeks ago" --author="Alice"
|
||
git log -p file.txt # история файла с диффом`)
|
||
|
||
utils.Println(utils.ColorBold + "Diff и просмотр:" + utils.ColorReset)
|
||
utils.Command("git diff", "изменения не в staging")
|
||
utils.Command("git diff --staged", "изменения в staging")
|
||
utils.Command("git diff main..feature", "между ветками")
|
||
utils.Command("git show abc1234", "конкретный коммит")
|
||
utils.Command("git blame file.txt", "кто написал каждую строку")
|
||
|
||
utils.Section("Ветвление")
|
||
utils.Code(`git branch # список локальных веток
|
||
git branch -a # включая удалённые
|
||
git switch -c feature/login # создать и переключиться
|
||
git switch main # переключиться
|
||
git branch -d feature/login # удалить влитую ветку
|
||
git branch -D feature/login # принудительно
|
||
|
||
# Merge:
|
||
git merge --no-ff feature/login # всегда создавать merge commit
|
||
git merge --squash feature/login # слить все коммиты в один
|
||
git merge --abort # отменить при конфликте
|
||
|
||
# Rebase:
|
||
git rebase main # перенести коммиты поверх main
|
||
git rebase -i HEAD~3 # интерактивный (squash, reword, drop...)
|
||
git rebase --abort / --continue`)
|
||
|
||
utils.Note("Не делай rebase публичных веток, которые уже запушены.")
|
||
|
||
utils.Section("Удалённые репозитории")
|
||
utils.Command("git remote -v", "список удалённых")
|
||
utils.Command("git remote add origin https://github.com/user/repo", "добавить")
|
||
utils.Command("git fetch --all", "скачать изменения без слияния")
|
||
utils.Command("git pull --rebase", "fetch + rebase")
|
||
utils.Command("git push -u origin feature/login", "отправить и установить upstream")
|
||
utils.Command("git push --force-with-lease", "force push с проверкой (безопаснее --force)")
|
||
|
||
utils.Section("Откат изменений")
|
||
utils.Code(`git restore file.txt # вернуть файл как в HEAD
|
||
git restore --staged file.txt # убрать из staging
|
||
git revert HEAD # новый коммит-отмена
|
||
git reset HEAD~1 # убрать последний коммит, оставить изменения
|
||
git reset --hard HEAD~1 # убрать коммит И изменения (осторожно!)
|
||
|
||
# Stash — временное сохранение:
|
||
git stash push -m "wip: форма логина"
|
||
git stash list
|
||
git stash pop # восстановить последний
|
||
git stash branch feature/wip # создать ветку из stash`)
|
||
|
||
utils.Section("Теги и продвинутые команды")
|
||
utils.Code(`git tag -a v1.0.0 -m "Релиз" # аннотированный тег
|
||
git push origin --tags # отправить все теги
|
||
|
||
# Cherry-pick — перенести конкретный коммит:
|
||
git cherry-pick abc1234
|
||
|
||
# Bisect — бинарный поиск бага:
|
||
git bisect start
|
||
git bisect bad # текущая версия сломана
|
||
git bisect good v1.0.0 # эта работала
|
||
# git bisect good / bad до нахождения
|
||
git bisect reset`)
|
||
|
||
utils.Section("Рабочие процессы (Workflows)")
|
||
utils.Code(`Git Flow:
|
||
main — продакшн (только теги релизов)
|
||
develop — интеграционная ветка
|
||
feature/* — новые функции (от develop)
|
||
release/* — подготовка релиза
|
||
hotfix/* — срочные правки (от main)
|
||
|
||
GitHub Flow (проще):
|
||
main — всегда рабочий код
|
||
feature/* — ветка от main → Pull Request → merge
|
||
|
||
Trunk-Based Development (для CI/CD):
|
||
main — единая ветка, коммиты несколько раз в день
|
||
Короткоживущие ветки (< 1 дня), feature flags
|
||
|
||
Conventional Commits:
|
||
feat: — новая функциональность
|
||
fix: — исправление бага
|
||
docs: — документация
|
||
refactor: — рефакторинг
|
||
test: — тесты
|
||
chore: — сборка, зависимости`)
|
||
|
||
utils.Code(`# .gitignore — игнорируемые файлы:
|
||
*.log
|
||
node_modules/
|
||
.env
|
||
__pycache__/
|
||
build/
|
||
dist/
|
||
.DS_Store`)
|
||
|
||
utils.Footer()
|
||
}
|