📝 Python

Типичные ошибки новичков в Git: Как избежать 🚨

0
Author
04e5cc8b-58ac-4bdc-bdee-661bbb
📅
Published
06.05.2026
⏱️
Reading time
6 min
👁️
Views
27
🌱
Level
Beginner

Работаете с 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

Шаги:

  1. Откройте файл
  2. Удалите маркеры <<<<<<<, =======, >>>>>>>
  3. Выберите нужный код (или объедините)
  4. Сохраните файл
# Финальный вариант
def hello():
    print("Привет")  # Оставили свою версию
  1. Закоммитьте:
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! 🎯

Your reaction to the article

💬 Comments (0)

🔐 Sign in to leave a comment
🚪 Login
💭

No comments yet

Be the first to share your opinion about this article!

🔗 Similar

Similar articles

Continue learning with these materials

📝

Модуль datetime: работа с датами и временем

datetime — стандартный модуль Python для работы с датами и временем. Входит в стандартную библиотеку,...

📅 08.05.2026 👁️ 30
📝

.env файлы и переменные окружения: секреты вне ко…

Представь что ты написал программу с API-ключом прямо в коде и залил её на GitHub....

📅 08.05.2026 👁️ 35
📝

Виртуальные окружения в Python: зачем и как

Когда начинаешь второй Python-проект и ставишь pip install requests — эта библиотека устанавливается глобально, для...

📅 08.05.2026 👁️ 31

Did you like the article?

Subscribe to our updates and receive new articles first. Grow with PyLand!