Exercício - Colabore usando um repositório compartilhado
Extrair diretamente do repositório de outra pessoa funciona, desde que ambos estejam na mesma rede. Mas, é um processo desajeitado e a maioria dos colaboradores não está na mesma rede. É melhor configurar um repositório central para o qual todos os colaboradores possam enviar e extrair.
Quando você conta ao seu amigo desenvolvedor Bob sobre seu projeto e Bob pede para participar, é exatamente isso que você decide fazer: configurar um repositório central, que também é chamado de repositório simples.
Criar um repositório simples
Precisa de um repositório que não tenha uma árvore de trabalho. Um repositório simples tem várias vantagens em relação a uma árvore de trabalho:
- Sem uma árvore funcionando, todos podem fazer mudanças sem se preocupar com qual ramo é verificado.
- É fácil para o Git detetar quando outro usuário enviou alterações que podem entrar em conflito com a sua.
- Um repositório partilhado é dimensionado para vários programadores. Com um repositório simples, você tem que saber apenas sobre o repositório compartilhado, e não sobre todos os outros colaboradores dos quais você pode precisar puxar.
- Ao colocar o repositório compartilhado em um servidor que todos podem acessar, você não precisa se preocupar com firewalls e permissões.
- Você não precisa de contas separadas no servidor porque o Git controla quem fez cada confirmação. (O GitHub tem milhões de usuários que compartilham a
git
conta. Todos usam o protocolo de rede criptográfica Secure Shell (SSH) e os usuários são distinguidos por suas chaves públicas.)
Criar um repositório simples para compartilhamento é fácil:
Crie um novo diretório chamado Shared.git no mesmo nível dos diretórios Alice e Cats para manter o repositório nu:
cd .. mkdir Shared.git cd Shared.git
O nome do diretório não é importante, mas vamos nos referir a ele como o diretório Shared.git , ou apenas o diretório compartilhado , nesses exercícios.
Nomear o diretório Shared.git segue a longa tradição de atribuir repositórios nus um nome que termina em
.git
distingui-los das árvores de trabalho. É uma convenção, mas não um requisito.Agora, use o seguinte comando para criar um repositório vazio no diretório compartilhado:
git init --bare
Quando um repositório ainda está vazio, o
git checkout
comando não pode ser usado para definir o nome da ramificação padrão. Para realizar essa tarefa, você pode alterar aHEAD
ramificação para apontar para uma ramificação diferente, neste caso, é amain
ramificação:git symbolic-ref HEAD refs/heads/main
O próximo passo é obter os conteúdos do seu repositório para o repositório partilhado. Use estes comandos para retornar ao diretório do projeto onde seu repositório está armazenado, configurar um
origin
controle remoto e executar um push inicial:cd ../Cats git remote add origin ../Shared.git git push origin main
Verifique a saída. O resultado deve indicar sucesso:
Counting objects: 12, done. Delta compression using up to 2 threads. Compressing objects: 100% (8/8), done. Writing objects: 100% (12/12), 1.07 KiB | 0 bytes/s, done. Total 12 (delta 1), reused 0 (delta 0) To ../Shared.git * [new branch] main -> main
Você quer
push
epull
usar amain
ramificação deorigin
por padrão, como se tivesse feito seu repositório clonando-o em primeiro lugar. Mas primeiro, você precisa dizer ao Git qual ramo rastrear.git branch --set-upstream-to origin/main
Verifique esta saída:
branch 'main' set up to track 'origin/main'.
O Git reclamaria se você tentasse executar esse comando antes do push inicial, porque o novo repositório não tinha ramificações. O Git não consegue controlar um ramo que não existe. Tudo o que o Git está fazendo sob o capô é procurar
.git/refs/remotes/origin
um arquivo chamado trunk.
Configurar para os colaboradores
O próximo passo é Bob clonar o repositório nu e, em seguida, Alice definir a origem em seu repositório para direcionar o repositório compartilhado para pushes e pulls.
Crie um diretório chamado Bob que é um irmão do diretório do projeto e, em seguida, mude para o diretório Bob :
cd .. mkdir Bob cd Bob
Agora, clone o repositório compartilhado (certifique-se de incluir o ponto no final do comando):
git clone ../Shared.git .
Atualmente, o repositório de Alice está configurado para empurrar e puxar de seu próprio repositório. Use os seguintes comandos para alterar para o diretório Alice e alterar
origin
para apontar para o repositório compartilhado:cd ../Alice git remote set-url origin ../Shared.git
Comece a colaborar
Agora que Bob está configurado para trabalhar no site, Bob decide adicionar um rodapé à parte inferior da página. Vamos assumir a identidade do Bob e da Alice durante alguns momentos para aprender os conceitos básicos de colaboração.
Comece indo para o diretório Bob e trabalhando como Bob:
cd ../Bob git config user.name Bob git config user.email bob@contoso.com
Abra index.html usando
code index.html
e substitua o<hr>
elemento por esta linha (encontrada no final do<body>
elemento):<footer><hr>Copyright (c) 2021 Contoso Cats</footer>
Em seguida, salve o arquivo e feche o editor.
Consolide as alterações e emita para a origem remota:
git commit -a -m "Put a footer at the bottom of the page" git push
Verifique a saída. Se vir um aviso como o exemplo a seguir, não se preocupe. Esse aviso apenas informa os usuários sobre uma alteração nos comportamentos padrão do Git. Se pretender certificar-se de que não volta a ver este aviso, pode executar
git config --global push.default simple
.warning: push.default is unset; its implicit value has changed in Git 2.0 from 'matching' to 'simple'. To squelch this message and maintain the traditional behavior, use: git config --global push.default matching To squelch this message and adopt the new behavior now, use: git config --global push.default simple When push.default is set to 'matching', git will push local branches to the remote branches that already exist with the same name. Since Git 2.0, Git defaults to the more conservative 'simple' behavior, which only pushes the current branch to the corresponding remote branch that 'git pull' uses to update the current branch. See 'git help config' and search for 'push.default' for further information. (the 'simple' mode was introduced in Git 1.7.11. Use the similar mode 'current' instead of 'simple' if you sometimes use older versions of Git)
O Bob e a Alice estão a editar o site em simultâneo. Alice decide adicionar uma barra de navegação à página. Esta adição requer que Alice modifique dois ficheiros: index.html e site.css. Comece retornando ao diretório Alice :
cd ../Alice
Agora, abra index.html e insira a seguinte linha logo após a
<body>
tag na linha 8:<nav><a href="./index.html">home</a></nav>
Em seguida, salve o arquivo e feche o editor.
Em seguida, abra site.css na pasta CSS usando
code CSS/site.css
e adicione a seguinte linha na parte inferior:nav { background-color: #C0D8DF; }
Guarde o ficheiro e feche o editor.
Agora, vamos supor que Alice receba um e-mail de Bob dizendo que Bob fez alterações no site. Ela decide solicitar as alterações dele antes de consolidar as suas próprias. (Se Alice já tivesse comprometido suas mudanças, eles teriam um problema diferente, que é discutido em outro módulo.) Alice executa este comando:
git pull
Verifique a saída. A partir do resultado, parece que o Git impediu um problema:
remote: Counting objects: 3, done. remote: Compressing objects: 100% (3/3), done. remote: Total 3 (delta 2), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From ../Shared 843d142..2cf6cbf main -> origin/main Updating 843d142..2cf6cbf error: Your local changes to the following files would be overwritten by merge: index.html Please commit your changes or stash them before you can merge. Aborting
Git avisa que a atração substituiria a versão de Alice de index.html e perderia suas alterações. Isso é porque o Bob também modificou o index.html. Se Alice não tivesse mudado index.html, o Git teria cometido a fusão.
Utilize um comando
git diff
para ver as alterações que o Bob fez ao index.html:git diff origin -- index.html
Verifique a saída. A partir da saída, é evidente que as mudanças de Alice e as mudanças de Bob não se sobrepõem. Agora, Alice pode esconder suas mudanças.
git stash
salva o estado da árvore de trabalho e do índice fazendo algumas confirmações temporárias. Pense no ficheiro intermédio como uma forma de guardar o seu trabalho atual enquanto faz outra ação, sem fazer uma consolidação "real" ou afetar o histórico do seu repositório.Na realidade, Alice deveria ter guardado ou comprometido suas mudanças antes de tentar puxar. Solicitar para uma árvore de trabalho não consolidada é arriscado porque pode fazer ações das quais não consegue recuperar facilmente.
Utilize o seguinte comando para guardar as alterações da Alice:
git stash
Verifique a saída. Deve ser semelhante a este exemplo:
Saved working directory and index state WIP on main: 95bbc3b Change background color to light blue HEAD is now at 95bbc3b Change background color to light blue
Agora, é seguro para Alice puxar, após o que eles podem "estourar" o estoque, que é organizado como uma pilha. (Na verdade,
git stash
é uma abreviação degit stash push
. É muito parecido com a pilha onde você coloca contas que ainda não conseguiu pagar.) Execute estes comandos:git pull git stash pop
Aplicar as alterações e remover o ficheiro intermédio intercala as alterações. Se as alterações se sobrepuuserem, pode haver um conflito. Você pode aprender como resolver essas situações em um módulo Git mais avançado do Microsoft Learn.
Verifique a saída. Alice deve ver esta saída, que lhes permite saber que a fusão foi bem-sucedida e que suas alterações estão de volta, mas ainda não preparadas para confirmação:
Auto-merging index.html On branch main Your branch is up-to-date with 'origin/main'. Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: CSS/site.css modified: index.html no changes added to commit (use "git add" and/or "git commit -a") Dropped refs/stash@{0} (0cfb7b75d56611d9fc6a6ab660a51f5582b8d9c5)
Neste ponto, Alice pode continuar trabalhando ou apenas se comprometer e impulsionar suas mudanças. Vamos fazer outra alteração como Alice ao atribuir aos rodapés o mesmo estilo das barras de navegação.
Abra site.css na pasta CSS e substitua a terceira linha — aquela que define o estilo
<nav>
dos elementos — por esta regra CSS compartilhada. Em seguida, como de costume, salve as alterações e feche o editor.nav, footer { background-color: #C0D8DF; }
Agora, confirme as alterações e envie-as para o repositório compartilhado:
git commit -a -m "Stylize the nav bar" git push
O site atualizado está no repositório partilhado.
Termine ao voltar ao diretório do projeto e fazer uma solicitação:
cd ../Cats git pull
Abra index.html (aquele no diretório do projeto) para confirmar se as alterações feitas por Bob e Alice estão presentes em seu repositório local. Verifique se index.html tem o código mais atualizado:
<!DOCTYPE html> <html> <head> <meta charset='UTF-8'> <title>Our Feline Friends</title> <link rel="stylesheet" href="CSS/site.css"> </head> <body> <nav><a href="./index.html">home</a></nav> <h1>Our Feline Friends</h1> <p>Eventually we will put cat pictures here.</p> <footer><hr>Copyright (c) 2021 Contoso Cats</footer> </body> </html>
No momento, seu repo e o repo de Alice estão sincronizados, mas o repo de Bob não. Termine ao atualizar o do Bob também:
cd ../Bob git pull
Os três repositórios estão em conformidade. O repositório compartilhado é a única fonte de verdade para todos os usuários, e todos os pushes e pulls são direcionados para o repositório compartilhado.
Se estiver curioso em relação ao aspeto do site, segue-se uma pré-visualização:
Se desejar, você pode baixar seus arquivos para visualizá-los localmente:
Zip a pasta Cats :
cd .. zip -r Cats.zip Cats
Baixe o arquivo compactado:
download Cats.zip
Agora, descompacte o arquivo em seu computador local e abra index.hml para ver por si mesmo!