Remotos e GitHub


Todo repositório neste manual até agora viveu em um único lugar: sua própria máquina. Isso funciona bem até você querer um backup que sobreviva a um laptop morto, querer pegar o projeto de um segundo computador, ou querer que qualquer outra pessoa toque o código. O que você precisa é de uma cópia do repositório em algum lugar que toda máquina envolvida possa alcançar. Essa cópia é chamada de remoto, e o GitHub é onde a maioria dos desenvolvedores a coloca.
O que é um remoto (e onde GitHub se encaixa)
Um remoto é uma cópia do seu repositório hospedada em algum lugar que não seja sua própria máquina, na maioria das vezes no GitHub. Quando você clona um repositório, o Git já configura um para você, chamado origin por padrão. Execute git remote -v (o -v solicita as URLs assim como os nomes) para vê-lo:
$ git remote -v
origin https://github.com/joão-silva/weather-app.git (fetch)
origin https://github.com/joão-silva/weather-app.git (push)Todo remoto que o Git conhece é listado duas vezes, uma para buscar e uma para enviar, porque em teoria os dois poderiam apontar para endereços diferentes. Na prática são quase sempre o mesmo. origin é o apelido que o Git atribui automaticamente ao clonar. Você pode renomeá-lo ou adicionar um segundo remoto apontando para outro lugar, mas quase todo projeto que você tocar chamará seu remoto principal de origin.
Este é um bom momento para reafirmar a distinção que confunde quase todo mundo começando: Git e GitHub não são a mesma coisa. Git é a ferramenta de controle de versão rodando na sua máquina, registrando commits independentemente de você estar conectado a algo. GitHub é um site que hospeda uma cópia do seu repositório e oferece um remoto para enviar e receber. git remote, git push e git pull são os comandos que conectam os dois: é como o Git rodando no seu laptop fala com um repositório sentado nos servidores do GitHub.
origin. Execute git remote -v a qualquer momento para ver quais remotos seu repositório conhece. Git e GitHub não são a mesma coisa: Git é a ferramenta na sua máquina, GitHub é onde seu remoto frequentemente vive. Separar isso cedo economiza muita confusão depois. Onde hospedar seu remoto: GitHub e as alternativas
Tudo que um remoto faz é Git puro, e isso tem uma consequência que vale saber cedo: o host no outro fim é intercambiável. Para o Git, todo host é uma URL na sua configuração, e git push, git pull e git fetch se comportam de forma idêntica contra todos eles. O que um host adiciona fica uma camada acima: uma visualização web do seu código, um fluxo de revisão, rastreamento de problemas e controle de acesso. Aqui está o cenário, com as desvantagens explicadas claramente:
- GitHub é o maior de longe e hospeda a grande maioria do trabalho de código aberto. Sua força é a rede: os projetos que você quer contribuir já estão lá, tutoriais assumem isso, e empregadores procuram seu perfil nele. A desvantagem é que é uma plataforma fechada (de propriedade da Microsoft), e quanto mais você depende de seus extras além de hospedagem Git, mais atado a ela você fica.
- GitLab é a alternativa mais completa, com os mesmos recursos principais sob nomes ligeiramente diferentes (pull requests são "merge requests" lá). Seu destaque é uma edição auto-gerenciada que você pode executar em seus próprios servidores, que é por isso que empresas que mantêm código internamente frequentemente a escolhem. A desvantagem é que empacota muito, e a plataforma pode parecer mais pesada do que a hospedagem de código que você procurava.
- Bitbucket é o host da Atlassian, construído para ficar ao lado de suas ferramentas de rastreamento de projetos e documentação, Jira e Confluence. Se seu time já vive nessas ferramentas, ela se encaixa perfeitamente. Fora desse ecossistema tem a menor comunidade dos três grandes e pouca presença de código aberto.
- Codeberg é um host sem fins lucrativos para projetos de código aberto, executado na plataforma de código aberto Forgejo. O atrativo é que nenhuma empresa possui seu host e a plataforma em si é código aberto. A desvantagem é escala: menos integrações, uma comunidade menor e um foco em código aberto em vez de trabalho em equipe privado.
- Auto-hospedagem está por baixo de tudo isso: execute Forgejo ou Gitea, ambos livres e de código aberto, ou a edição auto-gerenciada do GitLab em hardware que você controla. Você obtém controle total e privacidade; a desvantagem é que mantê-la funcionando se torna seu trabalho.
Este manual usa GitHub em seus exemplos porque hospeda a maioria do trabalho de código aberto e é onde você provavelmente colaborará primeiro. Todo comando neste capítulo se transfere sem mudanças para qualquer outro host: troque a URL e o loop diário permanece o mesmo. As diferenças vivem uma camada acima, na interface web de cada site para revisar e fazer merge do trabalho, que é onde o fluxo de pull request do próximo capítulo entra.
Enviando e obtendo seu trabalho: git push e git pull
Com um remoto em lugar, dois comandos cobrem a maioria do trabalho diário. git push envia seus commits locais até o remoto. git pull traz commits feitos em outro lugar e faz merge deles na branch que você está.
$ git push origin main
Enumerating objects: 5, done.
Writing objects: 100% (3/3), 312 bytes | 312.00 KiB/s, done.
To https://github.com/joão-silva/weather-app.git
9f8e7d6..a1b2c3d main -> mainorigin é o remoto, main é a branch que você está enviando. Aquela última linha é a parte que vale ler: mostra main no remoto se movendo de um commit para o próximo.
Pulling funciona do mesmo jeito, ao contrário:
$ git pull origin main
remote: Enumerating objects: 4, done.
Unpacking objects: 100% (4/4), done.
Updating a1b2c3d..b7c9e21
Fast-forward
src/index.js | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)Esse é todo o loop para trabalhar junto com outras pessoas em um projeto: puxe o que mudou antes de começar, faça seu próprio trabalho e faça commit dele, empurre de volta. Puxe antes de você enviar sempre que você compartilhar uma branch com qualquer outra pessoa. Pule o pull e seu push pode pousar em cima de commits que você nunca viu, que o Git recusará em vez de arriscar perder o trabalho de alguém.
git push envia seus commits até o remoto, e git pull traz commits feitos em outro lugar e faz merge deles na sua branch. Puxe antes de começar a trabalhar e envie quando terminar, e você fica sincronizado com qualquer outra pessoa tocando o projeto. Pular o pull é a razão mais comum para um push ser rejeitado. git fetch vs git pull
git pull faz duas coisas em um passo: baixa o que mudou no remoto, então imediatamente faz merge dessas mudanças na branch que você está. git fetch faz apenas a primeira metade. Baixa novos commits mas nunca faz merge deles na sua branch. Sua branch atual, e seus arquivos de trabalho, ficam exatamente onde estavam até você contar ao Git para fazer merge ou pull.
Este é o tropeço que quase todo mundo acerta pelo menos uma vez: execute git fetch, não veja mudança visível em lugar nenhum, e assuma que nada aconteceu no remoto. Algo aconteceu: fetch não tocou sua branch de trabalho ainda. Para ver o que desceu, olhe para o branch de rastreamento remoto do início deste capítulo: git log origin/main mostra commits sentados no remoto que não chegaram na sua main local. Quando você está pronto para trazê-los, git merge origin/main faz, ou git pull roda fetch e esse merge para você em um comando.
git pull baixa novos commits e faz merge deles na sua branch em um passo. git fetch apenas os baixa e atualiza a memória do Git sobre onde o remoto está; sua branch fica em paz até você fazer merge. Não ver mudança nos seus arquivos logo após um fetch é esperado, os novos commits estão esperando no branch de rastreamento remoto. Onde isso o deixa
Push, pull e fetch levam seus commits para um remoto compartilhado e de volta novamente, o que cobre a maioria do que a colaboração do dia a dia em Git requer. Tudo aqui se constrói sobre o loop de commit: você ainda faz stage e commit localmente primeiro, um remoto apenas muda onde esses commits podem viajar. A próxima peça é fazer essa colaboração através do próprio GitHub, propondo uma mudança e tendo-a revisada antes de fazer merge. O fluxo de pull request pega exatamente ali. Se um termo neste capítulo ainda parecer instável, branch de rastreamento remoto, refspec, upstream, o Glossário tem uma definição simples para cada, e O que é Git vale uma segunda olhada para a distinção Git-versus-GitHub por conta própria.

