Remotes e GitHub


Até agora, todo repositório deste manual viveu em um único lugar: a sua própria máquina. Isso funciona bem até o momento em que você quer um backup que sobreviva à morte do seu notebook, quer continuar o projeto a partir de um segundo computador, ou quer que outra pessoa também toque no código. Nesse momento você precisa de uma cópia do repositório em algum lugar que todas as máquinas envolvidas consigam acessar. Essa cópia se chama remote, e é no GitHub que a maioria dos desenvolvedores a coloca.
O que é um remote (e onde o GitHub entra nisso)
Um remote é uma cópia do seu repositório hospedada em algum lugar que não seja a sua própria máquina, geralmente 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 pede também as URLs, além dos nomes) para ver isso:
$ git remote -v
origin https://github.com/mara-chen/weather-app.git (fetch)
origin https://github.com/mara-chen/weather-app.git (push)Todo remote que o Git conhece aparece listado duas vezes, uma para fetch e outra para push, porque, em teoria, os dois poderiam apontar para endereços diferentes. Na prática, quase sempre são o mesmo. origin é o apelido que o Git atribui automaticamente ao clonar. Você pode renomeá-lo ou adicionar um segundo remote apontando para outro lugar, mas quase todo projeto que você tocar vai chamar seu remote principal de origin.
Este é um bom momento para reforçar a distinção que confunde quase todo mundo no início: Git e GitHub não são a mesma coisa. O Git é a ferramenta de controle de versão que roda na sua máquina, registrando commits esteja você conectado a algo ou não. O GitHub é um site que hospeda uma cópia do seu repositório e te dá um remote para o qual enviar (push) e do qual baixar (pull). git remote, git push e git pull são os comandos que ligam os dois: são como o Git rodando no seu notebook conversa com um repositório que está nos servidores do GitHub.
origin. Execute git remote -v a qualquer momento para ver quais remotes o seu repositório conhece. Git e GitHub não são a mesma coisa: o Git é a ferramenta na sua máquina, o GitHub é onde o seu remote costuma morar. Deixar essa distinção clara desde já evita muita confusão depois. Onde hospedar seu remote: GitHub e as alternativas
Tudo o que um remote faz é puro Git, e isso tem uma consequência que vale conhecer desde já: o host do outro lado é intercambiável. Para o Git, todo host é apenas uma URL na sua configuração, e git push, git pull e git fetch se comportam de forma idêntica em qualquer um deles. O que um host acrescenta fica em uma camada acima: uma visualização web do seu código, um fluxo de revisão, controle de issues e controle de acesso. Aqui está o panorama, com as vantagens e desvantagens ditas sem rodeios:
- GitHub é, de longe, o maior e hospeda a grande maioria dos projetos open-source. Sua força é a rede: os projetos aos quais você quer contribuir já estão lá, os tutoriais partem do pressuposto de que você o usa, e empregadores procuram seu perfil nele. A contrapartida é que se trata de uma plataforma fechada (de propriedade da Microsoft), e quanto mais você depende dos recursos extras dele além da hospedagem Git, mais amarrado a ele você fica.
- GitLab é a alternativa completa mais próxima, com os mesmos recursos principais sob nomes ligeiramente diferentes (os pull requests lá se chamam "merge requests"). Seu grande diferencial é uma versão auto-hospedada que você pode rodar nos seus próprios servidores, motivo pelo qual empresas que mantêm o código internamente costumam escolhê-lo. A contrapartida é que ele vem com muita coisa embutida, e a plataforma pode parecer mais pesada do que a simples hospedagem de código que você buscava.
- Bitbucket é o host da Atlassian, feito para funcionar junto com suas ferramentas de acompanhamento de projetos e documentação, o Jira e o Confluence. Se sua equipe já vive nessas ferramentas, ele se encaixa perfeitamente. Fora desse ecossistema, é o que tem a menor comunidade dos três grandes e pouca presença no mundo open-source.
- Codeberg é um host sem fins lucrativos para projetos open-source, rodando sobre a plataforma open-source Forgejo. O atrativo é que nenhuma empresa é dona do seu host, e a própria plataforma é open-source. A contrapartida é a escala: menos integrações, uma comunidade menor e um foco em open-source em vez de trabalho privado de equipe.
- Auto-hospedagem está na base de todas essas opções: você pode rodar o Forgejo ou o Gitea, ambos gratuitos e open-source, ou a versão auto-hospedada do GitLab, em hardware controlado por você. Você ganha controle total e privacidade; a contrapartida é que manter tudo funcionando passa a ser tarefa sua.
Este manual usa o GitHub nos exemplos porque ele hospeda a maior parte dos projetos open-source e é onde você provavelmente vai colaborar por primeiro. Todo comando deste capítulo funciona sem alteração em qualquer outro host: troque a URL e o fluxo diário permanece o mesmo. As diferenças ficam uma camada acima, na interface web de cada site para revisar e mesclar (merge) trabalho, que é justamente o assunto do fluxo de pull request do próximo capítulo.
Enviando e buscando seu trabalho: git push e git pull
Com um remote configurado, dois comandos cobrem a maior parte do trabalho do dia a dia. git push envia seus commits locais para o remote. git pull traz commits feitos em outro lugar e os mescla na branch em 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/mara-chen/weather-app.git
9f8e7d6..a1b2c3d main -> mainorigin é o remote, main é a branch que você está enviando. Aquela última linha é a parte que vale a pena ler: ela mostra a main no remote avançando de um commit para o próximo.
Fazer pull 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 é o ciclo completo para trabalhar junto com outras pessoas em um projeto: baixe (pull) o que mudou antes de começar, faça seu próprio trabalho e comite, envie (push) de volta. Faça pull antes de fazer push sempre que compartilhar uma branch com outra pessoa. Pule o pull e o seu push pode acabar sobrepondo commits que você nunca viu, coisa que o Git vai recusar em vez de arriscar perder o trabalho de alguém.
git push envia seus commits para o remote, e git pull traz commits feitos em outro lugar e os mescla na sua branch. Faça pull antes de começar a trabalhar e push quando terminar, e você se mantém sincronizado com qualquer outra pessoa que esteja tocando no projeto. Pular o pull é o motivo mais comum de um push ser rejeitado. git fetch vs git pull
git pull faz duas coisas em uma etapa só: baixa o que mudou no remote e, imediatamente depois, mescla essas mudanças na branch em que você está. git fetch faz apenas a primeira metade. Ele baixa novos commits, mas nunca os mescla na sua branch. Sua branch atual, e seus arquivos de trabalho, permanecem exatamente como estavam até você mandar o Git mesclar ou fazer pull.
Esse é o tropeço em que quase todo mundo cai pelo menos uma vez: você roda git fetch, não vê nenhuma mudança visível em lugar nenhum, e conclui que nada aconteceu no remote. Alguma coisa aconteceu, sim: o fetch só ainda não tocou na sua branch de trabalho. Para ver o que chegou, olhe para o remote-tracking branch de que falamos antes neste capítulo: git log origin/main mostra commits parados no remote que ainda não chegaram à sua main local. Quando você estiver pronto para trazê-los, git merge origin/main faz isso, ou então git pull roda o fetch e esse merge para você em um único comando.
git pull baixa novos commits e os mescla na sua branch em uma única etapa. git fetch só os baixa e atualiza a memória do Git sobre onde o remote está; sua branch fica parada até você mesclar. Não ver nenhuma mudança nos seus arquivos logo depois de um fetch é esperado, os novos commits estão esperando no remote-tracking branch. Onde isso te deixa
Push, pull e fetch levam seus commits até um remote compartilhado e os trazem de volta, o que cobre a maior parte do que a colaboração diária em Git exige. Tudo aqui se apoia no ciclo de commit: você ainda faz stage e commit localmente primeiro, um remote só muda para 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 ela revisada antes de ser mesclada. O fluxo de pull request continua exatamente a partir daí. Se algum termo deste capítulo ainda parecer meio incerto, remote-tracking branch, refspec, upstream, o Glossário tem uma definição simples para cada um, e vale a pena revisitar O que é Git para a distinção entre Git e GitHub por si só.

