Este guia vai ajudar você a entender o fluxo de trabalho profissional com Git para desenvolvimento e integração de features no projeto Django Task Manager.
Uma estratégia eficiente de branches permite desenvolvimento paralelo, isolamento de features e integração controlada. Vamos adotar a seguinte estrutura:
master (ou main) - Branch de produção, sempre estável
↑
dev - Branch de integração/desenvolvimento
↗ ↖ ↘
dev-feature1 dev-feature2 dev-feature3
- master/main: Código de produção estável
- dev: Integração de features, pré-produção
- dev-feature-name: Feature específica em desenvolvimento (ex: dev-bucket-test, dev-auth)
O Pull Request do aluno continha um problema comum com migrações Django. O arquivo 0003_include_bucket_schema.py tinha dois erros principais:
- Dependências vazias: A linha
dependencies = []não estabelecia conexão com migrações anteriores - Recriação de modelo existente: A migração tentava criar novamente o modelo Task que já existia, em vez de apenas modificá-lo
O erro table "tasks_task" already exists ocorreu porque a migração tentou criar uma tabela que já existia no banco de dados.
Para implementar corretamente o recurso de buckets, o aluno deveria:
-
Configurar dependências corretas:
dependencies = [ ('tasks', '0002_alter_task_options_and_more'), ]
-
Criar apenas o novo modelo e modificar o existente: Em vez de recriar o modelo Task inteiro, o aluno deveria ter usado operações específicas para:
- Criar o modelo Bucket (usando
CreateModel) - Adicionar o campo bucket ao modelo Task existente (usando
AddField)
- Criar o modelo Bucket (usando
-
Usar ferramentas do Django: Uma abordagem melhor seria deixar o Django gerar as migrações automaticamente:
# Após adicionar o modelo Bucket e o campo bucket no models.py python manage.py makemigrations
Para evitar problemas semelhantes, ensine seus alunos a:
- Sempre deixar o Django gerar migrações automaticamente quando possível
- Nunca editar manualmente os arquivos de migração, a menos que seja absolutamente necessário
- Se precisar editar migrações, entender o sistema de dependências do Django
- Testar alterações em um ambiente de desenvolvimento antes de submeter um PR
Quando um aluno submete um PR, siga esses passos para testá-lo de forma segura:
# Verifique em qual branch você está
git status
# Crie uma nova branch de desenvolvimento para teste
git checkout -b dev-feature-test
# Puxe as alterações do PR para sua branch de teste (substitua 1 pelo número do PR)
git pull origin pull/1/headApós baixar as alterações, verifique se tudo funciona:
# Aplicar migrações
python manage.py migrate
# Iniciar o servidor
python manage.py runserverTeste todas as funcionalidades manualmente no navegador.
Quando ocorrer o erro table "tasks_task" already exists ou Conflicting migrations detected, siga estes passos:
Quando ocorrer o erro table "tasks_task" already exists ou Conflicting migrations detected, siga estes passos:
Primeiro, verifique os arquivos de migração para entender o conflito:
# Liste as migrações existentes
ls tasks/migrations/# Faça backup da migração problemática
mv tasks/migrations/0003_include_bucket_schema.py tasks/migrations/0003_include_bucket_schema.py.bak
# Crie uma nova migração vazia
python manage.py makemigrations tasks --empty --name create_bucket_modelEdite o arquivo de migração criado (normalmente 0003_create_bucket_model.py) e substitua seu conteúdo pelo código correto que adiciona apenas os novos campos/modelos.
python manage.py migrateAqui está o fluxo de trabalho completo para desenvolvimento com branches no Git:
# Clone o repositório
git clone git@github.com:username/django-task-manager.git
cd django-task-manager
# Crie e mude para um branch de desenvolvimento
git checkout -b dev
git push -u origin dev # Crie o branch no GitHub tambémPara cada nova feature, crie um branch dedicado a partir do dev:
# Criar branch para uma nova feature
git checkout dev
git checkout -b dev-feature-name
# Trabalhe e faça commits frequentes
git add .
git commit -m "Mensagem descritiva sobre a mudança"
# Sincronize com o GitHub regularmente
git push -u origin dev-feature-nameQuando a feature estiver pronta:
- Vá para o GitHub e crie um Pull Request do seu branch
dev-feature-namepara o branchdev - Peça a um colega para revisar seu código
- Faça os ajustes necessários baseados no feedback
Se você receber um PR para revisar, siga estes passos:
# Crie um branch de teste local para o PR
git checkout dev
git checkout -b test-feature-name
# Puxe as alterações do PR
git pull origin pull/1/head # Substitua 1 pelo número do PR
# Teste a feature
python manage.py migrate
python manage.py runserverVamos ver um exemplo real de como lidar com a correção do feature de buckets:
# Estando no branch dev-bucket-test com as alterações do PR
git status # Verificar arquivos modificados
# Commit das correções de migração
git add tasks/migrations/0003_create_bucket_model.py
git rm tasks/migrations/0003_include_bucket_schema.py
git commit -m "Fix: Corrigido problema de migração do bucket"
# Sincronizar com o GitHub
git push -u origin dev-bucket-test # Se o branch ainda não existir no remoto
# OU
git push # Se o branch já existir no remotoApós testar e verificar que a feature está funcionando corretamente:
# Voltar para o branch de desenvolvimento
git checkout dev
# Integrar a feature corrigida
git merge dev-bucket-test
# Resolver conflitos se necessário
# [edite os arquivos em conflito]
# git add .
# git commit
# Enviar para o GitHub
git push origin devQuando tiver várias features prontas (por exemplo, buckets e autenticação):
# Já estando no branch dev com a primeira feature (buckets) integrada
# Integrar a segunda feature (autenticação)
git merge dev-auth
# Resolver conflitos se necessário
# Testar a aplicação completa
# Enviar para o GitHub
git push origin devQuando todas as features estiverem estáveis no branch dev:
# Mudar para o branch principal
git checkout master # ou main
# Integrar as mudanças do branch de desenvolvimento
git merge dev
# Enviar para o GitHub
git push origin master-
Commits Atômicos: Faça commits pequenos e específicos, com mensagens descritivas
git commit -m "Add: Implementação do modelo Bucket para categorizar tarefas" -
Prefixos para Commits:
Add:Nova funcionalidadeFix:Correção de bugRefactor:Melhorias de código sem alterar comportamentoDocs:Alterações em documentaçãoStyle:Formatação, não afeta o códigoTest:Adição ou correção de testes
-
Pull Requests Detalhados: Inclua descrições completas:
- O que a mudança faz
- Por que ela é necessária
- Como testá-la
- Screenshots (se aplicável)
-
Code Reviews: Sempre faça revisão de código antes de mesclar
-
Mantenha Branches Atualizados:
git checkout dev-feature-name git pull origin dev # Obtenha as mudanças mais recentes do branch de desenvolvimento git rebase dev # Reaplique seus commits sobre as mudanças do dev
Este fluxo de trabalho é ideal para:
Explique para os alunos os seguintes pontos importantes:
- Isolamento de Trabalho: Cada feature deve ser desenvolvida em seu próprio branch
- Experimentação Segura: Branches permitem experimentar sem afetar o código estável
- Revisão de Código: Pull Requests facilitam revisão antes da integração
- Histórico Organizado: Mantém o histórico de desenvolvimento claro e compreensível
- Nunca recrie modelos existentes: Use
AlterFieldouAddFieldpara modificar modelos existentes - Dependências corretas: Sempre garanta que as migrações dependem da migração anterior correta
- Teste as migrações: Sempre teste migrações em ambiente de desenvolvimento primeiro
- Use
--emptyquando necessário: Para situações complexas, migrações manuais são mais controláveis - Deixe o Django gerar migrações automaticamente: Em vez de criar manualmente, use
python manage.py makemigrations
Se você é o aluno que enviou o PR com problemas de migração, aqui está como corrigir:
# 1. Volte seu branch para antes da migração problemática
git checkout feature/task_bucket
git reset --hard HEAD~1 # Volta um commit atrás (cuidado!)
# 2. Ajuste seus modelos corretamente em models.py
# (Adicione o modelo Bucket e o campo bucket ao Task)
# 3. Deixe o Django gerar a migração correta
python manage.py makemigrations
# 4. Verifique se a migração gerada está correta
cat tasks/migrations/0003_*.py
# 5. Teste a migração
python manage.py migrate
# 6. Faça commit e push das alterações
git add .
git commit -m "Fix: Correção da migração para o modelo Bucket"
git push origin feature/task_bucket --force # Cuidado com --force!Observação: O uso de
git reset --hardegit push --forcesão perigosos e devem ser usados com cautela, pois reescrevem o histórico. Em projetos de equipe, coordene com os colegas antes de usar.
Se você tem o GitHub CLI instalado, pode testar PRs mais facilmente:
# Autenticar no GitHub (apenas na primeira vez)
gh auth login
# Verificar PRs abertos
gh pr list
# Fazer checkout do PR para teste
gh pr checkout 1 # Substitua 1 pelo número do PR
# Após testar, mesclar diretamente
gh pr merge 1 # Várias opções de merge serão oferecidas