Цикл работы
Здесь вы создадите свой первый репозиторий с SQL-запросом. Всё делаем локально, интернет не нужен.
Работа с Git — это повторение одного цикла:
изменить файл → git add → git commit → (повторить)Три области, через которые проходит файл:
| Область | Что это |
|---|---|
| Рабочая папка | Файлы, которые вы правите |
| Индекс (staging) | Изменения, которые вы выбрали для следующего коммита (git add) |
| История | Сохранённые коммиты (git commit) |
Индекс нужен, чтобы вы сами решали, что попадёт в коммит. Правки в разных файлах можно разложить по разным коммитам.
Создайте репозиторий
Заголовок раздела «Создайте репозиторий»mkdir sql-reportscd sql-reportsgit initgit init создаёт скрытую папку .git. Теперь папка — репозиторий.
Создайте первый запрос:
mkdir modelscat > models/revenue.sql <<'SQL'select order_id, amountfrom ordersSQLstatus — что изменилось
Заголовок раздела «status — что изменилось»git statusGit покажет models/ в разделе Untracked files. Он видит файл, но не следит за ним.
add и commit — сохранить версию
Заголовок раздела «add и commit — сохранить версию»git add models/revenue.sqlgit commit -m "Add revenue model"git addкладёт файл в индекс.git commit -mсохраняет снимок в историю. Сообщение в кавычках — это что вы сделали.
Пишите сообщения коротко и понятно: Filter completed orders, Fix refund join. Не пишите fix, update, asdf. Через месяц вы не поймёте, что это было.
diff — что именно изменилось
Заголовок раздела «diff — что именно изменилось»Поправьте запрос: нужны только завершённые заказы.
cat > models/revenue.sql <<'SQL'select order_id, amountfrom orderswhere status = 'completed'SQLgit diffСтроки с + добавлены. Строки с - удалены. Так же выглядит изменение на GitHub и GitLab, только в цвете:

Вверху — сообщение коммита, автор и hash. Ниже — diff каждого файла.
Сохраните:
git add models/revenue.sqlgit commit -m "Filter completed orders"Короткая запись для уже отслеживаемых файлов: git commit -am "сообщение". Новые файлы она не берёт.
log — история
Заголовок раздела «log — история»git log --oneline9d1f502 Filter completed orders9a73738 Add revenue modelЭто и есть замена revenue_v2.sql и revenue_v2_final.sql. Файл один. Версий две, и у каждой есть имя.
Посмотреть старую версию файла:
git show HEAD~1:models/revenue.sqlHEAD — последний коммит. HEAD~1 — на один коммит раньше.
| Ситуация | Команда |
|---|---|
| Испортил файл, ещё не сделал commit. Хочу вернуть как в последнем коммите | git restore models/revenue.sql |
| Убрать файл из индекса, но оставить правки | git restore --staged models/revenue.sql |
| Коммит уже сделан и отправлен коллегам. Хочу отменить его | git revert <hash> |
git revert не стирает историю. Он создаёт новый коммит, который отменяет старый. Это безопасный способ.
.gitignore — что не хранить
Заголовок раздела «.gitignore — что не хранить»Создайте файл .gitignore в корне репозитория:
.env*.duckdb__pycache__/.DS_StoreТеперь Git не будет предлагать эти файлы в git status. Сам .gitignore коммитят, чтобы он был у всей команды.
git add .gitignoregit commit -m "Add .gitignore"Шпаргалка
Заголовок раздела «Шпаргалка»| Команда | Что делает |
|---|---|
git init | Создаёт репозиторий |
git status | Показывает, что изменилось |
git diff | Показывает изменения построчно |
git add <файл> | Выбирает изменения для коммита |
git commit -m "..." | Сохраняет версию |
git log --oneline | Показывает историю |
git restore <файл> | Отменяет правки в файле |
git revert <hash> | Отменяет коммит новым коммитом |
Практика
Заголовок раздела «Практика»Задание 1
Заголовок раздела «Задание 1»Создайте репозиторий sql-reports и сделайте два коммита: Add revenue model и Filter completed orders.
Проверка: git log --oneline показывает два коммита.
Решение
Команды из урока выше: git init, создать models/revenue.sql, git add, git commit, правка, снова git add и git commit.
Задание 2
Заголовок раздела «Задание 2»Добавьте второй запрос models/refunds.sql. Сделайте для него отдельный коммит.
select order_id, amountfrom refundsПроверка: в git log --oneline три коммита. Последний про refunds.
Решение
cat > models/refunds.sql <<'SQL'select order_id, amountfrom refundsSQLgit add models/refunds.sqlgit commit -m "Add refunds model"Задание 3
Заголовок раздела «Задание 3»Испортите models/revenue.sql: удалите всё содержимое файла. Не делайте commit. Верните файл.
Проверка: git status пишет nothing to commit, working tree clean.
Решение
: > models/revenue.sqlgit statusgit restore models/revenue.sqlgit statusЗадание 4
Заголовок раздела «Задание 4»Оказалось, что запрос refunds не нужен. Отмените коммит Add refunds model безопасным способом, без потери истории.
Проверка: в git log --oneline появился коммит Revert "Add refunds model". Файла models/refunds.sql больше нет.
Решение
git log --oneline # найдите hash нужного коммитаgit revert <hash>Откроется редактор с сообщением. Сохраните и закройте. Для vim: :wq. Чтобы не открывать редактор: git revert --no-edit <hash>.
Задание 5
Заголовок раздела «Задание 5»Создайте файл .env с текстом API_KEY=secret. Сделайте так, чтобы Git его не видел.
Проверка: git status не показывает .env.
Решение
echo "API_KEY=secret" > .envecho ".env" >> .gitignoregit status