# Git без программирования

← [Раздел](README.md) · [Главная](../README.md)

## Цель

Научиться **базовым операциям Git**: clone, status, commit, push, branch, merge request — enough для работы с pipeline, secret scanning и code review.

## Предварительно

- [Что такое программа и код](chto-takoe-programma-i-kod.md)

## Время

**4–6 часов** (с практикой на учебном repo)

---

## Зачем Git в DevSecOps

| Задача | Связь с Git |
|--------|-------------|
| CI/CD | Pipeline запускается на **push** / **MR** |
| Secret scan | Сканируется **вся история** commits |
| SAST | Анализ **ветки** в merge request |
| Audit | Кто, когда, что изменил — `git log` |
| IaC | Terraform в том же repo |

**Git** — **единый источник правды** для кода и часто для конфигурации (GitOps).

---

## Ключевые понятия

| Термин | Аналогия |
|--------|----------|
| **Repository** | Папка проекта + машина времени |
| **Commit** | Сохранение с подписью «что и зачем» |
| **Branch** | Черновик параллельно основной версии |
| **Merge** | Влить черновик в основную линию |
| **Remote** | Копия на GitHub/GitLab |
| **Clone** | Скачать repo к себе |
| **Push / Pull** | Отправить / получить изменения |

**main** (или **master**) — основная ветка, из которой обычно деплоят.

---

## Минимальный workflow

```bash
# 1. Склонировать (один раз)
git clone https://github.com/example/training-repo.git
cd training-repo

# 2. Проверить состояние
git status

# 3. Новая ветка для задачи
git checkout -b docs/add-security-note

# 4. Изменить файл, добавить в commit
git add README.md
git commit -m "docs: add security contact"

# 5. Отправить на сервер
git push -u origin docs/add-security-note
```

Далее в веб-UI: **Create Merge Request / Pull Request** → review → merge.

---

## Commit message — не мелочь

Хороший формат (Conventional Commits):

```
feat: add login endpoint
fix: patch SQL injection in search
docs: update runbook for incident IR-101
chore: bump dependency lodash to 4.17.21
```

Для audit и changelog это **важно**. SecOps часто ищет commit, в котором **случайно закоммитили секрет**.

---

## Merge Request (MR) / Pull Request (PR)

```
feature-branch ──MR──► main ──► CI pipeline ──► deploy
```

**Что проверяет DevSecOps в MR:**

- [ ] Pipeline green (tests, linters, scans)
- [ ] Нет `.env`, ключей, `id_rsa`
- [ ] Dockerfile: non-root, minimal base image
- [ ] Новые dependencies — SCA прошёл

---

## Опасность: секреты в истории Git

Если вы **один раз** запушили `API_KEY=sk-live-xxxxx`:

- Удаление файла **новым commit** не стирает историю.
- Нужны: **rotation ключа** + `git filter-repo` / BFG + иногда новый repo.

**Профилактика:** pre-commit hooks, secret scanners (Gitleaks, TruffleHog), `.gitignore` для `.env`.

---

## Полезные команды (шпаргалка)

| Команда | Действие |
|---------|----------|
| `git log --oneline -10` | Последние 10 commits |
| `git diff` | Несохранённые изменения |
| `git branch -a` | Список веток |
| `git pull` | Обновиться с remote |
| `git stash` | Временно спрятать изменения |

---

## Git vs GitHub vs GitLab

| | Git | GitHub / GitLab |
|---|-----|-----------------|
| Что это | Программа локально | Сервис hosting + UI + CI |
| Аналогия | Word | Google Docs |

Pipeline часто живёт в **`.gitlab-ci.yml`** или **`.github/workflows/`** в том же repo.

---

## Практическое задание

1. Fork или clone публичного учебного репозитория.
2. Создайте ветку, измените одну строку в README.
3. Commit + push + откройте PR/MR.
4. Посмотрите, запустился ли CI (если настроен).

---

## Самопроверка

1. Чем branch отличается от commit?
2. Почему удалённый `.env` из repo не удаляет секрет из истории?
3. Что такое merge request и когда pipeline обычно запускается?
4. Как посмотреть, кто последний менял файл? (подсказка: `git log -- path`)

---

## Дальше

→ [HTTP, API, JSON](http-api-json-prostymi-slovami.md)
