Exercício - Colabore usando um repositório compartilhado

Concluído

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:

  1. 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.

  2. Agora, use o seguinte comando para criar um repositório vazio no diretório compartilhado:

    git init --bare
    
    
  3. 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 a HEAD ramificação para apontar para uma ramificação diferente, neste caso, é a main ramificação:

    git symbolic-ref HEAD refs/heads/main
    
    
  4. 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
    
    
  5. 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
    
  6. Você quer push e pull usar a main ramificação de origin 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
    
    
  7. 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.

  1. 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
    
    
  2. Agora, clone o repositório compartilhado (certifique-se de incluir o ponto no final do comando):

    git clone ../Shared.git .
    
    
  3. 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.

  1. 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
    
    
  2. 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.

  3. 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
    
    
  4. 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)
    
  5. 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
    
    
  6. 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.

  7. 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.

  8. 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
    
    
  9. 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.

  10. Utilize um comando git diff para ver as alterações que o Bob fez ao index.html:

    git diff origin -- index.html
    
    
  11. 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
    
    
  12. 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
    
  13. 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 de git 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.

  14. 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.

  15. 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; }
    
  16. 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.

  17. Termine ao voltar ao diretório do projeto e fazer uma solicitação:

    cd ../Cats
    git pull
    
    
  18. 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>
    
  19. 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:

Captura de tela do site renderizado Cats.

Se desejar, você pode baixar seus arquivos para visualizá-los localmente:

  1. Zip a pasta Cats :

    cd ..
    zip -r Cats.zip Cats
    
    
  2. Baixe o arquivo compactado:

    download Cats.zip
    
    
  3. Agora, descompacte o arquivo em seu computador local e abra index.hml para ver por si mesmo!