Git: Guia de melhores práticas do Git e colaboração em equipe
Boas práticas com o Git podem melhorar significativamente a colaboração em equipe e a qualidade do código. Esta seção resume as melhores práticas do Git, incluindo diretrizes para commits, estratégias de ramificação, fluxos de trabalho e colaboração em equipe.
1. Diretrizes para envio de trabalhos
(1) Por que as informações padronizadas sobre commits são necessárias?
Informações de envio devidamente formatadas podem:
- Descreva claramente as alterações: Entenda rapidamente o que está incluído em cada commit
- Suporte a ferramentas de automação: Gerar automaticamente registros de alterações
- Histórico fácil de rastrear: consulte os registros de desenvolvimento de recursos específicos
- Aumentar a eficiência da colaboração: Reduzir os custos de comunicação
(2) Padrão de commits convencionais
Esta é a convenção de mensagens de commit mais popular atualmente:
<type>(<scope>): <subject>
<body>
<footer>
Explicação de cada seção:
- tipo (obrigatório): Tipo de envio
- escopo (opcional): Escopo do impacto
- assunto (obrigatório): Breve descrição (até 50 caracteres)
- corpo (opcional): Descrição detalhada
- rodapé (opcional): Informações do rodapé (por exemplo, “Fechar problema”)
(3) Explicação detalhada dos tipos de envio
| Tipo | Descrição | Exemplo |
|---|---|---|
| feat | Novo recurso | feat: Adicionada a funcionalidade de login do usuário |
| correção | Correção de bug | correção: Corrigido o erro de autenticação no login |
| docs | Atualizações da documentação | docs: Atualização da documentação da API |
| estilo | Formatação de código | estilo: Ajustar a indentação do código |
| refactor | Refatoração | refactor: Otimizar a lógica da consulta |
| perf | Otimização de desempenho | perf: Otimização de consultas ao banco de dados |
| teste | Teste | teste: Adicionar teste de unidade |
| tarefa | Compilação/Ferramentas | tarefa: Atualizar a configuração de compilação |
| ci | Configuração do CI | ci: Adicionar GitHub Actions |
| revert | Reverter | revert: Reverter o recurso de login |
▶ Exemplo: Mensagem de commit adequada
# Single-line commit
git commit -m "feat: Add User Login Functionality"
# Range-Based Submissions
git commit -m "feat(auth): AddJWTCertification Support"
# Multi-line commit
git commit -m "feat(auth): AddOAuth2.0Login Support" -m "- SupportGoogle、GitHubLog In" -m "- Add Login State Persistence" -m "Closes #123"
# Use the editor to write a detailed commit message
git commit
(4) Melhores práticas para o envio de informações
Boas mensagens de commit:
feat(auth): AddOAuth2.0Login Support
- SupportGoogle、GitHub、WeChat Third-Party Login
- Add Login State Persistence
- Enable Auto-RefreshTokenMechanism
Closes #456
Mensagens de commit inadequadas:
update
fix bug
I made a few changes.
WIP
asdfasdf
Melhores práticas:
- ✅ Use uma frase no imperativo (Adicione em vez de Adicionou)
- ✅ Coloque a primeira letra em minúscula
- ✅ Não coloque um ponto final
- ✅ Descreva o tema em até 50 caracteres
- ✅ A seção “Corpo” explica o “O quê” e o “Por quê”, e não o “Como”
2. Estratégia de ramificação
(1) O modelo Git Flow
O Git Flow é a estratégia de ramificação mais clássica:
graph TB
main[main<br/>Production Environment] --> release[release/*<br/>Preparing for Release]
release --> develop[develop<br/>Development Environment]
develop --> feature[feature/*<br/>Feature Development]
main --> hotfix[hotfix/*<br/>Emergency Fix]
style main fill:#d4edda
style develop fill:#fff3cd
style feature fill:#e1f5ff
style hotfix fill:#f8d7da
Tipo de agência:
- principal: Código do ambiente de produção; mantido sempre em um estado pronto para implantação
- desenvolver: Desenvolver código no ambiente de desenvolvimento e integrar diversos ramos de funcionalidades
- feature: Ramo de desenvolvimento de funcionalidades, criado a partir do ramo “develop”
- versão: Um branch pronto para lançamento criado a partir de
develop - hotfix: Ramo de correção de emergência, criado a partir do ramo principal
▶ Exemplo: Fluxo de trabalho do Git Flow
# 1. Create a feature branch from develop
git checkout develop
git checkout -b feature/user-auth
# 2. Develop and Submit
git add .
git commit -m "feat(auth): Add User Authentication"
# 3. Merge back intodevelop
git checkout develop
git merge --no-ff feature/user-auth
git branch -d feature/user-auth
# 4. Create a release branch
git checkout -b release/v1.0.0
# 5. Preparing for Release(FixBug、Update version numbers, etc.)
git commit -m "chore: Update the version number to1.0.0"
# 6. Merge into main and develop
git checkout main
git merge --no-ff release/v1.0.0
git tag -a v1.0.0 -m "Version 1.0.0"
git checkout develop
git merge --no-ff release/v1.0.0
git branch -d release/v1.0.0
# 7. Emergency Fix
git checkout main
git checkout -b hotfix/critical-bug
git commit -m "fix: Urgent FixBug"
git checkout main
git merge --no-ff hotfix/critical-bug
git tag -a v1.0.1 -m "Version 1.0.1"
git checkout develop
git merge --no-ff hotfix/critical-bug
git branch -d hotfix/critical-bug
(2) O modelo GitHub Flow
O GitHub Flow é mais simples e mais adequado para a implantação contínua:
graph LR
A[main<br/>Always deployable] --> B[featureBranch]
B --> C[Pull Request]
C --> D[Merge intomain]
D --> E[Automatic Deployment]
style A fill:#d4edda
style E fill:#c3e6cb
Características:
- O branch principal está sempre pronto para implantação
- Criar um branch de funcionalidade a partir de
main - Crie uma solicitação de pull assim que o desenvolvimento estiver concluído
- Incorporar ao branch principal após revisão
- Implantação automática após a fusão
▶ Exemplo: Fluxo de trabalho do GitHub Flow
# 1. Update Locallymain
git checkout main
git pull origin main
# 2. Create a feature branch
git checkout -b feature/new-feature
# 3. Develop and Submit
git add .
git commit -m "feat: Add a New Feature"
# 4. Push Branch
git push -u origin feature/new-feature
# 5. Create a Pull Request on GitHub
# 6. Merge after the code review is approved
# 7. Clean Up Branches
git checkout main
git pull origin main
git branch -d feature/new-feature
git push origin --delete feature/new-feature
(3) Convenções de nomenclatura de ramificações
| Tipo de ramificação | Convenção de nomenclatura | Exemplo |
|---|---|---|
| Recurso | recurso/* | recurso/autenticação-de-usuário |
| Correção de bug | fix/* | fix/login-validation |
| Correção de emergência | hotfix/* | hotfix/vulnerabilidade-de-segurança |
| Lançamento | release/* | release/v1.0.0 |
| Experimento | experiment/* | experiment/nova-arquitetura |
3. Fluxo de trabalho
(1) Fluxo de trabalho diário de desenvolvimento
sequenceDiagram
participant Developer
participant Local Warehouse
participant Remote Repository
participant CI/CD
Developer->>Local Warehouse: git pullUpdate the code
Developer->>Local Warehouse: Create a feature branch
Developer->>Local Warehouse: Develop and Submit
Developer->>Remote Repository: git pushPush Branch
Developer->>Remote Repository: CreatePull Request
Remote Repository->>CI/CD: Automated Testing
CI/CD->>Remote Repository: Test Passed
Remote Repository->>Local Warehouse: Merge intomain
Developer->>Local Warehouse: git pullSynchronize
(2) Processo de desenvolvimento de funcionalidades
▶ Exemplo: Processo completo de desenvolvimento de funcionalidades
# 1. Start Developing New Features
git checkout main
git pull origin main
git checkout -b feature/user-profile
# 2. Submit Regularly(Iterate quickly)
git add src/profile.js
git commit -m "feat(profile): Add User Profile Page"
git add src/api/profile.js
git commit -m "feat(profile): Add InformationAPIInterface"
git add src/test/profile.test.js
git commit -m "test(profile): Add Unit Tests"
# 3. Stay in touch withmainSynchronize
git fetch origin
git rebase origin/main
# 4. Push and CreatePR
git push -u origin feature/user-profile
# 5. PRMerge after approval
# 6. Cleanup
git checkout main
git pull origin main
git branch -d feature/user-profile
(3) Processo de correção de bugs
▶ Exemplo: Processo de correção de bugs
# 1. Create a fix branch from main
git checkout main
git pull origin main
git checkout -b fix/login-error
# 2. Identify and FixBug
# View logs to troubleshoot issues
git log --grep="login"
# Fix the code
git add src/auth.js
git commit -m "fix(auth): Fix the login authentication error
- Fix the validation logic for empty passwords
- Add an input length check
Fixes #789"
# 3. Push and CreatePR
git push -u origin fix/login-error
# 4. Post-merger cleanup
git checkout main
git pull origin main
git branch -d fix/login-error
4. Habilidades de trabalho em equipe
(1) Revisão de código
Melhores práticas para pull requests:
Ao criar um PR:
- ✅ Escreva títulos e descrições claros para os comunicados de imprensa
- ✅ Link para o ticket em questão
- ✅ Mantenha os PRs pequenos e focados (<400 linhas de código)
- ✅ Verificar se os testes de CI são aprovados
- ✅ Adicione as capturas de tela ou demonstrações necessárias
Ao revisar um PR:
- ✅ Verificar a qualidade e a lógica do código
- ✅ Executar testes locais
- ✅ Dar feedback construtivo
- ✅ Responder prontamente aos comentários das avaliações
▶ Exemplo: Modelo de descrição de RP
**Feature Description**
Add User Profile Page,Supports viewing and editing user information。
**Details of the Changes**
- New Profile Components
- Add Information Edit Form
- Implement the profile picture upload feature
- Add Unit Tests
**Test**
- [x] Unit tests passed
- [x] Manual testing completed
- [x] Responsive Layout Testing
**Screenshot**
[Add a screenshot]
**RelatedIssue**
Closes #123
(2) Estratégias de resolução de conflitos
▶ Exemplo: Prevenção e resolução de conflitos
# Conflict Prevention
# 1. Synchronize remote code frequently
git fetch origin
git rebase origin/main
# 2. Iterate quickly,Frequent Submissions
# Commit after completing each small feature
# 3. Timely Communication,Scope of Coordinated Revisions
# Resolving Conflicts
# 1. Pull the latest code
git pull --rebase origin main
# 2. Resolving Conflicts
# Editing Files with Conflicts,Keep the correct content
# 3. Mark the conflict as resolved
git add .
# 4. Continuerebase
git rebase --continue
# 5. Push
git push origin feature
(3) Mantenha o histórico organizado
▶ Exemplo: Um histórico de commits organizado
# UsagerebaseMerge Commit
git rebase -i HEAD~3
# In the editor:
# pick a1b2c3d feat: Add FeatureA
# squash d4e5f6g feat: Improve functionalityA
# squash h7i8j9k feat: Optimization FeaturesA
# Edit the merged commit message after saving
# feat: Add FeatureA
# Usagerebaserather thanmerge
git pull --rebase origin main
# View the complete history
git log --oneline --graph
# Output:
# * a1b2c3d feat: Add FeatureC
# * d4e5f6g feat: Add FeatureB
# * h7i8j9k feat: Add FeatureA
5. Melhores práticas para a configuração do Git
(1) Configurações globais recomendadas
▶ Exemplo: Configurando o Git
# User Information
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
# Default Editor
git config --global core.editor "code --wait"
# Default branch name
git config --global init.defaultBranch main
# Automatic Line Break Conversion
git config --global core.autocrlf input # Linux/Mac
git config --global core.autocrlf true # Windows
# Pull Strategy
git config --global pull.rebase true
# Push Strategy
git config --global push.default simple
# Voucher Storage
git config --global credential.helper store
# Alias Configuration
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.lg "log --oneline --graph --all"
(2) Configuração do .gitignore
▶ Exemplo: Um arquivo .gitignore completo
# Dependency Directory
node_modules/
vendor/
venv/
# Compilation Output
dist/
build/
out/
*.o
*.class
*.jar
*.exe
# IDELayout
.vscode/
.idea/
*.swp
*.swo
.DS_Store
# Environment Configuration
.env
.env.local
.env.*.local
config.local.js
# Log Files
*.log
logs/
npm-debug.log*
yarn-debug.log*
# Test Coverage
coverage/
.nyc_output/
# Temporary Files
tmp/
temp/
*.tmp
*.temp
# Operating System Files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
(3) Hooks do Git
▶ Exemplo: hook pre-commit
#!/bin/bash
# .git/hooks/pre-commit
# Run Code Check
npm run lint
if [ $? -ne 0 ]; then
echo "❌ Code check failed,Please fix it and then submit it."
exit 1
fi
# Run Test
npm test
if [ $? -ne 0 ]; then
echo "❌ Test Failed,Please fix it and then submit it."
exit 1
fi
echo "✅ Code review and testing passed"
exit 0
6. Perguntas frequentes e soluções
(1) Como lidar com erros comuns
▶ Exemplo: Tratamento de erros
# Error1:Push Rejected
git push origin main
# ! [rejected] main -> main (fetch first)
# Resolve:
git pull --rebase origin main
git push origin main
# Error2:Merge Conflicts
git merge feature
# CONFLICT (content): Merge conflict in file.js
# Resolve:
# Editing Files with Conflicts
git add file.js
git commit
# Error3:detached HEAD
git checkout a1b2c3d
# You are in 'detached HEAD' state
# Resolve:
git switch -c new-branch
# Error4:Accidentally Deleted a Branch
git branch -D feature
# Restore:
git reflog
git checkout -b feature <commit-id>
(2) Otimização de desempenho
▶ Exemplo: Otimização do desempenho do Git
# Optimizing the Performance of Large Repositories
git gc --aggressive
# Partial Clone(Large Warehouse)
git clone --filter=blob:none --sparse <url>
git sparse-checkout init --cone
git sparse-checkout add src/
# Shallow Cloning(Only the most recent history is needed)
git clone --depth=1 <url>
# Disable File Mode Change Detection(Windows)
git config core.fileMode false
❓ Perguntas Frequentes
P: Como posso manter meu histórico de commits organizado?
R: Use
git rebase -ipara mesclar commits relacionados, usegit pull --rebaseem vez de “merge”, escreva mensagens de commit claras e evite commits sem sentido.
P: O que devo usar, o Git Flow ou o GitHub Flow?
R: O Git Flow é adequado para projetos com um ciclo de lançamento definido, enquanto o GitHub Flow é adequado para projetos com implantação contínua. Para projetos pequenos, recomenda-se o GitHub Flow, pois é mais simples e eficiente.
P: Como devemos abordar o desenvolvimento de funcionalidades de longo prazo?
R: Faça a fusão regularmente das atualizações do branch main/develop para manter a sincronização, use sinalizadores de recurso para controlar a ativação de recursos e divida os recursos principais em pull requests menores para uma fusão gradual.
P: Como posso evitar conflitos de mesclagem?
R: Sincronize o código remoto com frequência, dê passos pequenos e rápidos com commits frequentes, comunique-se prontamente para coordenar o escopo das alterações e use
rebaseem vez demerge.
P: Em que idioma as informações devem ser enviadas?
R: Recomendamos o uso do inglês, pois ele está em conformidade com os padrões internacionais e facilita a colaboração em código aberto. O chinês pode ser usado em projetos internos da equipe, mas é preciso manter a consistência.
📖 Resumo
- Diretrizes para commits: Siga as diretrizes do Conventional Commits e escreva mensagens de commit claras
- Estratégias de ramificação: o Git Flow é adequado para projetos com ciclos de lançamento, enquanto o GitHub Flow é adequado para implantação contínua
- Fluxo de trabalho: iterar rapidamente, fazer commits com frequência, sincronizar regularmente e realizar revisões de código
- Colaboração em equipe: revisão de PRs, resolução de conflitos, manutenção do histórico organizado
- Configuração do Git: configure aliases, credenciais e hooks para aumentar a eficiência
- Melhores práticas: processos padronizados, comunicação clara e aprendizagem contínua
📝 Exercícios
-
Exercícios básicos: Configure seu ambiente Git, incluindo informações de usuário, aliases e um editor; crie mensagens de commit que sigam as melhores práticas; e desenvolva bons hábitos de uso do Git.
-
Exercício avançado: Implemente o fluxo de trabalho completo do GitHub Flow: crie um branch de recurso, desenvolva o recurso, crie uma pull request (simulação), faça a fusão do branch e limpe o branch para vivenciar o processo de colaboração em equipe.
-
Desafio: Escreva um guia de uso do Git para a equipe, incluindo diretrizes para commits, políticas de ramificação, fluxos de trabalho e soluções para problemas comuns, a fim de ajudar os membros da equipe a desenvolver bons hábitos no uso do Git.
🎉 Parabéns! Você concluiu todo o tutorial do Git e dominou as habilidades essenciais do controle de versão!
Recomendações para estudos futuros:
- Estudo aprofundado dos mecanismos internos do Git
- Explore recursos avançados: submódulos, árvores de trabalho e ramos de filtro
- Aprenda a configurar um servidor Git: GitLab, Gitea
- Saiba mais sobre a integração do Git com outras ferramentas: CI/CD, IDEs