1.1 - Mantendo o histórico do código
1.2 - Trabalhando em equipe
1.3 - Sistemas de controle de versão
1.4 - Controle de versão rápido e confiável com Git
1.5 - Hospedando código no GitHub
1.6 - O processo de escrita desse livro
2 - Tour prático
2.1 - Instalando e configurando o Git
2.2 - Criando um arquivo texto para versionarmos
2.3 - Versionando seu código com Git
2.4 - Compartilhando seu código através do GitHub
3 - Trabalhando com repositório local
3.1 - Criando um repositório local
3.2 - Rastreando arquivos
3.3 - Gravando arquivos no repositório
3.4 - Verificando o histórico do seu repositório
3.5 - Verificando mudanças nos arquivos rastreados
3.6 - Removendo arquivos do repositório
3.7 - Renomeando e movendo arquivos
3.8 - Desfazendo mudanças
4 - Trabalhando com repositório remoto
4.1 - Repositório remoto
4.2 - Adicionando o repositório remoto
4.3 - Enviando commits para o repositório remoto
4.4 - Clonando o repositório remoto
4.5 - Sincronizando o repositório local
4.6 - Protocolos suportados pelo Git
5 - Hospedando o repositório no GitHub
5.1 - Serviços de hospedagem de projetos
5.2 - GitHub: a rede social dos desenvolvedores
5.3 - Encontrando projetos e visualizando o código-fonte
5.4 - Criando um usuário no GitHub
5.5 - Criando o repositório do projeto
5.6 - Enviando os commits do projeto para o GitHub
5.7 - Clonando o repositório hospedado no GitHub
5.8 - Colaborando com projetos open source
6 - Organizando o trabalho com branches
6.1 - A branch master
6.2 - Criando uma branch
6.3 - Trocando de branch
6.4 - Deletando uma branch
6.5 - Comitando código em uma nova branch
6.6 - Voltando para o master e fazendo uma alteração
6.7 - Mesclando alterações
7 - Trabalhando em equipe com branches remotas
7.1 - Branches remotas
7.2 - Compartilhando branches
7.3 - Obtendo novas branches remotas em outros repositórios
7.4 - Enviando commits para o repositório central
7.5 - Obtendo commits de uma branch remota
7.6 - Mesclando branches remotas e locais
7.7 - Deletando branches remotas
8 - Controlando versões do código com tags
8.1 - Criando, listando e deletando tags
8.2 - Mais informações com tags anotadas
8.3 - Compartilhando tags com a sua equipe
9 - Lidando com conflitos
9.1 - Mesclando mudanças em um mesmo arquivo sem conflitos
9.2 - Conflitos após um merge com mudanças em um mesmo arquivo
9.3 - Resolvendo conflitos após um rebase
9.4 - Usando uma ferramenta para resolver conflitos
10 - Maneiras de trabalhar com Git
10.1 - Utilizando só a branch master com um repositório central
10.2 - Utilizando branches por funcionalidade com um repositório central
10.3 - Utilizando branches por etapa de desenvolvimento com um repositório central
10.4 - Colaborando com projetos open source com Fork e Pull Request
10.5 - Organizando projetos open source gigantescos com Ditador e Tenentes
11 - Apêndice ─ GitHub no Windows
11.1 - Instalando o GitHub for Windows
11.2 - Criando um novo repositório
11.3 - Efetuando commits no repositório
11.4 - Detalhando os commits
11.5 - Enviando o repositório para o GitHub
11.6 - Trabalhando com branches
Vida de programador não é fácil. Há sempre uma pressão por entregas rápidas de novas funcionalidades. Mas, apesar da pressa, é necessário prestar atenção no que estamos fazendo, mesmo se a alteração for pequena. Ao mexermos em um código existente é importante tomarmos cuidado para não quebrar o que já funciona.
Por isso, queremos mexer o mínimo possível no código. Temos medo de remover código obsoleto, não utilizado ou até mesmo comentado, mesmo que mantê-lo já nem faça sentido. Não é incomum no mercado vermos código funcional acompanhado de centenas de linhas de código comentado.
Sem dúvida, é interessante manter o histórico do código dos projetos, para entendermos como chegamos até ali. Mas manter esse histórico junto ao código atual, com o decorrer do tempo, deixa nossos projetos confusos, poluídos com trechos e comentários que poderiam ser excluídos sem afetar o funcionamento do sistema.
Mas, mesmo que tivéssemos essa máquina do tempo, temos outro problema: muito raramente trabalhamos sozinhos.
Construir um sistema em equipe é um grande desafio. Nosso código tem que se integrar de maneira transparente e sem emendas com o código de todos os outros membros da nossa equipe.
Como podemos detectar que estamos alterando o mesmo código que um colega? Como mesclar as alterações que fizemos com a demais alterações da equipe? E como identificar conflitos entre essas alterações? Fazer isso manualmente, com cadernetas ou planilhas e muita conversa, parece trabalhoso demais e bastante suscetível a erros e esquecimentos.
Seria bom que tivéssemos um robô de integração de código, que fizesse todo esse trabalho automaticamente...
Existem ferramentas que funcionam como máquinas do tempo e robôs de integração para o seu código. Elas nos permitem acompanhar as alterações desde as versões mais antigas. Também é possível detectar e mesclar alterações nos mesmos arquivos, além de identificar conflitos, tudo de maneira automática.
Nesse tipo de ferramenta, há um repositório que nos permite obter qualquer versão já existente do código. Sempre que quisermos controlar as versões de algum arquivo, temos que informar que queremos rastreá-lo no repositório. A cada mudança que desejamos efetivar, devemos armazenar as alterações nesse repositório.
Alterações nos mesmos arquivos são mescladas de maneira automática sempre que possível. Já possíveis conflitos são identificados a cada vez que obtemos as mudanças dos nossos colegas de time.
Desde a década de 1990, existe esse tipo de ferramenta. Alguns exemplos de sistemas de controle de versão mais antigos são CVS, ClearCase, SourceSafe e SVN (que ainda é bastante usado nas empresas).
Em meados da década de 2000, surgiram sistemas de controle de versão mais modernos, mais rápidos e confiáveis, como Mercurial, Bazaar e, é claro, Git.
Foi criado em 2005 por Linus Torvalds, o mesmo criador do Linux, que estava descontente com o BitKeeper, o sistema de controle de versão utilizado no desenvolvimento do kernel do Linux.
Diversos projetos de código aberto importantes são hospedados no GitHub como jQuery, Node.js, Ruby On Rails, Jenkins, Spring, JUnit e muitos outros.
Não apenas esse, mas todos os livros da editora Casa do Código utilizam o Git como ferramenta de controle de versão, para manter o histórico de evolução dos capítulos. O GitHub também é utilizado para hospedagem dos repositórios dos livros.