Introdução ao Git e GitHub

Git

Controle de versão

O que é?

Um sistema de controle de versão ou Version Control System (VCS) é um programa que possui como objetivo controlar as versões de um projeto.

Um pouco de história...

Antigamente, um projeto era hospedado em apenas um servidor local, correndo o risco de se caso o servidor der algum problema, todo o projeto seria perdido. Com o Git, as cópias do projeto são clonadas localmente na máquina de cada desenvolvedor.

O que é Git?

O Git é um sistema de controle de versão distribuído que permite que desenvolvedores rastreiem mudanças em arquivos e colaborem em projetos de software. Ele foi criado por Linus Torvalds em 2005 para ajudar no desenvolvimento do kernel do Linux. O Git permite que múltiplos desenvolvedores trabalhem simultaneamente em um projeto, mantendo um histórico completo de todas as alterações feitas.

A documentação oficial do Git pode ser encontrada aqui.

Termos comuns

Alguns termos que são usados comumente no Git:

  • Working Tree ou Árvore de Trabalho: Diretórios e arquivos que contém o projeto que está sendo trabalhado/desenvolvido no momento.
  • Repositório (repo) O diretório ou a pasta localizado no topo da árvore de trabalho e é onde o Git guarda todo o histórico do proketo. Basicamente a pasta principal do projeto. Um bare repository é um repositório que não faz parte de uma árvore de trabalho e é usado para compartilhamento ou backup e é geralmente salvo com a extensão .git
  • Hash: É uma função que retorna um número e que representa os conteúdos de um arquivo. Como se fosse um ID.
  • Commit: A tradução pode ser como comprometer-se ou entregar. No Git, siginifica pulblicar ou enviar alguma coissa ou mudança para que os outros possam ver.
  • Branch: Significa ramificação e no Git, representa uma série ou um ramo com vários commits. O commit mais recente em uma branch é chamado de Head e a branch padrão/principal é chamada de main ou master. O head ou o commit mais recente da branch que você está atual é chamado de HEAD.
  • Remoto: Um remoto é uma referência a um repositório Git. É como se tivesse um repositório remoto e outro local. O nome padrão é origin.

Git vs GitHub

Git é um sistema de controle de versão distribuído (Distributed Version Control System (DVCS)).

GitHub é uma plataforma em nuvem que hospeda os repositórios Git.

Comandos

  • Login: Obrigatório para poder enviar as alterações para o GitHub.

    git config --global user.name "Seu Nome"

    git config --global user.email "seu.email@example.com"

  • Verificar versão: Exibe a versão do Git instalada.

    git --version

  • Listar configurações globais:

    git config --list

  • Inicializar um repositório Git: Caso você já tenha uma pasta no seu pc e queira transformar ela em um repositório Git.

    git init -b main

    //inicia e cria uma branch chamada main

  • Verificar status da árvore de trabalho:

    git status

  • Ajuda: Lista todos os comandos git e dá uma breve explicação do que cada um faz.

    git help

    // ou

    git "comando" help

    // mostra ajuda sobre o comando em específico

  • Preparar alterações para serem commitadas:Adiciona/rastreia um ou mais arquivos para serem preparados para o commit.

    git add "nome-do-arquivo"

    // adiciona um arquivo específico

    git add .

    // adiciona todos os arquivos modificados

  • Fazer um commit: Salva as alterações feitas no repositório local.

    git commit -m "mensagem-descritiva"

    // faz o commit com uma mensagem descritiva

  • Ver logs:

    git log

    // mostra o histórico de commits

  • Ver o histórico de commits de um arquivo em específico:

    git blame "nome-do-arquivo"

    // mostra o histórico de commits do arquivo especificado, com hora, data e autor de cada linha

GitHub

O GitHub é uma plataforma de hospedagem de código-fonte e controle de versão que utiliza o Git como sistema de controle de versão. Ele permite que desenvolvedores colaborem em projetos, compartilhem código e gerenciem versões de software de forma eficiente.

O site oficial do GitHub pode ser encontrado aqui.

Veremos a partir de agora as funcionalidades principais do GitHub.

Repositórios

Um repositório contém todos os arquivos do seu projeto com cada alteração e histórico de versões.

Possui três tipos:

  • Público (qualquer um tem acesso)
  • Privado (só você tem acesso)
  • Interno (visível para apenas os membros da empresa/organização)

Como clonar um repositório

      No seu repositório GitHub, tem um botão chamativo escrito Code.
      Página inicial de um repositório no GitHub com o botão 'Code' destacado.
      Página inicial de um repositório no GitHub com o botão "Code" destacado.
      Ao apertar nele, irá ser mostrado um link que você precisa copiar.
      Link para clonar um repositório no GitHub destacado.
      Link para clonar um repositório no GitHub destacado.
      No seu terminal, na pasta onde você quer salvar o seu clone, digite assim:

      git clone "url-copiada"

      // e depois:

      cd "nome_do_repositorio"

Gists

Gists é uma funcionalidade do GitHub que permite aos usuários compartilhar trechos de códigos, notas ou outras informações menores que são compartilhados em um grupo pequeno.

Geralmente são usados para compartilhar exemplos de códigos ou soluções, guardar configurações ou scripts de uso pessoal, guardar templates de algo, compartilhar logs e compartilhar trechos de código em blogs, foruns, etc.

OBS.: Os Gists não são totalmente privados, mesmo os secretos podem ser acessados por quem tem o link.

Para clonar um Gist, é praticamente a mesma coisa de clonar um repositório comum.

Página inicial do gists.github.com
Página inicial do gists.github.com

Wiki

Wiki são como se fosse uma documentação de algo. Geralmente uma wiki serve para documentar as informações detalhadas do projeto, enquanto que um README seria uma leitura mais rápida e direta sobre o projeto. É praticamente a Wikipédia daquele projeto.

Página inicial da Wiki do repositório do VsCode no GitHub
Página inicial da Wiki do repositório do VsCode no GitHub

Preview de uma nova feature

São funcionalidades novas que ainda estão em desenvolvimento que podem ser habilitadas caso você queira testar. É interessante dar uma olhada pois o GitHub adiciona novas funcionalidades frequentemente.

Pull Requests

Uma pull request ou PR é uma funcionalidade que permite que commits enviados por outra pessoa sejam mesclados na branch principal do projeto.

É como se fosse um fórum que a pessoa manda a alteração e fala o que fez e porque essa alteração deve ser adicionada. O administrador do repositório pode olhar isso e analisar se deve aceitar as alterações que a pessoa fez ou não.

Exemplo de uma pull request no GitHub
Exemplo de uma pull request no GitHub.

Uma solicitação de pull (PR) compara alterações entre dois branches:

  • Comparar é a branch das alterações.
  • Base ou Main é pra onde essas alterações vão.

Mesclar um PR

Existem 3 opções ao você mesclar uma branch:

  • Create a merge commit/Criar um commit de mesclagem: É a função padrão onde todas as modificações são mescladas e é criado um commit dizendo que foi mesclado.
  • Sqaush and merge/Esmagar e mesclar: Todas as modificações são mescladas mas é criado apenas um commit com todas as alterações juntas.
  • Rebase and merge/Rebase e mesclar: As modificações são mescladas mas os commits são reaplicados na branch base, criando um histórico linear.

Issues

Uma issue é usada para rastrear ideias, feedbacks, tarefas ou bugs/poblemas envolvendo seu trabalho no GitHub. Como se fosse um fórum onde você pode expor algo relacionado ao projeto. Diferente de uma PR, uma issue apenas expoe e o erro, ou o feed back sem modificar diretamente o código.

Exemplo de uma issue no GitHub
Exemplo de uma issue no GitHub.

Discussões

Tem assuntos que são grandes demais para serem colocados em uma issue, por isso existem as discussões, onde você pode conversar com as pessoas sobre diversos assuntos como se fosse um Reddit. No seu repositório, você pode habilitar as discussões ou não.

Exemplo de uma página inicial de discussão no GitHub (GitHub Community)
Exemplo de uma página inicial de discussão no GitHub (GitHub Community).

Cada discussão pode ser atribuída à uma categoria, entre elas:

  • Anúncios: Atualizações e novidades sobre o projeto.
  • Geral: Tudo relacionado e relevante para o projeto.
  • Ideias: Sugestões e ideias para melhorar o projeto.
  • Polls: Votações.
  • Q&A: Perguntas e respostas para a comunidade responder.
  • Show and tell: Criações, experimentos ou testes relevantes para o projeto.

Os administradores do repositorio podem administrar as disussões e podem fixar as discussões importantes no topo. Também podem marcar perguntas que foram feitas pela couminidade como respondidas.

Uma discussão também pode ser convertida para uma issue.

Fluxo de trabalho do GitHub

O GitHub possui um fluxo de trabalho. Ele se baseia diretamente nas funcionalidades essenciais do Git.

Diagrama do fluxo de trabalho do GitHub
Diagrama do fluxo de trabalho do GitHub.

Estados de um arquivo

Um arquivo pode ter diferentes estados:

  • Untracked ou não rastreado: Estado inicial do arquivo quando ele ainda não foi preparado para nada. Basicamente o Git não vê ele e não sabe de sua existência.
  • Tracked ou rastreado: Um arquivo rastreado é quando o Git percebe ele e agora está monitorando/rastreando esse arquivo.
  • Unmodified ou não modificado: O arquivo está sendo rastreado mas desde o último commit não teve nenhuma alteração.
  • Modified ou modificado: Em relação ao último commit, esse arquivo foi modificado mas as suas alterações ainda não foram rastreadas.
  • Staged ou preparado: O arquivo foi modificado e as alterações foram adicionadas na área de preparação e essas alterações estão prontas para serem commitadas.
  • Committed: O arquivo está na database do repositório e representa a última versão commitada do arquivo no momento.

Fluxo de trabalho do Git

É um modelo de fluxo de trabalho que é usado principalmente em projetos grandes, demorados e que envolve muitos desenvolvedores. O fluxo interno de desenvolvimento contém várias branches de desenvolvimento e uma principal (main ou master).

Diagrama do fluxo de trabalho do Git
Diagrama do fluxo de trabalho do Git.
  • master ou main: Sempre reflete na versão final/completa do projeto (v. 1.0; v. 2.0; etc)
  • develop: Branch onde o desenvolvimento ativo acontece. A branch principal é atualizada a partir dessa branch.
  • feature/"nome_feature": Usada para criar novas funcionalidades e é clonada/derivada da branch develop e é mesclada a ela quando é finalizada.
  • release/"nome_versao": Usada para preparar uma nova versão de produção. É derivada da branch develop e, após os ajustes finais, é mesclada nas branches main e develop.
  • hotfix/"nome_versao": Usada rapidamente para corrigir bugs críticos em produção. É derivada da branch main e, após a correção, é mesclada nas branches main e develop.

GitHub Pages

É um serviço que é usado para publicar e hospedar seu reposiório e transformá-lo em um website estático usando HTML, CSS e JavaScript.

OBS: Só são suportados HTML, CSS e JavaScript. Qualquer outro front ou back end como Python, Django, SQL não vao ser hospedados no GitHub Pages.

Configurações do GitHub Pages
Configurações do GitHub Pages.

Como criar um site com o seu repositório e hospedar no GitHub Pages

O Jekyll é um gerador de site estático que o GitHub usa para criar um site com base no conteúdo do seu repositório.

Configurações do tema do GitHub Pages
Configurações do tema do GitHub Pages.

Front matter YAML

Esse termo se refere aos metadados YAML que precedem o conteúdo de um arquivo. Para o Jekyll, essas dados incluem instruções para indicar o estilo do layout de uma página markdown. Também pode incluir dados da página como o título, variáveis, etc.

Para personalizar o site, é preciso editar o arquivo _config.yml. Saiba mais.

Editando

O Jekyll dá suporte à linguagem do modelo Liquid, ou seja, é possível adicionar variáveis e fluxos de lógica (if, for, while) dentro do markdown/html:

Exemplo de um looping for:

Exemplo de um looping for em Liquid
Exemplo de um looping for em Liquid

Nesse artigo mostra mais infomações de como adicionar conteúdo ao seu site usando o Jekyll.

Pesquisa do GitHub

A barra de pesquisa do GitHub possui diversos métodos para pesquisar sobre algo. Você pode pesquisar dentro de um repositório em especifico ou procurar em todo o GitHub. Os resultados abrangem tudo, incluindo código, issues, marketplace, usuários, etc.

É possível colocar alguns filtros na hora da pesquisa, como esses:

Exemplo de filtros de pesquisa no GitHub
Exemplo de filtros de pesquisa no GitHub.

Para mais ajuda de como pesquisar coisas específicas com filtros, este artigo fala mais sobre.

Caso você queira uma coisa mais específica e mais complexa, pode usar a pesquisa avançada do GitHub.

Marcos/milestones e rótulos/labels

Os marcos permitem agrupar issues e PRs em uma categoria.

  • Os marcos podem ser ordenados (assim como os projetos), facilitando as prioridades e a visualização de quais marcos são mais importantes.
  • Acompanhamento automático do progresso de cada etapa, mostrando quantas questões ou pRs estão concluidas e etc.
  • Acompanhar o trabalho que entra das versões ou fases do projeto

Você pode atribuir um rótulo à uma Issue ou PR e é útil na hora da pesquisa:

is:open is:issue label:"bug"

// mostra todas as issues abertas com o rótulo bug