Git: O que É e Como Funciona | Python Brasil
Aprenda Git para projetos Python: comandos essenciais, branching, .gitignore, fluxos de trabalho e boas praticas de controle de versao para desenvolvedores.
O que e Git?
Git e um sistema de controle de versao distribuido que permite rastrear alteracoes em arquivos, colaborar com outros desenvolvedores e manter um historico completo de cada modificacao em um projeto. Para desenvolvedores Python, Git e uma ferramenta essencial — praticamente todo projeto open-source, biblioteca e framework usa Git para gerenciar seu codigo-fonte. Plataformas como GitHub, GitLab e Bitbucket sao construidas sobre o Git.
Git foi criado por Linus Torvalds em 2005 e se tornou o padrao da industria para controle de versao, substituindo ferramentas anteriores como SVN e Mercurial na maioria dos projetos.
Comandos Essenciais
# Configuracao inicial
# git config --global user.name "Seu Nome"
# git config --global user.email "seu@email.com"
# Iniciar um repositorio
# git init
# Clonar repositorio existente
# git clone https://github.com/usuario/projeto.git
# Ver status dos arquivos
# git status
# Adicionar arquivos ao staging
# git add arquivo.py
# git add . # adiciona todos os modificados
# Criar commit
# git commit -m "Adiciona funcao de autenticacao"
# Ver historico
# git log --oneline
# git log --graph --oneline --all
# Enviar para repositorio remoto
# git push origin main
# Atualizar do repositorio remoto
# git pull origin main
.gitignore para Python
O arquivo .gitignore define quais arquivos e pastas o Git deve ignorar. Para projetos Python, existe um padrao bem estabelecido.
# .gitignore para projetos Python
# Bytecode
# __pycache__/
# *.py[cod]
# *$py.class
# Ambientes virtuais
# .venv/
# venv/
# env/
# Distribuicao
# dist/
# build/
# *.egg-info/
# IDEs
# .vscode/
# .idea/
# *.swp
# Testes e cobertura
# .pytest_cache/
# htmlcov/
# .coverage
# Variaveis de ambiente
# .env
# .env.local
# Banco de dados local
# *.db
# *.sqlite3
Branching e Merging
# Criar e trocar para nova branch
# git checkout -b feature/nova-funcionalidade
# Listar branches
# git branch
# Trocar de branch
# git checkout main
# Merge (incorporar mudancas)
# git checkout main
# git merge feature/nova-funcionalidade
# Deletar branch apos merge
# git branch -d feature/nova-funcionalidade
Automacao com Python e Git
# Usando subprocess para interagir com Git
import subprocess
def obter_ultimo_commit():
"""Retorna a mensagem do ultimo commit."""
resultado = subprocess.run(
['git', 'log', '-1', '--format=%H %s'],
capture_output=True,
text=True,
)
return resultado.stdout.strip()
def listar_arquivos_modificados():
"""Lista arquivos modificados no working directory."""
resultado = subprocess.run(
['git', 'diff', '--name-only'],
capture_output=True,
text=True,
)
return resultado.stdout.strip().split('\n')
print(obter_ultimo_commit())
print(listar_arquivos_modificados())
Pre-commit Hooks com Python
# Instalacao: pip install pre-commit
# .pre-commit-config.yaml
# repos:
# - repo: https://github.com/pre-commit/pre-commit-hooks
# rev: v4.5.0
# hooks:
# - id: trailing-whitespace
# - id: end-of-file-fixer
# - id: check-yaml
# - id: check-added-large-files
#
# - repo: https://github.com/psf/black
# rev: 24.1.0
# hooks:
# - id: black
#
# - repo: https://github.com/pycqa/isort
# rev: 5.13.0
# hooks:
# - id: isort
#
# - repo: https://github.com/pycqa/flake8
# rev: 7.0.0
# hooks:
# - id: flake8
# Instalar hooks: pre-commit install
# Rodar manualmente: pre-commit run --all-files
Fluxo de Trabalho Git Flow
# Exemplo de script para automacao de release
import subprocess
import sys
def criar_release(versao: str):
"""Cria uma branch de release seguindo Git Flow."""
comandos = [
f'git checkout -b release/{versao} develop',
f'git commit --allow-empty -m "Inicia release {versao}"',
]
for cmd in comandos:
resultado = subprocess.run(cmd.split(), capture_output=True, text=True)
if resultado.returncode != 0:
print(f'Erro: {resultado.stderr}')
sys.exit(1)
print(f'Release {versao} criada com sucesso')
# Fluxo tipico:
# main — codigo em producao
# develop — integracao de features
# feature/xxx — desenvolvimento de funcionalidades
# release/x.y.z — preparacao de release
# hotfix/xxx — correcoes urgentes
Versionamento Semantico
# setup.py ou pyproject.toml usa versionamento semantico
# MAJOR.MINOR.PATCH
# 1.0.0 -> 1.0.1 (patch: correcao de bug)
# 1.0.0 -> 1.1.0 (minor: nova funcionalidade compativel)
# 1.0.0 -> 2.0.0 (major: mudanca incompativel)
# Exemplo com __version__ no codigo
__version__ = '1.2.3'
# Lendo versao do Git tag
import subprocess
def obter_versao_git():
"""Obtem a versao a partir da tag Git mais recente."""
try:
resultado = subprocess.run(
['git', 'describe', '--tags', '--abbrev=0'],
capture_output=True,
text=True,
)
return resultado.stdout.strip()
except Exception:
return '0.0.0'
Erros Comuns
O erro mais perigoso e fazer commit de segredos como senhas, chaves de API ou arquivos .env — uma vez no historico do Git, sao dificeis de remover completamente. Outro erro frequente e fazer commits muito grandes com multiplas mudancas nao relacionadas, dificultando a revisao e o rastreamento de bugs. Tambem e comum esquecer de criar um .gitignore adequado, incluindo no repositorio arquivos como __pycache__, ambientes virtuais e bancos de dados locais.
Boas Praticas
Escreva mensagens de commit claras e descritivas que expliquem o “por que” da mudanca. Faca commits pequenos e frequentes, cada um com uma unica responsabilidade. Configure um .gitignore completo para Python desde o inicio do projeto. Use branches para desenvolver funcionalidades e correccoes. Instale pre-commit hooks para garantir qualidade do codigo antes de cada commit. Nunca faca commit de segredos — use variaveis de ambiente e ferramentas como git-secrets.
Quando Usar
Git deve ser usado em todo projeto de software, independente do tamanho. Mesmo para projetos pessoais ou scripts simples, o controle de versao protege contra perda de codigo, permite experimentar sem medo e mantem um historico completo de decisoes. Para trabalho em equipe, Git e absolutamente indispensavel.