Работаете с Git первый раз? Все через это проходили! Разберём топ ошибок и способы их избежать.
1. Коммиты в main/master без веток
❌ Ошибка:
Всё делать прямо в main:
# Плохо
git add .
git commit -m "fix"
git push origin main
✅ Правильно:
Создавать ветки для каждой задачи:
# Хорошо
git checkout -b feature/add-login
# ... делаете изменения ...
git add .
git commit -m "feat: add user login form"
git push origin feature/add-login
# Потом делаете Pull Request
Почему важно:
- main должен быть стабильным
- Легче откатить изменения
- Можно работать над несколькими задачами параллельно
- Code review перед слиянием
2. Плохие commit messages
❌ Плохие примеры:
git commit -m "fix"
git commit -m "update"
git commit -m "asdfasdf"
git commit -m "commit"
git commit -m "done"
✅ Хорошие примеры:
git commit -m "fix: исправлена ошибка валидации email"
git commit -m "feat: добавлена кнопка экспорта в PDF"
git commit -m "docs: обновлена документация API"
git commit -m "refactor: оптимизирован запрос к базе данных"
Формула хорошего сообщения:
<тип>: <что сделано>
feat - новая функция
fix - исправление бага
docs - документация
refactor - рефакторинг
test - тесты
chore - рутинные задачи
3. Коммит всего подряд
❌ Ошибка:
git add .
git commit -m "changes"
В коммит попадает:
- .env с паролями 😱
- node_modules/ (миллионы файлов)
- .DS_Store (мусор macOS)
- __pycache__/ (скомпилированный Python)
- Личные заметки
✅ Правильно:
Сначала .gitignore:
# .gitignore
.env
*.pyc
__pycache__/
node_modules/
.DS_Store
*.log
.vscode/
.idea/
Проверяйте перед коммитом:
git status # что будет добавлено?
git diff # какие изменения?
git add file1.py file2.py # добавляйте выборочно
git commit -m "feat: добавлен модуль авторизации"
4. Отправка секретов в репозиторий
❌ ОПАСНО:
# settings.py
SECRET_KEY = "django-insecure-key-123456789"
DATABASE_PASSWORD = "mypassword123"
API_KEY = "sk_live_51234567890abcdef"
☠️ Всё это станет публичным если репозиторий Public!
✅ Правильно:
Используйте переменные окружения:
# settings.py
import os
SECRET_KEY = os.getenv('SECRET_KEY')
DATABASE_PASSWORD = os.getenv('DB_PASSWORD')
API_KEY = os.getenv('API_KEY')
Создайте .env (НЕ коммитьте!):
# .env
SECRET_KEY=django-insecure-key-123456789
DB_PASSWORD=mypassword123
API_KEY=sk_live_51234567890abcdef
Добавьте в .gitignore:
echo ".env" >> .gitignore
git add .gitignore
git commit -m "chore: добавлен .gitignore для .env"
Создайте .env.example для команды:
# .env.example
SECRET_KEY=your-secret-key-here
DB_PASSWORD=your-database-password
API_KEY=your-api-key
5. Работа без pull перед push
❌ Ошибка:
# Вы работаете локально...
git commit -m "fix: баг"
git push origin main
# ❌ Error: Updates were rejected
Коллега уже запушил изменения!
✅ Правильно:
# Сначала получите изменения
git pull origin main
# Если есть конфликты, разрешите их
# Потом пушьте
git push origin main
Ещё лучше — используйте rebase:
git pull --rebase origin main
git push origin main
6. Боязнь конфликтов (conflicts)
Что это:
git pull origin main
# <<< Auto-merging file.py
# <<< CONFLICT (content): Merge conflict in file.py
Не паникуйте! Конфликты — это нормально.
Как разрешить:
# file.py
<<<<<<< HEAD
def hello():
print("Привет") # Ваша версия
=======
def hello():
print("Hello") # Версия из origin
>>>>>>> origin/main
Шаги:
- Откройте файл
- Удалите маркеры
<<<<<<<,=======,>>>>>>> - Выберите нужный код (или объедините)
- Сохраните файл
# Финальный вариант
def hello():
print("Привет") # Оставили свою версию
- Закоммитьте:
git add file.py
git commit -m "fix: разрешён конфликт в file.py"
git push
7. Не использовать ветки
❌ Плохо:
Все работают в main → постоянные конфликты.
✅ Git Flow (упрощённая версия):
# Main ветки
main (или master) - стабильный код
develop - разработка
# Feature ветки
feature/login - новая функция
feature/payment - ещё функция
# Bugfix ветки
bugfix/fix-email - исправление бага
Workflow:
# Новая функция
git checkout main
git pull origin main
git checkout -b feature/user-profile
# ... работаете ...
git add .
git commit -m "feat: добавлен профиль пользователя"
git push origin feature/user-profile
# На GitHub создаёте Pull Request
# После approve:
git checkout main
git pull origin main # получаете обновлённый main с вашей фичей
git branch -d feature/user-profile # удаляете локальную ветку
8. Огромные коммиты
❌ Плохо:
# 3 дня работы, 500 файлов изменено
git add .
git commit -m "done"
Невозможно:
- Понять что изменилось
- Откатить конкретную часть
- Сделать code review
✅ Хорошо:
Делайте маленькие коммиты:
# День 1
git add auth/login.py
git commit -m "feat: добавлена форма логина"
git add auth/validators.py
git commit -m "feat: валидаторы для email и пароля"
# День 2
git add auth/views.py
git commit -m "feat: view для авторизации"
git add auth/urls.py
git commit -m "feat: роуты для auth"
Правило: 1 коммит = 1 логическое изменение.
9. Коммит сломанного кода
❌ Плохо:
# Код не работает, тесты падают
git add .
git commit -m "wip"
git push
Теперь у всех сломанный код!
✅ Правильно:
Перед коммитом:
# Запустите тесты
pytest
# Проверьте код
python manage.py check
# Убедитесь что работает
python manage.py runserver
Только потом:
git add .
git commit -m "feat: добавлена функция X"
git push
Если нужно сохранить незаконченное:
git stash # спрятать изменения
git stash list # посмотреть список
git stash pop # вернуть изменения
10. Не читать .gitignore
❌ Ошибка:
После git add . попадают:
- 📦
node_modules/(200 MB!) - 🗄️ База данных
db.sqlite3 - 🖼️ Загруженные файлы
media/ - 📝 Логи
debug.log
✅ Шаблон .gitignore для Python/Django:
# .gitignore
# Python
*.pyc
__pycache__/
*.py[cod]
*.so
*.egg
*.egg-info/
dist/
build/
# Django
*.log
db.sqlite3
media/
staticfiles/
# Environment
.env
.venv/
venv/
ENV/
# IDE
.vscode/
.idea/
*.swp
*.swo
# OS
.DS_Store
Thumbs.db
# Testing
.coverage
htmlcov/
.pytest_cache/
11. Не использовать git status
❌ Слепые команды:
git add .
git commit -m "update"
git push
✅ Проверяйте перед каждым действием:
git status # что изменилось?
# Увидите:
# Changes not staged:
# modified: file1.py
# deleted: old_file.py
# Untracked files:
# new_file.py
git diff file1.py # какие именно изменения?
git add file1.py new_file.py # добавляйте осознанно
git status # ещё раз проверьте
git commit -m "feat: обновлён file1, добавлен new_file"
12. Force push в общую ветку
❌ ОПАСНО:
git push --force origin main
☠️ Перезапишет историю у всех! Может потерять работу коллег.
✅ Правильно:
Force push только в свои ветки:
# Ваша личная feature ветка
git push --force origin feature/my-work
Для main/master используйте:
git push origin main # без --force!
Если нужен force, используйте безопасный:
git push --force-with-lease origin main
# Проверит что историяя не изменилась с последнего pull
13. Удаление веток без проверки
❌ Ошибка:
git branch -D feature/important
# Упс, там был незапушенный код! 😱
✅ Правильно:
Перед удалением проверьте:
# Запушены ли изменения?
git branch -vv # покажет связь с remote
# Смержена ли ветка?
git branch --merged # список смерженных веток
# Безопасное удаление (только если смержена)
git branch -d feature/task # -d откажется удалять несмёрженные
# Принудительное (используйте осторожно!)
git branch -D feature/task # -D удалит в любом случае
Общие советы
Используйте GUI если страшно
- GitHub Desktop - простой интерфейс
- GitKraken - мощный и красивый
- Sourcetree - бесплатный от Atlassian
- VS Code - встроенный Git
Учитесь отменять ошибки
# Отменить последний коммит (изменения останутся)
git reset --soft HEAD~1
# Отменить изменения в файле
git checkout -- file.py
# Вернуться к конкретному коммиту
git revert <commit-hash>
# Посмотреть историю
git log --oneline --graph --all
Делайте backup перед экспериментами
# Создайте ветку-копию
git checkout -b backup/before-experiment
# Экспериментируйте в другой ветке
git checkout -b experiment
# Если что-то сломалось, вернитесь
git checkout backup/before-experiment
Checklist перед каждым push
- [ ]
git status- проверил что добавляю - [ ]
git diff- просмотрел изменения - [ ] Тесты проходят
- [ ]
.envи секреты не в коммите - [ ] Commit message осмысленное
- [ ]
git pullпередgit push - [ ] Работаю в правильной ветке
Следуйте этим правилам и избежите 90% проблем с Git! 🎯
💬 Comments (0)
No comments yet
Be the first to share your opinion about this article!