Colaboração usando um comando de pull

Concluído

Em seu tempo livre fora do seu novo trabalho, você está trabalhando em um site que hospeda fotos de gatos. Você vem usando o Git para o controle de versão, e é hora de convidar colaboradores para o projeto. Você convida alguns amigos para comer pizza em casa. Alice, sua amiga, também amante de gatos, se oferece para ajudar a tornar seu sonho uma realidade, e você fica muito animado com a ideia.

Primeiro, Alice precisa fazer uma cópia do seu projeto Git. Depois, ela desejará enviar as alterações para você à medida que ela as faz. É nessa situação que a natureza distribuída do Git se destaca. Usando o Git, duas ou mais pessoas podem trabalhar juntas em um projeto sem o receio de substituir o trabalho uns dos outros. Além disso, você pode verificar o trabalho de Alice antes de mesclá-lo com o seu. (Alice é talentosa, mas nenhum desenvolvedor é perfeito. Confie, mas verifique.)

Nesta lição, você aprenderá a clonar um repositório para disponibilizá-lo para outras pessoas. Você também aprenderá a usar um dos recursos mais importantes do Git: as solicitações de pull.

Clonar um repositório (git clone)

No Git, um repositório é copiado pelo clone dele usando o comando git clone. Você pode clonar um repositório seja qual for o local de armazenamento dele, desde que você tenha uma URL ou um caminho para o qual apontá-lo.

git clone aceita um caminho do sistema de arquivos, um caminho SSH (por exemplo, git@example.com:alice/Cats. Você estará familiarizado com esse formato se tiver usado o Rsync ou o SCP) ou uma URL, normalmente começando com file:, git: ou ssh. Os vários formatos são descritos na documentação de git clone. No UNIX e no Linux, a operação de clonagem usa links físicos. Portanto, ela é rápida e ocupa espaço mínimo, porque apenas as entradas do diretório precisam ser copiadas, não os arquivos.

Repositórios remotos (git pull)

Quando o Git clona um repositório, ele cria uma referência ao repositório original chamada repositório remoto usando o nome origin. Ele configura o repositório clonado para que ele efetue pull ou recupere os dados do repositório remoto. (O Git também pode efetuar push. Você aprenderá a usar o push no Git mais adiante neste módulo). origin é a localização padrão para o Git efetuar pull de alterações e enviá-las por push. git pull copia as alterações do repositório remoto para o local. O comando git pull é muito eficiente, porque só copia novos commits e objetos e faz o check-in deles na árvore de trabalho.

Você efetua pull do origin usando o comando git pull. É útil comparar git pull com outros métodos de cópia de arquivos. O comando scp copia tudo. (scp é semelhante ao comando cp do UNIX, com a exceção de que os arquivos que estão sendo copiados não precisam estar no mesmo computador.) Se houver 10.000 arquivos no diretório remoto, scp copiará todos eles. Um programa mais eficiente chamado Rsync examina todos os arquivos nos diretórios local e remoto e só copia aqueles que são diferentes. Geralmente, o Rsync é usado para fazer backups, mas ainda precisa aplicar hash a todos os arquivos, a menos que tenham tamanhos ou datas de criação diferentes.

O Git examina apenas os commits. Ele já conhece o último commit obtido do repositório remoto porque salvou a lista de commits. Em seguida, o Git instrui o computador do qual está sendo feita a cópia a enviar tudo o que foi alterado, incluindo os novos commits e os objetos para os quais eles apontam. Esses commits e objetos são empacotados em um arquivo chamado de pacote e enviados em um lote. Por fim, o Git atualiza a árvore de trabalho desempacotando todos os objetos que foram alterados e mesclando-os (se necessário) com os commits e os objetos na árvore de trabalho.

O Git só efetua pull ou push quando você o instrui a fazer isso. Isso é diferente, digamos, do Dropbox, que precisa solicitar ao sistema operacional que o notifique das alterações feitas na pasta e, ocasionalmente, perguntar ao servidor se alguma outra pessoa fez alterações.

Criar solicitações pull (git request-pull)

Depois que outro desenvolvedor, como Alice, clonar seu repositório e fizer algumas alterações localmente, o ideal será que ele incorpore essas alterações novamente no repositório original. Pode parecer que efetuar push dessas alterações para o repositório original é a abordagem certa. No entanto, um push para o repositório original falhará, porque outros usuários não têm permissão para fazer alterações no seu repositório. E é assim que deve ser. Por enquanto, você deseja examinar as alterações recebidas antes de mesclá-las na base de código principal.

Por enquanto, Alice precisará enviar uma solicitação de pull para solicitar que você envie as alterações dela para a base de código principal. Alice pode fazer isso usando git request-pull, que pode ser semelhante a este exemplo:

git request-pull -p origin/main .

Alice refere-se ao branch main no repositório remoto origin como origin/main.

Essa solicitação de pull é, essencialmente, a mesma coisa que uma solicitação de pull no GitHub (um local para armazenar códigos, o que não abordaremos neste módulo). Uma solicitação de pull dá a oportunidade de examinar as alterações de outros colaboradores antes de incorporar o trabalho deles no trabalho que você está fazendo no site. As revisões de código são uma parte importante (alguns dizem a parte mais importante) da programação colaborativa.

Criar um repositório remoto (git remote) e concluir a solicitação de pull (git pull)

Como proprietário de um projeto, você precisa saber como mesclar as solicitações de pull. Primeiro, você usa o comando git remote para configurar o repositório de outro desenvolvedor como um repositório remoto. Em seguida, você usa esse repositório remoto para pulls e solicitações de pull usando o comando git pull.

Nos bastidores, git pull é uma combinação de duas operações mais simples: git fetch, que obtém as alterações, e git merge, que mescla essas alterações no repositório. Nesse caso, a mesclagem foi de avanço rápido, o que significa que Alice teve seu último commit no repositório dela, de modo que o commit dela pôde ser adicionada à frente do seu histórico sem nenhuma modificação.