LogoLogo
  • Git e GitHub para Humanos
  • Sumário
  • 1. Antes de Começar
    • 1.1 Este livro é para você?
    • 1.2 A razão por trás deste livro
    • 1.3 Visão geral
    • 1.4 Sobre o GitHub
    • 1.5 Sobre a Cumbuca Dev
    • 1.6 O maravilhoso mundo do open source
    • 1.7 Mapa do livro
    • 1.8 Glossário: capítulo 1
  • 2. Fundamentos de Controle de Versão e Git
    • 2.1 Introdução a sistemas de controle de versão
      • 2.1.1 Sistemas de controle de versão centralizados
      • 2.1.2 Sistemas de controle de versão distribuídos
    • 2.2 Introdução ao Git
    • 2.3 Conceitos Fundamentais do Git
      • 2.3.1 Repositório
      • 2.3.2 Commit
      • 2.3.3 Branch
      • 2.3.4 Merge
    • 2.4 Instalando o Git
      • 2.4.1 Instalando no Linux
      • 2.4.2 Instalando no macOS
      • 2.4.3 Instalando no Windows
    • 2.5 Interagindo com o Git
    • 2.6 O Comando Git
    • 2.7 Inicializando de um Repositório Local
    • 2.8 Configurando de um Repositório Local
    • 2.9 Links Úteis: Capítulo 2
    • 2.10 Glossário: Capítulo 2
  • 3. Operações Locais Básicas no Git
    • 3.1 Explorando Operações Locais do Git
    • 3.2 Salvando Alterações Localmente
      • 3.2.1 Adicionando Arquivos ao Controle de Versão via `git add`
      • 3.2.2 Verificando o Estado do Repositório via `git status`
      • 3.2.3 Criando Commits via `git commit`
      • 3.2.4 Visualizando o Histórico do Repositório via `git log`
      • 3.2.5 Comparando Alterações via `git diff`
      • 3.2.6 Unindo os Pontos
      • 3.2.7 Exemplo Prático
    • 3.3 Trabalhando com Branches Localmente
      • 3.3.1 Gerenciando Branches via `git branch`
      • 3.3.2 Alternando Entre Branches via `git switch`
      • 3.3.3 Mesclando Branches via `git merge`
        • 3.3.3.1 Resolvendo Conflitos de Merge
      • 3.3.4 Unindo os Pontos
      • 3.3.5 Exemplo Prático
    • 3.4 Links Úteis: Capítulo 3
    • 3.5 Glossário: Capítulo 3
  • 4. Ajuste de Mudanças Locais no Git
    • 4.1 Desfazendo Alterações Localmente
      • 4.1.1 Desfazendo Alterações Antes do Commit
      • 4.1.2 Desfazendo Commits
      • 4.1.3 Alterando o Último Commit via `git commit --amend`
      • 4.1.4 Unindo os Pontos
      • 4.1.5 Exemplos Práticos
    • 4.2 Ignorando e Removendo Arquivos do Rastreamento Local
      • 4.2.1 Ignorando Arquivos do Rastreamento Utilizando o arquivo .gitignore
      • 4.2.2 Removendo Arquivos do Rastreamento via `git rm`
    • 4.3 Links Úteis: Capítulo 4
    • 4.4 Glossário: Capítulo 4
  • 5. Introdução ao GitHub
    • 5.1 Qual a diferença entre Git e GitHub?
    • 5.2 Grandes Projetos Abertos no GitHub
    • 5.3 Recursos do GitHub
    • 5.4 Idioma Suportado no GitHub
    • 5.5 Contas no GitHub
      • 5.5.1 Conta Pessoal
      • 5.5.2 Conta de Organização
      • 5.5.3 Conta Corporativa
      • 5.5.4 Unindo os Pontos
    • 5.6 Planos do GitHub
    • 5.7 Criando uma Conta Pessoal no GitHub
    • 5.8 Explorando a Interface do GitHub
      • 5.8.1 Página Principal (Home)
      • 5.8.2 Página de Notificações (Notifications)
      • 5.8.3 Página de Configurações (Settings)
    • 5.9 Links Úteis: Capítulo 5
    • 5.10 Glossário: Capítulo 5
  • 6. Repositórios no GitHub
    • 6.1 O quê é um Repositório no GitHub?
    • 6.2 Criando um Repositório no GitHub
    • 6.3 Página Principal de um Repositório: Aba Code
      • 6.3.1 Editando um Arquivo em um Repositório no GitHub
      • 6.3.2 Explorando o Histórico de Commits de um Repositório no GitHub
      • 6.3.3 Editando Detalhes de um Repositório no GitHub
      • 6.3.4 Explorando um Repositório Ativo em Uso
    • 6.4 Página de Configurações de um Repositório: Aba Settings
      • 6.4.1 Gerenciando Configurações Gerais de um Repositório no GitHub: Menu General
      • 6.4.2 Gerenciando Configurações de Colaboração de um Repositório no GitHub: Menu Collaborators
      • 6.4.3 Explorando Configurações de um Repositório no GitHub na Prática
    • 6.5 Links Úteis: Capítulo 6
    • 6.6 Glossário: Capítulo 6
  • 7. Documentação de Projetos
    • 7.1 O quê é Documentação de Projeto?
    • 7.2 Explorando a Linguagem de Marcação Markdown
    • 7.3 Criando uma Página de Apresentação no GitHub
    • 7.4 Links Úteis: Capítulo 7
    • 7.5 Glossário: Capítulo 7
  • 8. Issues no GitHub
    • 8.1 O quê é GitHub Issues?
    • 8.2 Criando uma Issue no GitHub
    • 8.3 Explorando a Página de uma Issue no GitHub
    • 8.4 Atribuindo uma Issue no GitHub
    • 8.5 Categorizando Issues de um Repositório através de Labels no GitHub
      • 8.5.1 Gerenciando Labels de um Repositório no GitHub
    • 8.6 Página de Issues de um Repositório no GitHub: Aba Issues
    • 8.7 Explorando Issues no Mundo Real
    • 8.8 Links Úteis: Capítulo 8
    • 8.9 Glossário: Capítulo 8
  • 9. Git Remoto
    • 9.1 Explorando Operações Remotas do Git
    • 9.2 Interagindo com o Repositório Remoto Central no Git
      • 9.2.1 Clonando um Repositório Remoto via `git clone`
      • 9.2.2 Buscar Atualizações de um Repositório Remoto via `git fetch`
      • 9.2.3 Enviando Mudanças Locais para o Repositório Remoto via `git push`
      • 9.2.4 Sincronizando o Repositório Local com o Remoto via `git pull`
      • 9.2.5 Unindo os Pontos
      • 9.2.6 Exemplo
    • 9.3 Interagindo com o Repositório Remoto hello-world
      • 9.3.1 Conectando-se ao GitHub via SSH
      • 9.3.2 Clonando o Repositório hello-world
      • 9.3.3 Alterando hello-world Localmente
        • 9.3.3.1 Editor de Código
        • 9.3.3.2 Editando README.md
        • 9.3.3.3 Salvando Alterações no Controle de Versão Local
      • 9.3.4 Enviando Alterações para o Repositório Remoto
    • 9.4 Links Úteis: Capítulo 9
    • 9.5 Glossário: Capítulo 9
  • 10. Pull Requests no GitHub
    • 10.1 O quê é um Pull Requests no GitHub?
    • 10.2 Entendendo as Propriedades de um Pull Request no GitHub
      • 10.2.1 Branches de Origem e de Destino de um Pull Request
      • 10.2.2 Título de um Pull Request
      • 10.2.3 Descrição de um Pull Request
      • 10.2.4 Modificações de um Pull Request
      • 10.2.5 Pessoas Revisoras de um Pull Request
      • 10.2.6 Labels de um Pull Request
    • 10.3 Criando um Pull Request no GitHub
    • 10.4 Página de um Pull Request no GitHub
      • 10.4.1 Aba Conversation
      • 10.4.2 Aba Commits
      • 10.4.3 Aba Checks
      • 10.4.4 Aba Files Changed
    • 10.5 Página de Pull Requests de um Repositório no GitHub: Aba Pull Requests
    • 10.6 Recebendo Revisões em um Pull Request no GitHub
      • 10.6.1 Boas Práticas
      • 10.6.2 Exemplo Prático
        • 10.6.2.1 Adicionando Conta Colaboradora
        • 10.6.2.2 Solicitando Revisão de Pull Request
        • 10.6.2.3 Lidando com o Feedback
    • 10.7 Mesclando um Pull Request no GitHub
      • 10.7.1 Exemplo Prático
    • 10.8 Atualizando um Repositório Local Após Mesclagem
    • 10.9 Explorando Pull Requests no Mundo Real
    • 10.10 Links Úteis: Capítulo 10
    • 10.11 Glossário: Capítulo 10
  • 11. Fluxo de Trabalho
    • 11.1 Fork no GitHub
      • Fork
    • 11.2 Forks e Pull Requests
      • 11.2.1 Criando um Fork no GitHub
      • 11.2.2 Clonando um Fork
      • 11.2.3 Realizando Alterações Localmente
      • 11.2.4 Enviando Alterações Locais para o Fork Remoto
      • 11.2.5 Criando um Pull Request a partir de um Fork no GitHub
      • 11.2.6 Sincronizando um Fork no GitHub
      • 11.2.7 Revisão, Mesclagem e Atualizações Pós-mesclagem
    • 11.3 Fluxo de Trabalho
  • 11.4 Links Úteis - Capítulo 11
  • 11.5 Glossário - Capítulo 11
  • 12. O Caminho Continua
    • 12.1 Conhecendo Ferramentas Adicionais
      • 12.1.1 Indicação: Jogo Oh My Git
    • 12.2 Explorando Projetos Open Source
    • 12.3 Crescendo e Colaborando em Comunidades
    • 12.4 Desafio: GitCaos 🔥
    • 12.5 Links Úteis - Capítulo 12
    • 12.6 Glossário Completo: Git e GitHub para Humanos
Fornecido por GitBook
Nesta página
  • A importância de entender os sistemas centralizados
  • Como funcionam
  • Conceitos básicos de controle de versão centralizado
  • Repositório remoto central
  • Checkout
  • Pull
  • Push
  • Lock
  • Merge
  • Exemplo de fluxo de trabalho

Isto foi útil?

Editar no GitHub
Exportar como PDF
  1. 2. Fundamentos de Controle de Versão e Git
  2. 2.1 Introdução a sistemas de controle de versão

2.1.1 Sistemas de controle de versão centralizados

O quê são sistemas de controle de versão centralizados e distribuídos e quais são as suas diferenças

Anterior2.1 Introdução a sistemas de controle de versãoPróximo2.1.2 Sistemas de controle de versão distribuídos

Atualizado há 5 dias

Isto foi útil?

A importância de entender os sistemas centralizados

O Git, sistema de controle de versão que vamos estudar neste livro, é um sistema distribuído. Mas, antes de irmos direto para esse modelo mais moderno, é importante entender como os sistemas centralizados funcionavam — e por que eles motivaram a criação de algo novo.

Mesmo que você não vá usar um sistema centralizado na prática, entender como ele funciona ajuda a compreender melhor o Git. Muitas decisões do Git fazem mais sentido quando conhecemos os problemas que ele veio resolver.

Em algum momento, você provavelmente vai se perguntar: “Mas por que o Git faz isso desse jeito tão complicado?”. Com esse contexto, o que parece esquisito no começo passa a fazer sentido — e você percebe que existe uma lógica por trás de tudo.

No mais, não se preocupe em entender especificidades dos sistemas centralizados. O foco deste livro é o modelo distribuído — e é nele que vamos mergulhar de verdade ao longo dos próximos capítulos.

Como funcionam

Imagine que você e outras pessoas estão colaborando em um projeto. Para manter tudo organizado, vocês combinam de guardar os arquivos em um lugar compartilhado. Criam, então, uma pasta especial que reúne todos os arquivos do projeto e registra o histórico completo de alterações: o que foi mudado, por quem, quando e por quê. É como ter uma linha do tempo detalhada de tudo que já aconteceu no projeto.

Mas como várias pessoas poderiam colaborar ao mesmo tempo? Essa pasta poderia ficar em outro computador — um servidor — que funcionaria como o ponto central do projeto. Assim, todo mundo poderia acessar e contribuir, sem precisar estar no mesmo lugar ou usar o mesmo computador.

IMAGEM

Cada pessoa que quisesse colaborar com o projeto poderia baixar para o seu computador a versão mais recente de cada arquivo.

IMAGEM

Depois, faria as alterações necessárias localmente e, em seguida, enviaria de volta apenas o que tivesse mudado — os arquivos modificados, adicionados ou removidos. Os arquivos que permanecessem iguais não precisariam ser reenviados.

Parece que funcionaria bem! Mas... e se mais de uma pessoa quiser editar o mesmo arquivo ao mesmo tempo? Aí a coisa complica, né?

Para lidar com isso, vocês poderiam adotar uma estratégia de bloqueio. Quando alguém começa a editar um arquivo, avisa que ele está bloqueado, impedindo que outras pessoas façam alterações até que o bloqueio seja liberado. Esta estratégia era utilizada em um controle de versão chamado Microsoft Visual SourceSafe, que, aliás, tinha muitos problemas exatamente por este mecanismo.

Outra possibilidade seria permitir que todo mundo edite livremente. Depois, quando as alterações fossem reunidas novamente na pasta compartilhada, alguém precisaria comparar o que mudou e tentar mesclar os conteúdos. Se duas pessoas tivessem mexido na mesma parte de um arquivo, isso poderia gerar conflitos — e aí alguém teria que resolvê-los manualmente.

Esse é exatamente o funcionamento de um sistema de controle de versão centralizado. Agora que a ideia geral está clara, vamos ver como isso tudo é chamado na prática — os nomes e termos usados pra descrever essas partes e ações no jeito como o sistema foi pensado.

Conceitos básicos de controle de versão centralizado

Agora que já vimos como funciona, de forma geral, um sistema de controle de versão centralizado, vamos conhecer alguns dos termos mais usados nesse modelo.

Logo depois dessa explicação, vamos ver um exemplo prático de uso, que vai ajudar a entender melhor como tudo isso acontece na prática.

Repositório remoto central

É uma pasta onde ficam guardados todos os arquivos do projeto e o histórico completo das versões. E é chamado de remoto porque geralmente essa pasta não está no seu computador, mas sim em outro — um servidor — acessado pela internet. E é chamado de central porque é o ponto principal de encontro: todas as pessoas colaboradoras acessam essa mesma pasta para enviar e receber alterações.

Checkout

É o processo de obter uma cópia de trabalho do projeto a partir do repositório central. Essa cópia traz apenas os arquivos mais atuais — ou seja, a versão mais recente de cada um. O histórico completo não fica salvo localmente: ele continua no servidor. Por isso, qualquer consulta ao passado ou envio de mudanças depende de uma conexão com o repositório central.

Pull

É o processo de atualizar a cópia local do projeto com as alterações mais recentes que foram enviadas ao repositório central. É uma forma de manter o ambiente de trabalho sincronizado com o que outras pessoas já modificaram.

Push

É o processo de enviar as mudanças feitas localmente — arquivos adicionados, modificados ou removidos — de volta para o repositório central. Isso permite que outras pessoas também tenham acesso a essas alterações.

Lock

É uma estratégia usada para evitar conflitos: ao editar um arquivo, a pessoa sinaliza que ele está “travado” para alterações por outras pessoas. O sistema, então, garante que apenas uma pessoa faça mudanças naquele arquivo por vez, reduzindo o risco de sobrescrever o trabalho de alguém.

Merge

É o processo de combinar ("mesclar") alterações feitas por pessoas diferentes que editaram o mesmo arquivo. Se cada uma modificou partes diferentes do conteúdo, as mudanças costumam ser integradas automaticamente. Mas, se duas pessoas alteraram a mesma parte do arquivo, ocorre um conflito — e alguém precisa revisar essas alterações para decidir qual versão deve ser mantida.

Exemplo de fluxo de trabalho

Uma pessoa A e uma pessoa B decidem criar um blog. A pessoa A cria uma estrutura inicial do blog em seu computador e envia ("PUSH") essa versão para o repositório central.

A pessoa B se anima com o projeto e também quer contribuir, criando o seu primeiro blog post. Para isso, B precisa ter acesso à versão criada por A, que já está no repositório central no momento. B precisa fazer um "PULL", que nada mais é que fazer uma cópia da última versão do projeto que está no repositório central para a sua máquina local.

Agora, B tem acesso, em seu computador, ao projeto em sua versão mais atual. B escreve seu primeiro blog post e precisa enviar as mudanças de volta para o repositório central, para que A também possa ver o seu belo trabalho. B faz um "PUSH" do seu código, ou seja, envia uma cópia da sua versão para o repositório central.

Tudo pronto! Temos no repositório central a versão mais recente do blog, a qual contém o post de B. A versão inicial de A também está lá, guardada caso alguém precise consultá-la para comparar diferenças, ou até mesmo para reverter alguma alteração.

Mas, e se A também estiver empolgado e não conseguir esperar por B? Ao mesmo tempo que B, A começa a escrever seu próprio post. Quando A tenta enviar seu código para o repositório central, percebe que B já enviou antes a sua versão.

E para piorar, A e B modificaram o mesmo arquivo! E agora?

Bom, é aí que entra em jogo umas das principais funcionalidades de um sistema de controle de versão: o auxílio no Gerenciamento de Conflitos. O sistema lida com as mudanças feitas por diferentes colaboradores no mesmo arquivo, evitando conflitos e garantindo uma integração suave das alterações. Isso é feito por meio de um processo chamado 'mesclagem', que combina o trabalho de todos de forma harmoniosa e mantém a consistência do projeto.

Dessa forma, A consegue tranquilamente enviar suas modificações sem comprometer em nada as mudanças feitas por B.


Exemplos de sistemas centralizados de controle de versão incluem o Subversion (SVN) e o Microsoft Team Foundation Version Control (TFVC). Embora os sistemas centralizados tenham sido amplamente utilizados no passado, muitas equipes estão migrando para sistemas de controle de versão distribuídos, como o Git, devido à sua flexibilidade, desempenho e recursos avançados que iremos começar a desvendar aos poucos daqui para frente.

Grande pasta que contém os arquivos e suas versões
Servidor: onde a "Grande Pasta" fica localizada
Usuário 2 fazendo a cópia atualizada do Repositório Central do Servidor
Mapa do funcionamento de um Sistema de Controle de Versão Centralizado