-
1. Primeiros Passos
- 1.1 Sobre Controle de Versão
- 1.2 Uma Breve História do Git
- 1.3 O que é Git?
- 1.4 A Linha de Comando
- 1.5 Instalando o Git
- 1.6 Configuração inicial do Git
- 1.7 Obtendo Ajuda
- 1.8 Resumo
-
2. Fundamentos do Git
-
3. Ramificação (Branching) no Git
-
4. Git no Servidor
- 4.1 Os Protocolos
- 4.2 Colocando o Git em um Servidor
- 4.3 Gerando a sua Chave Pública SSH
- 4.4 Configurando o Servidor
- 4.5 Git Daemon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Opções de Hospedagem de Terceiros
- 4.10 Resumo
-
5. Git Distribuído
-
6. GitHub
-
7. Ferramentas do Git
- 7.1 Seleção de Revisão
- 7.2 Área de Stage Interativa
- 7.3 Fazendo Stash e Limpando
- 7.4 Assinando Seu Trabalho
- 7.5 Pesquisando (Searching)
- 7.6 Reescrevendo o Histórico
- 7.7 Reset Desmistificado
- 7.8 Merging Avançado
- 7.9 Rerere
- 7.10 Depurando com Git
- 7.11 Submódulos
- 7.12 Empacotando (Bundling)
- 7.13 Substituir (Replace)
- 7.14 Armazenamento de Credenciais
- 7.15 Resumo
-
8. Customizando o Git
- 8.1 Configuração do Git
- 8.2 Atributos do Git
- 8.3 Hooks do Git
- 8.4 Uma Política de Exemplo Imposta pelo Git
- 8.5 Resumo
-
9. Git e Outros Sistemas
- 9.1 Git como Cliente
- 9.2 Migrando para o Git
- 9.3 Resumo
-
10. Git Internals (Por Dentro do Git)
- 10.1 Encanamento e Porcelana (Plumbing and Porcelain)
- 10.2 Objetos do Git
- 10.3 Referências do Git
- 10.4 Arquivos de pacote (Packfiles)
- 10.5 Refspec
- 10.6 Protocolos de Transferência
- 10.7 Manutenção e Recuperação de Dados
- 10.8 Variáveis de Ambiente
- 10.9 Resumo
-
A1. Appendix A: O Git em Outros Ambientes
- A1.1 Interfaces Gráficas
- A1.2 Git no Visual Studio
- A1.3 Git no Visual Studio Code
- A1.4 Git no IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine
- A1.5 Git no Sublime Text
- A1.6 Git no Bash
- A1.7 Git no Zsh
- A1.8 Git no PowerShell
- A1.9 Resumo
-
A2. Appendix B: Incorporando o Git nos seus Aplicativos
- A2.1 Linha de Comando do Git
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Appendix C: Comandos do Git
- A3.1 Configuração e Ajustes
- A3.2 Obtendo e Criando Projetos
- A3.3 Snapshots Básicos
- A3.4 Branches e Merges
- A3.5 Compartilhando e Atualizando Projetos
- A3.6 Inspeção e Comparação
- A3.7 Depuração
- A3.8 Patches
- A3.9 E-mail
- A3.10 Sistemas Externos
- A3.11 Administração
- A3.12 Comandos de Encanamento
1.3 Primeiros Passos - O que é Git?
O que é Git?
Então, o que é o Git em poucas palavras? Esta é uma seção importante para absorver, porque se você entender o que o Git é e os fundamentos de como ele funciona, então usar o Git de forma eficaz provavelmente será muito mais fácil para você. À medida que você aprende o Git, tente limpar a mente das coisas que você talvez saiba sobre outros VCSs, como CVS, Subversion ou Perforce — fazer isso o ajudará a evitar confusões sutis ao usar a ferramenta. Mesmo que a interface de usuário do Git seja bastante semelhante a esses outros VCSs, o Git armazena e pensa sobre as informações de uma maneira muito diferente, e entender essas diferenças o ajudará a evitar ficar confuso ao usá-lo.
Snapshots, não diferenças
A principal diferença entre o Git e qualquer outro VCS (Subversion e amigos incluídos) é a maneira como o Git pensa sobre seus dados. Conceitualmente, a maioria dos outros sistemas armazena informações como uma lista de alterações baseadas em arquivos. Esses outros sistemas (CVS, Subversion, Perforce e assim por diante) pensam nas informações que armazenam como um conjunto de arquivos e as alterações feitas em cada arquivo ao longo do tempo (isso é comumente descrito como controle de versão baseado em delta).
O Git não pensa ou armazena seus dados dessa maneira. Em vez disso, o Git pensa em seus dados mais como uma série de snapshots de um sistema de arquivos em miniatura. Com o Git, toda vez que você faz um commit, ou salva o estado do seu projeto, o Git basicamente tira uma foto de como todos os seus arquivos se parecem naquele momento e armazena uma referência para esse snapshot. Para ser eficiente, se os arquivos não mudaram, o Git não armazena o arquivo novamente, apenas um link para o arquivo idêntico anterior que ele já armazenou. O Git pensa em seus dados mais como um fluxo de snapshots.
Esta é uma distinção importante entre o Git e quase todos os outros VCSs. Isso faz com que o Git reconsidere quase todos os aspectos do controle de versão que a maioria dos outros sistemas copiou da geração anterior. Isso torna o Git mais como um mini sistema de arquivos com algumas ferramentas incrivelmente poderosas construídas sobre ele, em vez de simplesmente um VCS. Exploraremos alguns dos benefícios que você ganha ao pensar em seus dados dessa maneira quando abordarmos o branching do Git em Ramificação (Branching) no Git.
Quase toda operação é local
A maioria das operações no Git precisa apenas de arquivos e recursos locais para operar — geralmente nenhuma informação de outro computador na sua rede é necessária. Se você está acostumado a um CVCS em que a maioria das operações tem aquele custo adicional de latência de rede, esse aspecto do Git fará você pensar que os deuses da velocidade abençoaram o Git com poderes de outro mundo. Como você tem todo o histórico do projeto bem ali no seu disco local, a maioria das operações parece quase instantânea.
Por exemplo, para navegar no histórico do projeto, o Git não precisa ir ao servidor para obter o histórico e exibi-lo para você — ele simplesmente o lê direto do seu banco de dados local. Isso significa que você vê o histórico do projeto quase instantaneamente. Se você quiser ver as alterações introduzidas entre a versão atual de um arquivo e o arquivo há um mês, o Git pode consultar o arquivo de um mês atrás e fazer um cálculo de diferença local, em vez de ter que pedir a um servidor remoto para fazer isso ou extrair uma versão mais antiga do arquivo do servidor remoto para fazê-lo localmente.
Isso também significa que há muito pouco que você não pode fazer se estiver offline ou fora da VPN. Se você entrar em um avião ou trem e quiser trabalhar um pouco, pode fazer commits alegremente (na sua cópia local, lembra?) até chegar a uma conexão de rede para fazer o upload. Se você for para casa e não conseguir fazer o seu cliente VPN funcionar corretamente, você ainda pode trabalhar. Em muitos outros sistemas, fazer isso é impossível ou doloroso. No Perforce, por exemplo, você não pode fazer muita coisa quando não está conectado ao servidor; no Subversion e CVS, você pode editar arquivos, mas não pode fazer commit das alterações no seu banco de dados (porque o seu banco de dados está offline). Isso pode não parecer grande coisa, mas você pode se surpreender com a grande diferença que isso pode fazer.
O Git tem integridade
Tudo no Git é verificado por soma de verificação (checksummed) antes de ser armazenado e é então referido por essa soma de verificação. Isso significa que é impossível alterar o conteúdo de qualquer arquivo ou diretório sem que o Git saiba disso. Essa funcionalidade é incorporada ao Git nos níveis mais baixos e é essencial à sua filosofia. Você não pode perder informações em trânsito ou sofrer corrupção de arquivos sem que o Git seja capaz de detectar isso.
O mecanismo que o Git usa para essa soma de verificação é chamado de hash SHA-1. Esta é uma string de 40 caracteres composta por caracteres hexadecimais (0–9 e a–f) e calculada com base no conteúdo de um arquivo ou estrutura de diretórios no Git. Um hash SHA-1 se parece com isto:
24b9da6552252987aa493b52f8696cd6d3b00373
Você verá esses valores de hash em todos os lugares no Git porque ele os usa muito. Na verdade, o Git armazena tudo em seu banco de dados não pelo nome do arquivo, mas pelo valor de hash do seu conteúdo.
O Git geralmente apenas adiciona dados
Quando você executa ações no Git, quase todas elas apenas adicionam dados ao banco de dados do Git. É difícil fazer o sistema fazer qualquer coisa que não seja desfazível ou fazê-lo apagar dados de alguma forma. Como com qualquer VCS, você pode perder ou bagunçar alterações que ainda não commitou, mas depois que você faz o commit de um snapshot no Git, é muito difícil perdê-lo, especialmente se você envia (push) regularmente o seu banco de dados para outro repositório.
Isso faz com que usar o Git seja uma alegria, porque sabemos que podemos experimentar sem o perigo de estragar as coisas gravemente. Para uma visão mais aprofundada de como o Git armazena seus dados e como você pode recuperar dados que parecem perdidos, veja Desfazendo Coisas.
Os Três Estados
Preste atenção agora — aqui está a principal coisa a lembrar sobre o Git se você quiser que o resto do seu processo de aprendizado ocorra sem problemas. O Git tem três estados principais nos quais seus arquivos podem residir: modificado, preparado e commitado:
-
Modificado significa que você alterou o arquivo, mas ainda não o commitou em seu banco de dados.
-
Preparado significa que você marcou um arquivo modificado em sua versão atual para entrar em seu próximo snapshot de commit.
-
Commitado significa que os dados estão armazenados com segurança em seu banco de dados local.
Isso nos leva às três seções principais de um projeto Git: a árvore de trabalho, a área de preparação e o diretório Git.
A árvore de trabalho é um único checkout de uma versão do projeto. Esses arquivos são retirados do banco de dados compactado no diretório Git e colocados no disco para você usar ou modificar.
A área de preparação é um arquivo, geralmente contido no seu diretório Git, que armazena informações sobre o que irá para o seu próximo commit. Seu nome técnico no jargão do Git é o “index”, mas a frase “área de preparação” funciona da mesma forma.
O diretório Git é onde o Git armazena os metadados e o banco de dados de objetos para o seu projeto. Esta é a parte mais importante do Git e é o que é copiado quando você clona um repositório de outro computador.
O fluxo de trabalho básico do Git é mais ou menos assim:
-
Você modifica arquivos na sua árvore de trabalho.
-
Você prepara (stage) seletivamente apenas as alterações que deseja que façam parte do seu próximo commit, o que adiciona apenas essas alterações à área de preparação.
-
Você faz um commit, o que pega os arquivos como eles estão na área de preparação e armazena esse snapshot permanentemente no seu diretório Git.
Se uma versão particular de um arquivo está no diretório Git, ela é considerada commitada. Se ela foi modificada e foi adicionada à área de preparação, ela está preparada. E se ela foi alterada desde o checkout, mas não foi preparada, ela está modificada. No Fundamentos do Git, você aprenderá mais sobre esses estados e como você pode tirar vantagem deles ou pular a parte preparada inteiramente.