Git, dependências, empacotamento e publicação de aplicações
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 pushegit 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 initegit clone(começar),git statusegit diff(ver o que mudou),git addegit commit(registrar),git log(histórico),git branchegit switch(branches),git merge(juntar),git push,git fetchegit pull(sincronizar). - fetch × pull:
git fetchbaixa os commits novos do remoto sem mexer no seu branch;git pullé fetch seguido de merge (ou rebase). - revert × reset:
git revertcria um commit novo que desfaz outro, sem apagar o histórico (seguro em branch compartilhado);git resetmove 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 commitenvia as alterações ao repositório remoto.” Falso: o commit grava no repositório local; quem envia é ogit push. - “
git fetchintegra automaticamente as mudanças do remoto ao branch atual.” Falso: só baixa; quem integra é o merge (ou ogit 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”.
- Escreva sem olhar a lição, com frases curtas e um exemplo seu.
- Onde travar ou precisar de jargão, há uma lacuna: releia só essa parte.
- 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
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 é
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
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
| Frente | Verso |
|---|---|
| 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
- Edital nº 01/2026, Anexo II, Desenvolvimento de Sistemas (fontes/edital-01-2026.txt).
- Pro Git, de Scott Chacon e Ben Straub (áreas do Git, commits, branches, revert e reset).
- Especificação do Versionamento Semântico 2.0.0.
- Documentação do npm: package.json e faixas de versão e guia de empacotamento do Python.
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.