GitHub — это мощный инструмент для контроля версий, но часто разработчики с первых дней усложняют себе жизнь лишними ветками, merge-конфликтами и сложными workflow. В статье разберём, как работать эффективно: только main, минимум команд, максимум результата.
Вы только что написали классный код.
Теперь нужно:
1) git add .
2) git commit -m "fix"
3) git push
4) Вернуться к работе.
Всё. Никаких rebase, squash, cherry-pick — только быстро и по делу.
🧠 Теория: почему main?
Главный принцип:
«Если код готов — он в
main. Если не готов — его нет в репозитории.»
Это упрощает:
- Историю коммитов — не нужно разбираться в ветках
feature/login-validation-v2-final. - Деплой — всегда актуальная версия в одной ветке.
- Коллаборацию — меньше конфликтов при слиянии.
Когда это работает?
- На старте pet проекта, где вы один разработчик
- При частых маленьких коммитах
- В целом, не критично, если упадет прод или уже есть CI/CD, тесты перед деплоем.
🔧 Практика: базовые команды
1. Добавляем изменения
git add . # или конкретные файлы: git add app/models/user.rb
2. Коммитим
git commit -m "Добавил валидацию email в User"
Совет:
Пишите сообщения так, будто объясняете коллеге зачем, а не что изменили.
❌ Плохо: fix bug
✅ Хорошо: Исправил N+1 запрос в списке пользователей
3. Пушим
git push origin main
4. А как же git pull origin main?
Вам не надо обновлять локальную версию, если: вы один разработчик и пушите только с одного компьютера.
Вот улучшенная версия раздела, с более точной терминологией, примерами и чуть более дружелюбной формулировкой:
💡 Антипаттерны
1. «Я потом разберусь с конфликтами»
Проблема:
Ты вносишь изменения, а потом делаешь git push --force, потому что «локально всё работает».
# Так делать не надо:
git push --force # 💥 Перезапишешь историю всем — коллеги будут в восторге
❌ Это затирает чужие коммиты, если кто-то уже запушил в main. Даже если проект только твой, можно случайно потерять историю.
✅ Правильный путь
Если твоя ветка отстаёт от удалённого main, подтяни изменения:
git fetch origin
git merge origin/main
# или, если любишь линейную историю:
git rebase origin/main
Если уже пришлось форсить, используй --force-with-lease — это безопаснее:
git push --force-with-lease
Он не перезапишет чужие коммиты, если они появились после твоего последнего fetch.
📌 Вывод:
Не форси main просто так. Даже на pet-проектах — хорошая привычка с самого начала.
2. Мега-коммиты
git commit -m "Всё сразу: и фронт, и бэк, и фиксы"
Проблема:
Такой коммит невозможно откатить частично.
3. Ветки «на всякий случай»
git checkout -b experimental-refactoring-2024
Итог:
Через месяц никто не вспомнит, зачем эта ветка, и можно ли её удалить.
🧪 Обязательно .gitignore: защита от утечек и мусора
.gitignore — это не просто список исключений, а первая линия обороны твоего проекта от:
- утечек конфиденциальной информации (ключи, пароли, токены)
- мусора (
tmp/,log/,node_modules/) - лишних конфликтов в командной работе (автогенерируемые файлы)
📄 Пример .gitignore для pet-проекта:
# Конфигурации и секреты
.env
config/database.yml
config/master.key
# Временные файлы
/tmp
/log
/storage
.byebug_history
# Сборка фронтенда
/node_modules
/public/packs
/public/assets
# Системные файлы
.DS_Store
.idea
.vscode
💡 Если используешь Docker, добавь
*.local.yml,docker-compose.override.ymlиsecrets/.
❗ А если уже добавил что-то чувствительное?
🧷 Сценарий А: сделал commit, но ещё не делал push
-
Убери файл из индекса:
git rm --cached config/database.yml -
Добавь в
.gitignore:echo "config/database.yml" >> .gitignore -
Сделай новый коммит:
git commit -m "remove config from repo"
🎉 Готово — файл остался у тебя локально, но больше не трекается.
☠️ Сценарий B: уже сделал push в репозиторий
-
Удали файл и добавь в
.gitignore:git rm --cached .env echo ".env" >> .gitignore git commit -m "remove leaked file" git push -
Если файл содержит секреты (ключи, пароли):
- немедленно удали или отозви скомпрометированные ключи
- пересоздай
.envилиmaster.key
-
(по желанию) Перепиши историю и удаление из Git-истории:
# ⚠ Используй только если понимаешь последствия git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch .env" \ --prune-empty --tag-name-filter cat -- --all git push --force
🛑 GitHub всё равно может кэшировать коммиты — удаление файла из истории не гарантирует безопасность. Лучше отозвать ключи и заменить.
✅ Вывод
- Создай
.gitignoreперед первым коммитом - Никогда не храни ключи и пароли в репозитории
- Даже в pet-проектах — привычка игнорировать чувствительные файлы защитит тебя в будущем
🔥 Экстренные случаи
Отмена последнего коммита (ещё не запушили):
git reset --soft HEAD~1
Вернуть удалённый файл:
git checkout -- app/controllers/users_controller.rb
🧾 Вывод
GitHub — это инструмент, а не ритуал.
- Коммитите часто.
- Пушите аккуратно.
- Не создавайте ветки без явной необходимости. На старте это не так важно, чем хороший .gitignore.
Ваш идеальный день:
1) Написал код → 2) Закомитил → 3) Запушил → 4) Пошёл пить кофе. ☕