Exercícios
Parte 1: Introdução ao Git e GitHub - Conceitos e Comandos Básicos O que é Git e para que ele é utilizado?Git é um sistema de controle de versão distribuído utilizado para rastrear alterações em arquivos e coordenar o trabalho entre desenvolvedores. Explique a diferença entre Git e GitHub.Git é o software de controle de versão, enquanto GitHub é uma plataforma online que hospeda repositórios Git e facilita a colaboração. Como instalar o Git no Windows?Baixe o instalador em git-scm.com, execute-o e siga as instruções. Como instalar o Git no Linux?Execute o comando no terminal: sudo apt update && sudo apt install git # Debian/Ubuntu sudo yum install git # CentOS/RHEL sudo dnf install git # Fedora Qual comando verifica a versão do Git instalada? git --version Como configurar nome e e-mail no Git? git config --global user.name "Seu Nome" git config --global user.email "seu@email.com" Qual comando cria um novo repositório Git? git init Como adicionar um arquivo ao controle de versão? git add nome-do-arquivo Explique a diferença entre git add e git commit.git add adiciona mudanças à área de stage (preparação), enquanto git commit grava essas mudanças no histórico. Como criar um commit com uma mensagem descritiva? git commit -m "Mensagem descritiva do commit" Como visualizar o histórico de commits? git log Qual comando mostra o status dos arquivos do repositório? git status Como clonar um repositório remoto? git clone URL-do-repositorio Qual comando atualiza um repositório local com alterações remotas? git pull Como enviar commits para um repositório remoto? git push origin nome-da-branch Como remover um arquivo do controle de versão sem excluí-lo do sistema? git rm --cached nome-do-arquivo Como desfazer um commit? Para desfazer o último commit, mantendo as alterações: git reset --soft HEAD~1 Para remover completamente as alterações: git reset --hard HEAD~1 Qual comando exibe as diferenças entre arquivos modificados e a última versão commitada? git diff Como criar um alias para comandos Git? git config --global alias.nome-alias "comando" Exemplo: git config --global alias.hist "log --oneline --graph --decorate" Como restaurar um arquivo para a última versão commitada? git checkout -- nome-do-arquivo Parte 2: Trabalho com GitHub - Fluxo de Trabalho e Boas Práticas O que é um branch e por que utilizá-lo?Um branch (ramo) é uma linha independente de desenvolvimento no Git. Ele permite que diferentes funcionalidades sejam desenvolvidas separadamente, sem afetar o código principal até estarem prontas para serem mescladas. Como criar um novo branch? git branch nome-do-branch Qual comando muda para um branch diferente? git checkout nome-do-branch Ou no Git mais recente: git switch nome-do-branch Como listar todos os branches do repositório? git branch Para listar branches remotos também: git branch -a Qual comando exclui um branch local? git branch -d nome-do-branch Para forçar a exclusão: git branch -D nome-do-branch Como enviar um branch para o repositório remoto? git push origin nome-do-branch Como excluir um branch remoto? git push origin --delete nome-do-branch O que é um merge e como ele funciona?Merge é o processo de combinar as alterações de um branch em outro. Ele pode ser feito automaticamente ou manualmente, dependendo da compatibilidade entre as mudanças. Como realizar um merge entre dois branches? git checkout branch-principal # Ou git switch branch-principal git merge nome-do-branch Como evitar conflitos ao mesclar branches? Manter o branch atualizado com git pull regularmente. Fazer commits pequenos e frequentes. Utilizar rebase quando apropriado. O que fazer quando ocorre um conflito de merge? O Git marcará os arquivos em conflito. Edite os arquivos para resolver os conflitos. Após resolver, use:git add arquivo-resolvido git commit -m "Resolvido conflito no merge" Como visualizar os branches remotos? git branch -r O que é um Pull Request?No GitHub, um Pull Request (PR) é uma solicitação para mesclar mudanças de um branch em outro. Ele permite revisão de código antes da fusão. Como criar um Pull Request no GitHub? Faça um push do branch para o repositório remoto: git push origin nome-do-branch No GitHub, vá até o repositório, clique em "Pull Requests" e clique em "New Pull Request". O que é um fork e como utilizá-lo?Fork é uma cópia de um repositório feita para sua conta do GitHub, permitindo modificações sem afetar o original. Para utilizá-lo, clique em Fork no GitHub e clone o repositório para seu ambiente local. Como sincronizar um fork com o repositório original?Adicione o repositório original como um remote: git remote add upstream URL-do-repositorio-original Busque as atualizações: git fetch upstream git merge upstream/main Qual comando permite trazer alterações de um repositório remoto para um fork? git pull upstream main O que é um rebase e quando utilizá-lo?git rebase permite mover commits de um branch para outro, reescrevendo o histórico. Ele é útil para manter um histórico mais linear e limpo.Exemplo: git checkout nome-do-branch git rebase main Como reverter um commit sem apagar seu histórico? git revert HEAD Isso cria um novo commit que desfaz as mudanças do commit anterior. O que significa "fast-forward merge"?Um fast-forward merge ocorre quando não há divergências entre os branches, permitindo que o ponteiro do branch principal avance diretamente para o novo commit, sem a necessidade de um commit de merge. Exercícios Avançados - Git e GitHub Como configurar um repositório Git para ignorar arquivos?Criando e configurando um arquivo .gitignore na raiz do repositório, listando os arquivos e diretórios que não devem ser versionados. O que é e como usar o arquivo .gitignore?.gitignore é um arquivo onde se define padrões de arquivos ou diretórios que devem ser ignorados pelo Git. Exemplo de uso: # Ignorar arquivos de compilação *.log *.out /node_modules /dist Como reverter um commit específico sem afetar os commits seguintes?Usando git revert: git revert <hash-do-commit> Isso cria um novo commit desfazendo as mudanças do commit especificado. Como visualizar a autoria de cada commit em um histórico? git log --pretty=format:"%h - %an, %ar : %s" Ou para um arquivo específico: git blame nome-do-arquivo O que são submódulos Git e como usá-los?Submódulos são repositórios dentro de outro repositório.Para adicionar um submódulo: git submodule add URL-do-repositorio Para clonar um repositório com submódulos: git clone --recurse-submodules URL-do-repositorio Como verificar o autor de uma linha específica em um arquivo usando o Git? git blame nome-do-arquivo Isso mostra o autor de cada linha no arquivo. Qual comando permite restaurar um branch deletado? git reflog git checkout -b nome-do-branch <hash-do-commit> Como configurar um repositório para trabalho colaborativo usando GitHub? Criar um repositório e adicionar colaboradores via "Settings > Collaborators". Definir permissões em "Settings > Branch Protection Rules". Estabelecer um fluxo de trabalho com branches e Pull Requests. Como criar um template de Pull Request no GitHub?Criar um arquivo .github/PULL_REQUEST_TEMPLATE.md no repositório, com um modelo de PR. Exemplo: ## Descrição Descreva as mudanças feitas. ## Tipo de mudança - [ ] Bug fix - [ ] Nova funcionalidade - [ ] Melhorias no código ## Checklist - [ ] Testado localmente - [ ] Revisão realizada Como proteger a branch principal no GitHub?No repositório, vá em "Settings > Branches > Add branch protection rule" e configure restrições, como: Exigir revisões para Pull Requests. Bloquear force push. Exigir status checks antes do merge. Aqui estão as respostas para os exercícios avançados sobre Git e GitHub: Parte 3: Interação Avançada com Git e GitHub Tags e Versões Como criar e gerenciar tags no Git?Criar uma tag leve: git tag nome-da-tag Criar uma tag anotada: git tag -a nome-da-tag -m "Mensagem da tag" Para listar todas as tags: git tag Qual a diferença entre tags anotadas e leves? Tags leves são apenas referências a commits. Tags anotadas contêm metadados, como autor, data e mensagem. Como compartilhar tags em um repositório remoto? git push origin nome-da-tag Para enviar todas as tags: git push --tags Como listar e remover tags existentes? Listar: git tag Remover uma tag local: git tag -d nome-da-tag Remover uma tag remota: git push --delete origin nome-da-tag Stash (Armazenamento Temporário) O que é um "stash" e como utilizá-lo?O stash permite salvar mudanças temporariamente sem fazer um commit. Para salvar um stash: git stash Como listar e aplicar stashes salvos? Listar stashes: git stash list Aplicar um stash: git stash apply Como deletar um stash desnecessário? Deletar um stash específico: git stash drop stash@{número} Deletar todos os stashes: git stash clear Automação e Segurança Como criar hooks para automatizar processos no Git?Crie um script no diretório .git/hooks/. Exemplo de pre-commit: #!/bin/bash echo "Verificando código antes do commit..." exit 0 Torne-o executável: chmod +x .git/hooks/pre-commit O que são GPG keys e como assinaturas digitais funcionam no Git?GPG (GNU Privacy Guard) é usado para assinar commits e tags.Para assinar um commit: git commit -S -m "Commit assinado" Como configurar Git para trabalhar com grandes arquivos usando LFS?Instale o Git LFS: git lfs install Adicione arquivos grandes ao controle do LFS: git lfs track "*.psd" Depuração e Autenticação Como usar git bisect para encontrar commits problemáticos? git bisect start git bisect bad # Marca o commit atual como ruim git bisect good hash-do-commit-bom Como configurar autenticação SSH no GitHub? Gerar chave SSH: ssh-keygen -t ed25519 -C "seu@email.com" Adicionar ao GitHub em "Settings > SSH and GPG keys". Integração e Automação Como criar GitHub Actions para CI/CD?Criar .github/workflows/ci.yml com um fluxo de CI/CD. O que é um Webhook no GitHub e como configurá-lo?Webhooks permitem acionar eventos automaticamente em aplicações externas. Configure em Settings > Webhooks. Colaboração e Gerenciamento Como integrar GitHub com Jenkins?Configure um Webhook no GitHub apontando para o Jenkins. Como definir permissões em um repositório privado do GitHub?Vá em Settings > Collaborators e configure permissões. Como configurar templates para issues no GitHub?Criar .github/ISSUE_TEMPLATE.md e definir um modelo. Recuperação e Manipulação de Commits Como utilizar git reflog para recuperar commits perdidos? git reflog git checkout <hash-do-commit> Como utilizar git cherry-pick para aplicar commits específicos? git cherry-pick <hash-do-commit> Como dividir commits grandes em commits menores? git rebase -i HEAD~3 Altere pick para edit e faça novos commits. Fluxos e Melhor Organização Como organizar commits de um repositório para uma melhor manutenção?Usando git rebase e boas mensagens de commit. Como corrigir autor de commits no Git? git commit --amend --author="Nome <email>" Outras Operações Avançadas Como configurar Git para integrar com GitLab e Bitbucket?Adicionando os remotes adequados: git remote add gitlab URL-GitLab git remote add bitbucket URL-Bitbucket Como manter um fork sempre atualizado? git pull upstream main Como visualizar a história de um arquivo específico no Git? git log --follow nome-do-arquivo Open Source e Projetos Colaborativos Como colaborar de maneira eficiente em projetos open source no GitHub? Fazer fork do projeto. Criar um branch para mudanças. Abrir um Pull Request. Trabalho Avançado com Histórico Como usar git filter-branch para remover arquivos do histórico do Git? git filter-branch --tree-filter 'rm -rf arquivo-secreto' HEAD Como usar git worktree para trabalhar com múltiplas cópias do mesmo repositório? git worktree add ../novo-diretorio branch Fluxos e Lançamentos Como implementar fluxo de desenvolvimento GitFlow?Instale git-flow e use: git flow init Como criar releases no GitHub?Vá em Releases no GitHub e crie uma nova versão baseada em uma tag. Desempenho e Otimização Como lidar com repositórios gigantes e otimizar desempenho no Git? Usar Git LFS para arquivos grandes. Configurar shallow clones: git clone --depth=1 URL Revisão e Documentação Como revisar um Pull Request de forma eficiente? Usar a aba Files changed no GitHub. Deixar comentários nas linhas de código. Como criar um changelog automático com Git?Usando git log --pretty=format. 99. Como integrar GitHub com ferramentas de gestão de projetos como Trello? A integração entre GitHub e Trello pode ser feita de diversas formas, permitindo que commits, pull requests e issues no GitHub sejam vinculados a tarefas no Trello. Métodos de Integração: Usando o Power-Up do Trello para GitHub No Trello, vá até Menu > Power-Ups e pesquise por GitHub. Conecte sua conta do GitHub e escolha o repositório. Agora, é possível adicionar informações de commits e PRs diretamente nos cartões do Trello. Usando Webhooks No GitHub, vá até Settings > Webhooks e adicione um novo webhook apontando para a API do Trello. Isso permite a criação automática de cartões quando um issue ou PR é aberto. Automação com Zapier Configure um fluxo no Zapier para criar tarefas no Trello quando um commit ou issue for registrado no GitHub. Usando GitHub Projects Se o objetivo for gerenciar projetos dentro do próprio GitHub, pode-se usar o GitHub Projects, que funciona de forma similar ao Trello. 100. Como utilizar Git para gerenciamento de configuração em sistemas complexos? O Git é amplamente usado para gerenciamento de configuração (Configuration Management - CM) em sistemas complexos, como infraestrutura de TI, DevOps e CI/CD. Métodos para Gerenciamento de Configuração com Git: Versionamento de Arquivos de Configuração Manter arquivos de configuração (ex: .env, config.yaml) em um repositório Git. Utilizar branches específicos para diferentes ambientes (desenvolvimento, staging, produção). Uso de Repositórios Bare para Configuração Global Criar um repositório bare para armazenar arquivos de configuração em diferentes sistemas: git init --bare $HOME/.cfg alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME' config add .bashrc .vimrc config commit -m "Adicionando arquivos de configuração" Infraestrutura como Código (IaC) Usar GitOps para controlar infraestrutura como código com ferramentas como Terraform, Ansible, Kubernetes (K8s). Git Hooks para Aplicação de Configurações Criar hooks de pós-checkout (post-checkout) para aplicar mudanças de configuração automaticamente:# .git/hooks/post-checkout # Executa scripts de configuração automaticamente ./configure.sh Uso de Submódulos para Dependências Se diferentes partes do sistema possuem configurações próprias, usar submódulos para separação:git submodule add https://github.com/user/config-repo.git config Gerenciamento de Secrets com Git Evitar versionar credenciais sensíveis! Usar git-crypt, sops ou AWS Secrets Manager para armazenar segredos de forma segura. Deploy Automatizado com CI/CD Integrar repositórios de configuração a pipelines de CI/CD (GitHub Actions, Jenkins, GitLab CI):jobs: deploy: steps: - name: Deploy Configuration run: ./deploy-config.sh 🔹 Resumo: O Git pode ser usado para gerenciar configurações de sistemas complexos através do versionamento de arquivos, uso de branches específicos, integração com GitOps e automação com CI/CD.