O que é Git?


Você quase certamente já fez controle de versão manualmente. Uma pasta com relatorio.docx, relatorio_final.docx, relatorio_final_v2.docx e relatorio_final_DE_VERDADE.docx é controle de versão, do pior tipo possível. Você não consegue dizer o que mudou entre dois desses arquivos, não consegue mesclar edições que duas pessoas fizeram ao mesmo tempo, e definitivamente não consegue recuperar o parágrafo bom que você deletou três cópias atrás.
Git resolve esse problema adequadamente. É uma ferramenta que registra snapshots do seu projeto ao longo do tempo, de modo que todo o seu histórico fica em um lugar em vez de estar espalhado em várias cópias. A ferramenta em si é um pequeno programa que roda no seu próprio computador: você digita comandos que começam com git em um terminal, e ele responde em texto.
O que Git faz por você
No seu cerne, Git mantém uma linha do tempo do seu projeto. Cada vez que você chega a um ponto que vale a pena salvar, você registra um commit: um snapshot de cada arquivo, mais uma mensagem curta descrevendo o que mudou e por quê. Depois você pode olhar para trás nessa linha do tempo e ver exatamente como o projeto chegou aonde está. Aqui está uma linha do tempo real, impressa por git log, o comando que lista os commits de um projeto (a flag --oneline encurta cada um para uma única linha):
$ git log --oneline
a1b2c3d Add password strength meter
9f8e7d6 Fix signup form validation
5c4b3a2 Set up project structureEsses são três pontos salvos no histórico de um projeto, o mais novo no topo, cada um com um ID curto e a mensagem que seu autor escreveu. (Em cada exemplo como este, a linha começando com $ é um comando digitado em um terminal, sem o $ em si, e as linhas abaixo dele são a resposta do Git.) Você aprenderá cada comando que produz e lê esse histórico nos próximos capítulos. Por enquanto, a ideia importante é que Git está registrando seu trabalho como uma série de snapshots aos quais você sempre pode voltar.
Uma vez que seu projeto tenha um histórico como este, muito se torna possível. Você pode ver o que mudou e quem mudou. Você pode tentar uma ideia arriscada à parte e descartá-la completamente se não funcionar. Você pode entregar o projeto inteiro, com seu histórico completo, para outra pessoa. E quando duas pessoas editam o mesmo código, Git pode combinar seu trabalho e marcar os locais onde discordam para que um humano possa resolvê-los. Essas quatro capacidades, histórico, experimentos seguros, compartilhamento e combinação de trabalho, são toda a razão pela qual Git roda em quase todos os codebases profissionais.
final_v2_DE_VERDADE é o problema que Git foi construído para acabar, e prometo que se sente ótimo na primeira vez que você deleta uma. Git e GitHub são coisas diferentes
Isso confunde quase todo mundo no início, então aqui está em termos simples. Git é a ferramenta de controle de versão. Roda no seu próprio computador, registra seus commits, e não precisa de conexão com a internet ou de uma conta para funcionar. GitHub é um site que armazena repositórios Git online e adiciona coisas ao seu redor: um lugar para compartilhar seu código, revisar as mudanças uns dos outros, reportar problemas e colaborar.
A forma mais clara de sentir a diferença: você pode usar Git todos os dias, fazendo commits e branches no seu notebook, sem nunca criar uma conta GitHub. GitHub só entra em cena quando você quer colocar seu repositório em um lugar compartilhado para que outras pessoas, ou outras máquinas, possam acessá-lo. Git é o motor; GitHub é um lugar para hospedar o que ele produz. Outros existem, como GitLab e Bitbucket, e todos eles hospedam os mesmos repositórios Git por baixo.
De onde Git veio
O histórico do Git explica muito sobre por que ele funciona da forma que funciona. Foi escrito em 2005 por Linus Torvalds, a mesma pessoa que iniciou o Linux. O kernel do Linux é construído por milhares de voluntários espalhados pelo mundo, e por alguns anos eles coordenaram todo esse trabalho usando uma ferramenta comercial chamada BitKeeper, que a empresa por trás dela permitia que projetos open-source usassem gratuitamente.
Em 2005 esse acordo gratuito desabou, e a comunidade do kernel de repente não tinha ferramenta para gerenciar seu enorme e rápido codebase. Nada mais disponível na época conseguia acompanhar. Então Torvalds se afastou do trabalho do kernel por algumas semanas e escreveu sua própria ferramenta de controle de versão, com alguns objetivos firmes moldados por exatamente esse problema.
Ele queria que fosse distribuída, de modo que cada contribuidor tivesse o histórico completo do projeto em sua própria máquina e pudesse trabalhar sem verificar com um servidor central. Ele queria que fosse rápida, rápida o suficiente para lidar com um projeto do tamanho do kernel sem fazer as pessoas esperarem. E queria garantir integridade, de modo que ninguém pudesse silenciosamente alterar o histórico e nenhum erro de disco pudesse corromper um projeto sem ser notado.
Esses objetivos são o motivo pelo qual Git se comporta como faz hoje. Quando você clone um projeto, você obtém seu histórico inteiro para trabalhar, que é o objetivo distribuído em ação: você pode fazer commit, criar branches e navegar o histórico em um avião sem wifi. E cada commit é marcado com uma impressão digital calculada a partir de seu conteúdo exato, então se um único byte jamais mudar a impressão digital para de combinar e Git percebe. As decisões de design que Torvalds fez apressadamente em 2005 são as que você confia em cada vez que usa Git agora.
clone lhe dá o histórico completo para trabalhar offline, e por que cada commit recebe uma impressão digital. Contexto útil para uma ferramenta que você usará por anos. Para onde este manual vai a seguir
Com o modelo mental no lugar, o resto da trilha é sobre fazer o trabalho. Seu primeiro repositório começa do zero: abrindo um terminal, instalando Git se sua máquina não tiver, e transformando uma pasta em um repositório no qual você pode fazer commit. A partir daí você aprenderá o loop cotidiano de salvar mudanças, depois branches, merging e o fluxo de colaboração no GitHub. Se um termo jamais o confundir, o Glossário tem uma definição curta para cada palavra de vocabulário do Git nesses docs.

