rubric/modules/devopsmodules/devops_git.go
2026-07-21 14:52:55 +03:00

148 lines
6.6 KiB
Go
Executable file
Raw 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.

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()
}