Pular para o conteúdo

Git, dependências, empacotamento e publicação de aplicações

Prioridade Baixa 15 min de leitura Status: Não visto Lido Praticado Dominado

Do zero

Git é uma máquina do tempo para o código. Cada vez que você termina uma parte do trabalho, tira uma foto do projeto (um commit), com data, autor e uma mensagem dizendo o que mudou. Dá para voltar a qualquer foto, comparar duas fotos e trabalhar em paralelo em branches (linhas do tempo alternativas) que depois se juntam.

O Git tem três lugares para os arquivos, como uma mesa de trabalho, uma caixa de envio e um arquivo morto:

  • Diretório de trabalho: a mesa, onde você edita.
  • Área de preparação (staging, ou index): a caixa onde você põe o que vai entrar na próxima foto (git add).
  • Repositório: o arquivo morto, com todas as fotos (git commit). O repositório local fica na pasta .git; o remoto (no GitHub, no GitLab) é a cópia compartilhada com a equipe (git push e git pull).

Quase nenhum programa é feito do zero: ele usa dependências, bibliotecas escritas por outros. O gerenciador de dependências (npm, pip, Maven) é a lista de compras: você diz “preciso da biblioteca X, versão tal”, e ele baixa, inclusive as dependências das dependências.

Por fim, empacotar é pôr a aplicação numa caixa pronta para instalar (um JAR, um pacote Python, uma imagem de container), e publicar é colocar essa caixa numa prateleira de onde outros possam pegá-la (um registro, como o npm, o PyPI ou um registro de containers).

Frase para guardar: add prepara, commit fotografa, push envia; o gerenciador baixa as dependências, o lock congela as versões, o pacote vai para o registro.

Em 1 minuto

  • Comandos básicos: git init e git clone (começar), git status e git diff (ver o que mudou), git add e git commit (registrar), git log (histórico), git branch e git switch (branches), git merge (juntar), git push, git fetch e git pull (sincronizar).
  • fetch × pull: git fetch baixa os commits novos do remoto sem mexer no seu branch; git pull é fetch seguido de merge (ou rebase).
  • revert × reset: git revert cria um commit novo que desfaz outro, sem apagar o histórico (seguro em branch compartilhado); git reset move o branch para trás e, com --hard, descarta mudanças (perigoso depois do push).
  • .gitignore lista o que o Git não deve versionar: dependências baixadas, arquivos gerados, segredos (.env).
  • Versionamento semântico (SemVer): MAIOR.MENOR.CORREÇÃO. Muda o MAIOR quando quebra a compatibilidade, o MENOR quando acrescenta funções compatíveis e a CORREÇÃO quando só corrige erros.
  • Arquivo de lock (package-lock.json, poetry.lock) registra as versões exatas de todas as dependências, inclusive as indiretas (transitivas), para que toda instalação seja igual.

Exemplo concreto: a correção da multa, do commit ao pacote

1. A correção no Git, num branch próprio:

git clone https://git.example.org/tce/calculos.git
cd calculos
git switch -c corrige-multa          # cria o branch e muda para ele
# ...edita src/calculos/multa.py...
git status                           # mostra o arquivo modificado
git add src/calculos/multa.py        # põe na área de preparação
git commit -m "Corrige o arredondamento da multa por atraso"
git push -u origin corrige-multa     # envia o branch ao remoto

Depois da revisão, o branch é juntado (merge) ao principal.

2. As dependências, declaradas no pyproject.toml do projeto Python:

[project]
name = "calculos-tce"
version = "1.4.1"                    # era 1.4.0: só uma correção, sobe o último número
dependencies = [
  "requests>=2.32,<3",               # aceita correções e novidades, nunca a versão 3
]

3. O empacotamento e a publicação:

python -m build            # gera dist/calculos_tce-1.4.1-py3-none-any.whl e o .tar.gz
twine upload dist/*        # publica no PyPI (ou num registro interno do órgão)
git tag v1.4.1             # marca no histórico o commit que virou a versão
git push origin v1.4.1

Comparação: os ecossistemas e as faixas de versão

Ecossistema Arquivo de dependências Lock Pacote gerado Onde publica
JavaScript (npm) package.json package-lock.json .tgz (npm pack) Registro npm (npm publish)
Python (pip, Poetry) pyproject.toml ou requirements.txt poetry.lock ou versões fixas Wheel .whl e .tar.gz (python -m build) PyPI (twine upload)
Java (Maven) pom.xml Versões fixas no próprio pom JAR ou WAR (mvn package, na pasta target) Repositório Maven (mvn deploy)
Java (Gradle) build.gradle gradle.lockfile (opcional) JAR ou WAR (gradle build) Repositório Maven
Containers Dockerfile Imagem base com versão fixa Imagem (docker build) Registro de containers (docker push)
Faixa (npm) Aceita Exemplo com 2.4.1
2.4.1 Só essa versão 2.4.1
~2.4.1 Correções da mesma versão menor De 2.4.1 até antes de 2.5.0
^2.4.1 Tudo compatível na mesma versão maior De 2.4.1 até antes de 3.0.0
* Qualquer versão Arriscado: pode trazer quebra de compatibilidade
latest A versão marcada com essa etiqueta (dist-tag) no registro, em geral a mais recente Também arriscado, pelo mesmo motivo
git revert git reset --hard
O que faz Cria um commit novo que desfaz um anterior Move o branch para um commit antigo e descarta o que veio depois
Histórico Preservado Reescrito
Depois do push Seguro Exige push forçado e atrapalha quem já baixou

JAR × WAR: o JAR (Java Archive) empacota classes e recursos, e pode ser executável; o WAR (Web Application Archive) empacota uma aplicação web para ser implantada num contêiner web ou servidor de aplicação, como o Tomcat (contêiner de servlets) ou o WildFly (antigo JBoss).

Como a FCC cobra

O que cada comando do Git faz (add, commit, push, pull, fetch, merge, revert, reset) e as três áreas (trabalho, preparação, repositório), além do versionamento semântico.

  • fetch × pull e revert × reset.
  • Função do .gitignore e do arquivo de lock.
  • Faixas de versão (^ e ~) e dependências transitivas.
  • Artefatos de cada ecossistema (JAR, WAR, wheel) e registros de publicação.

Pegadinhas

  • “git commit envia as alterações ao repositório remoto.” Falso: o commit grava no repositório local; quem envia é o git push.
  • “git fetch integra automaticamente as mudanças do remoto ao branch atual.” Falso: só baixa; quem integra é o merge (ou o git pull, que faz os dois).
  • “Para desfazer um commit já compartilhado, o mais seguro é git reset --hard.” Falso: o reset reescreve o histórico; o seguro é git revert.
  • “Pelo SemVer, uma correção de bug na 3.7.2 gera a 4.0.0.” Falso: correção sobe o último número: 3.7.3.
  • “Com o arquivo de lock, as dependências indiretas ficam de fora.” Falso: o lock registra também as transitivas, com versões exatas.
  • “O .gitignore apaga do repositório arquivos que já foram versionados.” Falso: ele só impede que arquivos ainda não versionados entrem; para tirar um já versionado, usa-se git rm --cached.

Explique com suas palavras

Explique a um colega o caminho de uma alteração no Git, do arquivo editado até o repositório remoto, e por que o arquivo de lock evita o “na minha máquina funciona”.

  1. Escreva sem olhar a lição, com frases curtas e um exemplo seu.
  2. Onde travar ou precisar de jargão, há uma lacuna: releia só essa parte.
  3. Compare com a explicação-modelo e reescreva o que faltou.

Fica salva neste navegador.

Comparar com uma explicação-modelo

Quando eu edito um arquivo, a mudança está só na minha pasta. Com git add, digo ao Git que essa mudança vai entrar na próxima foto. Com git commit, tiro a foto e ela fica guardada no meu repositório local, com uma mensagem. Só com git push essa foto vai para o repositório da equipe, onde os outros podem baixá-la.

O arquivo de dependências diz “quero a biblioteca X, de tal versão em diante”. Sem o lock, cada pessoa que instalar pode receber uma versão diferente, publicada no meio do caminho, e o programa se comporta de um jeito em cada máquina. O lock anota a versão exata de cada biblioteca, inclusive as que vêm de carona, e assim todo mundo instala exatamente o mesmo conjunto.

Teste-se

Desenvolvimento de Sistemas · Git e publicação · Inédita, estilo FCC

Questão 1 de 3

No Git, após editar um arquivo já versionado, o desenvolvedor executou git add com o nome desse arquivo. Com isso, a alteração

Alternativas

A–E escolhem, Enter confirma. Botão direito ou Shift + letra risca.

Toque longo numa alternativa para riscá-la.

Desenvolvimento de Sistemas · Git e publicação · Inédita, estilo FCC

Questão 2 de 3

Um commit com erro já foi enviado ao branch principal do repositório compartilhado, e outros desenvolvedores já o baixaram. A forma mais segura de desfazer o efeito desse commit é

Alternativas

A–E escolhem, Enter confirma. Botão direito ou Shift + letra risca.

Toque longo numa alternativa para riscá-la.

Desenvolvimento de Sistemas · Git e publicação · Inédita, estilo FCC

Questão 3 de 3

O comando do Git que baixa do repositório remoto os commits novos, sem integrá-los ao branch em que o desenvolvedor está trabalhando, é o

Alternativas

A–E escolhem, Enter confirma. Botão direito ou Shift + letra risca.

Toque longo numa alternativa para riscá-la.

Mais duas questões deste tópico estão em Questões.

Flashcards gerados

FrenteVerso
Versionamento semântico (SemVer) MAIOR.MENOR.CORREÇÃO. Sobe o MAIOR quando quebra a compatibilidade, o MENOR com funções novas compatíveis e a CORREÇÃO com correções de erro. Exemplo: Correção de bug na 3.7.2 gera a 3.7.3.
Para que serve o .gitignore? Lista arquivos que o Git não deve versionar, como dependências baixadas, arquivos gerados e segredos (.env).
Dependência transitiva Uma dependência da sua dependência; entra no projeto sem ter sido declarada diretamente.
JAR × WAR O JAR empacota classes e recursos Java e pode ser executável; o WAR empacota uma aplicação web para um contêiner web ou servidor de aplicação, como o Tomcat ou o WildFly.
Onde se publicam os pacotes? Em registros, como o npm (JavaScript), o PyPI (Python), repositórios Maven (Java) e registros de containers.

Ligação com o estudo de caso

Num caso sobre a gestão do código de um sistema do Tribunal, proponha: todo código no Git, com branch por mudança e revisão antes do merge; segredos fora do repositório (.gitignore e cofre de segredos); dependências com versões travadas em lock e verificadas contra vulnerabilidades (como npm audit ou uma ferramenta de análise de composição); e versões publicadas com SemVer e tag, num registro interno, para saber exatamente o que está em produção.

Fontes da lição

Claude explica

Tire dúvidas sobre este tema no Claude: o site copia o pedido com a lição e abre uma conversa nova, na sua conta. Confira na fonte qualquer fato de lei ou de norma.

Pratique fora do site

Faça questões da FCC sobre este tópico no QConcursos ou no Gran e registre aqui quantas fez: elas contam na meta da semana e no status do tópico.

Registrar questões feitas lá
Errei uma questão lá: criar flashcard