Git e GitHub

Sintaxe básica Git e GitHub
Voltar

Material complementar:

  • Conteúdo no YouTube (antigo): Acesse
  • Conteúdo no YouTube (atualizado): Acesse
  • Curso gratuito com certificado na Udemy (Git e Github, teoria e prática: Curso rápido): Acesse

Conceito:

No Scrum, produto não é entregue apenas ao final, de forma completa e fechada. Em vez disso, criação ocorre de maneira incremental, com entregas contínuas de funcionalidades e versões a cada Sprint, permitindo ao cliente acompanhar evolução e ajustes durante desenvolvimento do produto, reduzindo retrabalho e riscos. Assim como projeto de planta de casa, desenvolvimento ocorre por etapas: 1º cria-se cozinha, em seguida quartos, e assim sucessivamente. Cada etapa é validada pelo cliente antes do avanço para próxima, favorecendo comunicação constante e maior aderência às regras de negócio. Para viabilizar esse processo, precisa-se de sistemas especiais que permitam versionar, armazenar e gerenciar projeto de forma incremental, mais completos que ambientes de armazenamento cloud. Git, software desktop de controle de versão VCS, tem objetivo de armazenar projetos através de versões. Exemplo, projeto versão 1 terá nova etapa, que será versão 2. Versão 2 terá novos arquivos, alterações no conteúdo com relação à versão 1, novo autor, novas pastas e novos incrementos. Após, terá versão 3. Equipe de trabalho acompanha detalhadamente, via Git, todo histórico das etapas guardadas do projeto, visualizando trechos e autores das alterações. GitHub é ambiente cloud para armazenar alterações locais do Git.


Configuração inicial:

  1. Instalar Git e criar conta no GitHub;
  2. Configurar Git (local):
    • git config --global user.name "usuarioGithub"
    • git config --global user.email "emailGithub"
  3. Vincular Git ao GitHub:
    • Gerar chave SSH (.pub): ssh-keygen -t ed25519 -C "emailGithub"
    • Copiar chave: cat ~/.ssh/id_ed25519.pub
    • No GitHub, adicionar chave em settings / SSH and GPG keys

Comandos Git:


- Criar repositório local: git init nomeRepositorio
- Baixar repositório do GitHub:
-- GitHub, acessar repositório para clonar, botão Code, opção SSH, copiar trecho
-- git clone trechoCopiado

- Adicionar arquivos alterados: git add . ('git add nomeArquivo' para arquivo específico)
- Confirmar alterações: git commit -m "mensagemDescritiva"
- Enviar ao GitHub: git push

- Ver status do repositório: git status
- Ver diferenças no último commit: git show
- Listar commits: git log (--stat para estatísticas)

- Atualizar repositório local com alterações do GitHub:
-- Verificar atualizações (sicronizar): git fetch
-- Atualizar repositório local: git pull

Tag:

Usada para marcar pontos específicos na linha do tempo do projeto (ex: v1, v2):


- Criar tag: git tag -a nomeTag -m "descricaoTag" idCommit
- Listar tags: git tag
- Consultar por tags: git checkout nomeTag
- Publicar tags no GitHub: git push origin --tags
- Deletar tag: git tag -d nomeTag

Branch:

Implementar repositório para trabalhos paralelos. Exemplo, designers usam branch design para trabalhar em paralelo com desenvolvedores no branch main (master/main é branch padrão).


- Criar e selecionar branch: git checkout -b nomeBranch (remover -b para só mudar de branch)
- Criar e selecionar branch (moderno): git switch -c nomeBranch (remover -c para só mudar de branch)
- Voltar ao branch master: git checkout master
- Listar branches: git branch (-a para todos)
- Deletar branch: git branch -d nomeBranch
- Enviar branch ao GitHub: git push origin nomeBranch
- Unir branches: git merge nomeBranchParaUnir

Conflitos de merge:

  • Conflito de salvamento de nova versão quando vários usuários modificar mesmo conteúdo, de mesmo arquivo, simultaneamente e tentarem, juntos, fazer push. Git pedirá para usuário responsável escolher qual modificação será salva, e qual será descartada. Prevenção: organizar equipe para trabalhar simultaneamente em partes separadas do projeto, via branches, onde cada usuário é responsável por sua parte do projeto;
  • Projeto local não está atualizado com relação ao projeto no GitHub. Ao abrir projeto local, 1º verificar se há atualizações (fetch) e, se sim, atualizá-lar projeto local (pull). Após isso, pode-se trabalhar no projeto. Sempre que necessário, enviar atualizações do projeto local ao GitHub (push).

Contribuição no GitHub:

Pode-se clonar repositório no GitHub de outro autor, e usá-lo por conta própria (fork). Issues são comentários de usuários em repositórios. Pull requests são solicitações de alterações em repositórios de outros autores. Se autor aceitar solicitação, fará merge pull request, unindo alterações ao repositório original. Gist é serviço para compartilhamento/salvar trechos de conteúdos. Arquivo 'contributing.md' possui instruções para contribuir no repositório. Arquivo 'readme.md' possui informações sobre repositório. Arquivo oculto '.gitignore' possui lista de arquivos e pastas ignoradas pelo Git, para evitar que sejam versionadas.


Outros comandos:


- Conectar repositório local ao GitHub pela 1ª vez:
-- Criar repositório no GitHub
-- Vincular repositório local ao remoto: git remote add origin <url_ssh_repositorio>

- Editar commit atual: git commit --amend -m "novaDescricaoCommit"
- Remover da staging area: git restore --staged nomeArquivo
- Remover arquivos do repositório, que foram deletados: git rm nomeArquivo
- Reverter alterações de arquivo sem commit, nem add: git restore nomeArquivo
- Reverter commit: git revert idCommit
- Voltar commit anterior, sem desfazer alterações de conteúdo: git reset --soft idCommit

- Ver diferenças entre branches: git diff nomeBranchOrigem nomeBranchAlvo
- Ver diferenças entre commits: git diff idCommitAntigo idCommitNovo
- Ver diferenças entre arquivos: git diff nomeArquivo (diff --staged para arquivos em staging area)

Rebase: reaplica/sobrescreve commits de branch sobre outro, reorganizando histórico de commits para que fique linear. Merge preserva histórico, criando commit de junção, rebase reorganiza histórico, deixando linear e mais legível.
- Sobrescrever commits do branch atual sob outro: git rebase nomeBranch
- Cancelar rebase: git rebase --abort (--continue para continuar rebase após resolver conflito)


Laboratórios práticos (único usuário):

  1. Fluxo de trabalho (sem branch, sem merge):
    
    # Verificar atualizações no repositório
    git fetch
    
    # Baixar atualizações no repositório local
    git pull
    
    # Trabalhar no projeto
    
    # Adicionar arquivos ao Git
    git add .
    
    # Confirmar nova versão no Git
    git commit -m "mensagem do commit"
    
    # Enviar alterações ao GitHub
    git push
    
  2. Fluxo de trabalho (com branch, sem merge):
    
    # Garantir que está no branch master
    git checkout master
    
    # Verificar atualizações no repositório remoto
    git fetch
    
    # Baixar atualizações no branch master local
    git pull
    
    # Trabalhar no projeto no branch master
    
    # Adicionar arquivos ao Git (master)
    git add .
    
    # Confirmar nova versão no branch master
    git commit -m "mensagem do commit no master"
    
    # Enviar alterações do branch master ao GitHub
    git push origin master
    
    # Criar e mudar para novo branch a partir do master
    git checkout -b nome-do-branch
    
    # (opcional) Verificar atualizações no repositório remoto
    git fetch
    # (opcional) Baixar atualizações no novo branch local
    git pull
    
    # Trabalhar no projeto no novo branch
    
    # Adicionar arquivos ao Git (novo branch)
    git add .
    
    # Confirmar nova versão no novo branch
    git commit -m "mensagem do commit no novo branch"
    
    # Enviar novo branch ao GitHub
    git push origin nome-do-branch
    
  3. Fluxo de trabalho (com branch, com merge):
    
    # Garantir que está no branch master
    git checkout master
    
    # Verificar atualizações no repositório remoto
    git fetch
    
    # Baixar atualizações no branch master local
    git pull origin master
    
    # Criar e mudar para novo branch a partir do master
    git checkout -b nome-do-branch
    
    # (opcional) Verificar atualizações no repositório remoto
    git fetch
    
    # (opcional) Baixar atualizações no novo branch local
    git pull origin nome-do-branch
    
    # Trabalhar no projeto no novo branch
    
    # Adicionar arquivos ao Git (novo branch)
    git add .
    
    # Confirmar nova versão no novo branch
    git commit -m "mensagem do commit no novo branch"
    
    # Enviar novo branch ao GitHub
    git push origin nome-do-branch
    
    # Voltar para o branch master
    git checkout master
    
    # (opcional) Verificar atualizações no repositório remoto
    git fetch
    
    # (opcional) Baixar atualizações no branch master local
    git pull origin master
    
    # Fazer merge do novo branch no master
    git merge nome-do-branch
    
    # Enviar master atualizado ao GitHub
    git push origin master
    
    # (opcional) Excluir branch local após merge
    git branch -d nome-do-branch
    
    # (opcional) Excluir branch remoto após merge
    git push origin --delete nome-do-branch
    

Laboratórios práticos (múltiplos usuários):

  1. Fluxo de trabalho (sem branch, sem merge):
    
    # _____ USUÁRIO 1 _____
    # Verificar atualizações no repositório
    git fetch
    
    # Baixar atualizações no repositório local
    git pull
    
    # Trabalhar no projeto
    
    # Adicionar arquivos ao Git
    git add .
    
    # Confirmar nova versão no Git
    git commit -m "mensagem do commit do usuário 1"
    
    # Enviar alterações ao GitHub
    git push
    
    # _____ USUÁRIO 2 _____
    # Verificar atualizações no repositório
    git fetch
    
    # Baixar atualizações no repositório local
    git pull
    
    # Trabalhar no projeto
    
    # Adicionar arquivos ao Git
    git add .
    
    # Confirmar nova versão no Git
    git commit -m "mensagem do commit do usuário 2"
    
    # Enviar alterações ao GitHub
    git push
    
  2. Fluxo de trabalho (com branch, sem merge):
    
    # _____ USUÁRIO 1 (branch master) _____
    # Garantir que está no branch master
    git checkout master
    
    # Verificar atualizações no repositório remoto
    git fetch
    
    # Baixar atualizações no branch master local
    git pull
    
    # Trabalhar no projeto (branch master)
    
    # Adicionar arquivos ao Git
    git add .
    
    # Confirmar nova versão no Git (master)
    git commit -m "commit do usuário 1 no branch master"
    
    # Enviar alterações do branch master ao GitHub
    git push
    
    # _____ USUÁRIO 2 (branch design) _____
    # Garantir que está no branch master
    git checkout master
    
    # Verificar atualizações no repositório remoto
    git fetch
    
    # Baixar atualizações no branch master local
    git pull
    
    # Criar e mudar para branch design
    git checkout -b design
    
    # Trabalhar no projeto (branch design)
    
    # Adicionar arquivos ao Git
    git add .
    
    # Confirmar nova versão no Git (design)
    git commit -m "commit do usuário 2 no branch design"
    
    # Enviar o branch design ao GitHub
    git push origin design
    
    # _____ USUÁRIO 1 (branch master) _____
    # Garantir que está no branch master
    git checkout master
    
    # Verificar atualizações no repositório remoto
    git fetch
    
    # Baixar atualizações no branch master (não recebe design, pois não houve merge)
    git pull
    
    # Trabalhar novamente no projeto (branch master)
    
    # Adicionar arquivos ao Git
    git add .
    
    # Confirmar nova versão no Git (master)
    git commit -m "novo commit do usuário 1 no branch master"
    
    # Enviar alterações do branch master ao GitHub
    git push
    
    
    # _____ USUÁRIO 2 (branch design) _____
    # Garantir que está no branch design
    git checkout design
    
    # Verificar atualizações no repositório remoto
    git fetch
    
    # Baixar atualizações no branch design
    git pull
    
    # Trabalhar novamente no projeto (branch design)
    
    # Adicionar arquivos ao Git
    git add .
    
    # Confirmar nova versão no Git (design)
    git commit -m "novo commit do usuário 2 no branch design"
    
    # Enviar novas alterações do branch design ao GitHub
    git push
    
  3. Fluxo de trabalho (com branch, com merge):
    
    # _____ USUÁRIO 1 (branch master) _____
    # Garantir que está no branch master
    git checkout master
    
    # Verificar atualizações no repositório remoto
    git fetch
    
    # Baixar atualizações no branch master local
    git pull
    
    # Trabalhar no projeto (branch master)
    
    # Adicionar arquivos ao Git
    git add .
    
    # Confirmar nova versão no Git (master)
    git commit -m "commit do usuário 1 no branch master"
    
    # Enviar alterações do branch master ao GitHub
    git push
    
    
    # _____ USUÁRIO 2 (branch design) _____
    # Garantir que está no branch master (base atualizada)
    git checkout master
    
    # Verificar atualizações no repositório remoto
    git fetch
    
    # Baixar atualizações no branch master local
    git pull
    
    # Criar e mudar para o branch design
    git checkout -b design
    
    # Trabalhar no projeto (branch design)
    
    # Adicionar arquivos ao Git
    git add .
    
    # Confirmar nova versão no Git (design)
    git commit -m "commit do usuário 2 no branch design"
    
    # Enviar branch design ao GitHub
    git push origin design
    
    # _____ USUÁRIO 1 (branch master) _____
    # Garantir que está no branch master
    git checkout master
    
    # Verificar atualizações no repositório remoto
    git fetch
    
    # Baixar atualizações no branch master
    git pull
    
    # Trabalhar novamente no projeto (branch master)
    
    # Adicionar arquivos ao Git
    git add .
    
    # Confirmar nova versão no Git (master)
    git commit -m "novo commit do usuário 1 no branch master"
    
    # Enviar alterações do branch master ao GitHub
    git push
    
    
    # _____ USUÁRIO 2 (branch design) _____
    # Garantir que está no branch master
    git checkout master
    
    # Verificar atualizações no repositório remoto
    git fetch
    
    # Baixar atualizações no branch master
    git pull
    
    # Fazer merge do branch design no master
    git merge design
    
    # Enviar master atualizado (com merge) ao GitHub
    git push
    
    
    # _____ USUÁRIO 1 (branch master) _____
    # Garantir que está no branch master
    git checkout master
    
    # Verificar atualizações no repositório remoto
    git fetch
    
    # Baixar atualizações (agora contém merge do design)
    git pull
    
    # Continuar trabalhando no branch master
    
    # Adicionar arquivos ao Git
    git add .
    
    # Confirmar nova versão no Git
    git commit -m "continuação do trabalho do usuário 1 no master"
    
    # Enviar alterações ao GitHub
    git push
    
    
    # _____ USUÁRIO 2 (branch design) _____
    # Garantir que está no branch master
    git checkout master
    
    # Verificar atualizações no repositório remoto
    git fetch
    
    # Baixar atualizações no branch master
    git pull
    
    # (opcional) remover branch design local, pois já foi integrado
    git branch -d design
    
    # (opcional) remover branch design remoto
    git push origin --delete design
    
    # Continuar trabalhando normalmente no branch master
    
    # Adicionar arquivos ao Git
    git add .
    
    # Confirmar nova versão no Git
    git commit -m "continuação do trabalho do usuário 2 no master"
    
    # Enviar alterações ao GitHub
    git push
    
  4. Fluxo de trabalho (com branch, com pull request):
    
    # _____ USUÁRIO 1 (branch master) _____
    # Garantir que está no branch master
    git checkout master
    
    # Verificar atualizações no repositório remoto
    git fetch
    
    # Baixar atualizações no branch master local
    git pull
    
    # Trabalhar no projeto (branch master)
    
    # Adicionar arquivos ao Git
    git add .
    
    # Confirmar nova versão no Git (master)
    git commit -m "commit do usuário 1 no branch master"
    
    # Enviar alterações do branch master ao GitHub
    git push
    
    
    # _____ USUÁRIO 2 (branch design) _____
    # Garantir que está no branch master (base atualizada)
    git checkout master
    
    # Verificar atualizações no repositório remoto
    git fetch
    
    # Baixar atualizações no branch master local
    git pull
    
    # Criar e mudar para branch design
    git checkout -b design
    
    # Trabalhar no projeto (branch design)
    
    # Adicionar arquivos ao Git
    git add .
    
    # Confirmar nova versão no Git (design)
    git commit -m "commit do usuário 2 no branch design"
    
    # Enviar branch design ao GitHub
    git push origin design
    
    
    # _____ USUÁRIO 2 (branch design) _____
    # Criar Pull Request no GitHub:
    # - Abrir repositório no GitHub
    # - Criar Pull Request: base: master, compare: design
    # - Descrever mudanças
    # - Confirmar Pull Request
    
    
    # _____ USUÁRIO 1 (branch master) _____
    # Revisar e fazer merfe do Pull Request no GitHub:
    # - Usuário 1 revisa Pull Request
    # - Resolve comentários, se houver
    # - Clica em "Merge Pull Request"
    # - Confirma merge no branch master
    
    
    # _____ USUÁRIO 1 (branch master) _____
    # Garantir que está no branch master
    git checkout master
    
    # Verificar atualizações no repositório remoto
    git fetch
    
    # Baixar atualizações (agora contém merge do Pull Request)
    git pull
    
    # Continuar trabalhando no branch master
    
    # Adicionar arquivos ao Git
    git add .
    
    # Confirmar nova versão no Git
    git commit -m "continuação do trabalho do usuário 1 no master"
    
    # Enviar alterações ao GitHub
    git push
    
    
    # _____ USUÁRIO 2 (branch design) _____
    # Garantir que está no branch master
    git checkout master
    
    # Verificar atualizações no repositório remoto
    git fetch
    
    # Baixar atualizações (master agora contém código do antigo branch design)
    git pull
    
    # (opcional) remover branch design local
    git branch -d design
    
    # (opcional) remover branch design remoto
    git push origin --delete design
    
    # Continuar trabalhando normalmente no branch master
    
    # Adicionar arquivos ao Git
    git add .
    
    # Confirmar nova versão no Git
    git commit -m "continuação do trabalho do usuário 2 no master"
    
    # Enviar alterações ao GitHub
    git push
    

Elaborado por Mateus Schwede
ubsocial.github.io