Git: как от «ой, я всё удалил» до «я — бог кода»

Использование Git в программировании: от основ к мастерству

SVN умер, да здравствует Git — инструмент, который превратил «ой, всё сломал» в «держу полную копию мира на ноутбуке и могу откатиться до каменного века одной командой». Свобода, гибкость, надёжность и куча мелких плюшек, чтобы тимлид не нервничал, а ты спал спокойно.

Git: как от «ой, я всё удалил» до «я — бог кода»

(гайд без занудства, с огнём, юмором и примерами, которые не выкинешь из головы)


Прежде чем ты скажешь «SVN? Это ещё что за динозавр?»

Представь: ты сидишь в офисе, где-то в подвале гудит сервер, и один-единственный глюк стирает всю историю коммитов. Тимлид орёт, продакт плачет, а ты думаешь: «Ну всё, писец, завтра в Макдак».
Именно так SVN (да, Subversion, тот самый централизованный динозавр) заканчивал карьеры в нулевых.
Git же зашёл в индустрию, как рок-звезда на сцену: «Ребята, держите полную копию истории каждому в кармане. Работайте в метро, в самолёте, в туалете на даче без сети. Потом синхнетесь — и всё будет огонь».
Параллельные реальности кода? Да, пожалуйста. Хочешь — мерж, хочешь — забей.


Настройка Git: настрой себя, пока git не настроил тебя

Начинающие часто клонируют репозиторий и сразу пишут код, игнорируя конфиг — а потом ловят неожиданные конфликты. Классика: PR разваливается из-за разных переносов строк между Windows и Linux.
Git стоит настроить до первого коммита, чтобы не тратить время на разборку мусора в истории.

  • Переносы строк (Windows → Linux):
    git config --global core.autocrlf input
    # теперь Windows не сломает переносы в репозитории
  • Ваша подпись:
    git config --global user.name "Иван 'Ctrl-Z' Разработчик"
    git config --global user.email "ivan@dev.com"
    # Git будет подписывать коммиты вашим именем и почтой
  • Сразу main вместо master:
    git config --global init.defaultBranch main
    # по умолчанию ветка будет называться main

Кажется, мелочь? Запомни: одна строчка сейчас = тысяча нервных клеток потом.


Команды, которые надо знать спросони (и не забыть до вечера)

Табличка «выжившего» в джунглях Git:

Команда Что делает Почему это круто
git clone Копирует репу себе За секунду воруешь чужой год работы
git add . Готовит всё к коммиту Чёткая грань «вот этот мусор — нет, код — да»
git commit -m "feat: добавил 🔥" Фиксирует снимок История твоих побед и провалов
git branch fix/память-утекла Новая ветка Параллельная вселенная без последствий
git checkout -b hotfix/пожар Переключиться и создать Как телепорт, но без дыма
git merge main Сливаем миры Иногда с фейерверком конфликтов
git rebase -i HEAD~3 Переписываем историю Как будто тебя никто не ловил на баге
git status / git log Компас и дневник Пока не потерялся в лесу коммитов

Ветки: у каждой задачи — свой мультивселенный

Представь: ты пишешь фичу в feature/космические-перделки, а коллега чинит баг в fix/краш-на-старте. Вы даже не шепчетесь — каждый в своём временном континууме.
Одна ветка = одна задача. Иначе получится свалка, где фича, рефакторинг и хотфикс спят в одной кровати.
Плюс веток? Создаётся за миллисекунду и весит 41 байт. То есть можно щёлкать, как семечки: хочу эксперимент — держи ветку, хочу откат — бах и снёс.


Удалённые репозитории: когда код становится командной игрой

Картинка: ты пушишь в origin/main, сервер говорит «Ой, там уже есть коммит». Ты материшься, но потом понимаешь: это не баг, это повод поговорить.
Танец трёх шагов:

git fetch # посмотреть, кто что натворил
git pull # подтянуть и мерджануть
git push origin feature/пилю-как-на-заводе

И да, если кто-то форс-пушнул в main, не молчи в чате — выясни, что происходит. Git только сигналит, голова решать — твоя.


Git Workflow: от «партизанского» до «корпоративного зверя»

Схема Для кого Как выглядит
GitHub Flow Стартапы и веб Ветка → PR → мердж → деплой
Git Flow Крупные проекты main, develop, release/2.3.0, hotfix/огонь-в-проде
Trunk-based Супер-CI/CD Всё в main, фичи за флагами

Pull Request — это не просто diff, а мини-спектакль: описание, скрины, чек-листы, автотесты.
Хороший PR:

«feat(api): GraphQL-запросы для юзеров
- добавил схему, покрыл тестами
Closes #42, проверяйте на staging»

Плохой PR:

«фиксы» (и 400 файлов). Ппц.


Конфликты: битва за строку

Git сигналит о конфликте:
<<<<<<< HEAD console.log("Привет"); ======= console.log("Hello"); >>>>>>> origin/main

Не паникуй. Открой конфликт в vimdiff, kdiff3 или в редакторе типа VS Code — выбери нужный вариант или объедини изменения.
Правило трёх «Н»:
1. Не паникуй.
2. Напиши тест после разрешения.
3. Напомни коллеге: если ты мержишь — он приносит пиво.


Git Hooks: автомат, который не даст тебе накосячить

Хочешь, чтобы коммит без линта не проходил? Вешаем pre-commit:

#!/bin/sh npm run lint || (echo "🔥 Линтер ругается, правь!" && exit 1) npm test || (echo "💥 Тесты упали, не пушь!" && exit 1)

Теперь каждый раз, как ты пытаешься «быстренько закоммитить», Git щупает твой код и может плюнуть тебе в лицо. В добром смысле.


Мелочи, которые спасают жизни

  • .gitignoreщит от мусора. Пропиши туда *.log, bin/, .env, чур меня!
  • git stashвременная нора. Переключился на прод-огонь, стащил изменения, вернулся — и всё на месте.
  • Git LFS — для тех, кто хранит 3D-модельки или видео. Иначе репа разрастётся, как мамонт в леднике.

Сообщения коммитов: фанфик для будущего себя

Сравни:

«fix» (15 минут спустя ты не вспомнишь, что именно)

и

feat(auth): добавил OAuth2-авторизацию через Google - редирект на /callback - обновил модель User - поднял coverage до 92% Closes #1337

Второе читается, как история приключений. Плюс можно автоматом генерить changelog и релиз-ноуты.
Conventional Commits — это не занудство, а костюм супергероя для твоей истории.


Git + CI/CD: код сам себя деплоит

Ты запушил в main, и через 3 минуты приложение уже греется на проде. Это не магия, это pipeline:

on: push: branches: [main] paths-ignore: ['docs/**'] jobs: build-and-deploy: - run: npm ci - run: npm run build - run: npm test - run: ./deploy.sh

Git стал триггером ракеты. А ты просто сидишь и пьёшь кофе.


Где Git катится дальше?

  • Partial clone — клонируй только нужные папки из монорепы, не тащи гигабайты.
  • Git maintenance — фоновый уборщик: чистит, сжимает, ускоряет.
  • Слухи: AI-мердж может появиться в будущем, который предугадывает конфликты раньше, чем ты их создашь.

Выходит, что

Git — это не просто add-commit-push. Это платформа для смелости:
- Хочешь эксперимент? Делай ветку.
- Сломал? Всегда можно git reflog и вернуться в прошлое.
- Хочешь изменить мир? Пушь в open-source и смотри, как миллионы качают твой код.

Так что бери терминал, улыбайся конфликтам и помни:

Великие проекты начинаются с маленького git init.

А дальше — только твоё воображение и пара терабайт SSD.