Por que o Git e tao complexo?
O Git nunca teve a intencao de parecer simples para voce.
Voce acha que Git e so add, commit, push? Isso significa que voce esteve jogando no “modo single player” o tempo todo, no maximo cooperativo em rede local. Isso nao e usar Git — e usar Git como um Baidu Netdisk de sincronizacao manual.
A complexidade do Git vem do problema definitivo que ele foi criado para resolver: como fazer com que um grupo de programadores que nao confiam uns nos outros, tem horarios opostos e podem sumir a qualquer momento, colaborem no mesmo projeto sem que tudo vire um caos?
Olha, qualquer um consegue fazer clone e push. Mas assim que voce comeca a trabalhar em equipe — voce da pull e so encontra conflitos, a tela coberta de <<<<< HEAD e >>>>>> algum-hash-aleatorio — e aí que o pesadelo comeca.
Eu mesmo ja passei por isso. Um novo desenvolvedor backend no nosso time era talentoso mas nao sabia lidar com Git. Um dia ele precisava mesclar um hotfix urgente, passou horas sem conseguir e veio me pedir ajuda. Olhei o grafico de branches dele — minha nossa, era um emaranhado digno dos tentaculos de Cthulhu: bifurcacoes, merges, mais bifurcacoes, mais merges, intercalados com varios commits sem sentido de merge branch 'master' into master. Perguntei o que ele tinha feito. Ele disse: “Nao consegui dar pull, entao dei fetch, depois rebase, rebase nao funcionou entao dei merge, o merge ainda tinha conflitos entao dei reset…”
Minha pressao subiu na hora. Ele estava tratando o Git como um pocinho dos desejos — qualquer comando que soasse bem, ele jogava pra dentro esperando que a forca bruta fizesse um milagre. Spoiler: milagre nao aconteceu, mas quase causamos um incidente.
E isso e so a ponta do iceberg. Mais fundo voce encontra as “tecnicas proibidas” de manipulacao atomica do historico: rebase -i, cherry-pick, filter-branch. Para que servem? Em palavras simples, sao a “maquina do tempo” do mundo do codigo — permitem que voce volte no tempo e altere o historico. Mas como todo mundo sabe pelos filmes, nove em cada dez viajantes do tempo acabam quebrando o universo. git reflog e seu remedio para o arrependimento, mas na maioria das vezes voce nem sabe quando se “envenenou.”
A filosofia de design do Git e que ele nao confia em nenhuma autoridade central. Ele considera o computador de cada desenvolvedor um “universo paralelo” completo (repository). Cada commit que voce faz cria um novo instantaneo historico naquele universo. Branches permitem que voce crie infinitos universos paralelos a vontade. Merge e rebase sao tentativas de reconciliar duas “linhas do tempo” diferentes — pense em como isso e complicado. Nem os fisicos entenderam!
A area de staging existe para que voce possa controlar com precisao o que e confirmado. Branches isolam seu trabalho para que voce nao interfira nos outros. Merge lida com o produto inevitavel da colaboracao: a divergencia. Tudo isso serve a um grande objetivo “distribuido”. O Git te da liberdade infinita — e infinitas maneiras de estragar tudo.
Entao a pergunta e: o Git nao tem jeito? Pessoas normais nunca conseguem aprende-lo?
Nao e bem assim. O problema nao e o Git — e como nos o aprendemos. A maioria dos tutoriais por aı sao ou listas de comandos estilo dicionario ou explicacoes fragmentadas de cenarios. A documentacao oficial parece um dicionario Xinhua de mil paginas — otimo para consultar uma palavra, mas voce nao aprende a escrever romances com um dicionario. Os guias online estao espalhados por toda parte, como um monte de pecas de Lego soltas sem manual de instrucoes mostrando como construir a Millennium Falcon.
E por isso que recomendo fortemente tutoriais que nao tentam cobrir tudo, mas se concentram em cenarios praticos de alta frequencia. Acho que o “Manual Pratico do Git do Zero ao Profissional” da equipe da Bytedance e muito bom.
Ele te ensina a diferenca entre git pull e git pull --rebase e quando usar cada um, em vez de fazer voce decorar. Ele te guia passo a passo por um caso real de conflito, mostrando como resolve-lo com elegancia em vez de simplesmente deletar o codigo dos outros. Ele explica quando sua branch de funcionalidade esta muito atras da principal, se voce deve usar merge ou rebase para sincronizar, e os prós e contras de cada escolha.
No final das contas, a filosofia do Git e: “Te dar liberdade infinita, e tambem te dar a corda para se enforcar.” Um bom guia te ensina como usar essa corda para tecer uma rede ou escalar uma montanha — nao dar um noo no seu proprio pescoco. Nosso objetivo nao e nos tornar um arqueologo do Git que decora todos os comandos. E nos tornar um artesao do Git que se movimenta com desenvoltura na equipe, nunca prejudica os colegas e pode salvar o dia quando necessario.