Introdução
A próxima atualização do guia do jardim envolve duas informações corretas na mesma linha. Seu commit preparado direciona os visitantes para a entrada sul e atualiza o telefone de atendimento aos visitantes. Um commit publicado pelo colega altera o horário de funcionamento e a rota sem degraus. O guia final precisa dos dois conjuntos de informações.
Este laboratório começa com seus próprios repositórios independentes; ele não precisa de arquivos da VM anterior. Você verá um conflito real de conteúdo, praticará o cancelamento de um merge inacabado, combinará os campos corretos e entregará o resultado a um novo clone de recebimento.
Conclua o laboratório guiado anterior ou já compreenda nomes de remotos, fetch, merge, push e clone. Navegação básica no terminal, commits e diffs são pré-requisitos. A duração de 45 minutos é uma estimativa do autor.
Leia e Reinicie um Conflito com Segurança
Nesta etapa, compare as duas contribuições, veja por que o merge automático para e pratique um retorno seguro ao estado local original.
Abra Terminal e entre no repositório preparado de forma independente para este laboratório:
cd /home/labex/project/guide-team/editor
Configure uma identidade apenas para este repositório. --local evita alterar as configurações globais; as aspas mantêm o nome como um único valor. Estes valores fictícios são exemplos, não dados pessoais obrigatórios:
git config --local user.name "Guide Editor"
git config --local user.email "guide@example.com"
Leia o guia local preparado e depois busque a atualização do colega:
cat guide.txt
git fetch origin
Leia a versão do colega. revision:path seleciona um arquivo realmente registrado em um commit, e --no-pager o exibe diretamente:
git --no-pager show origin/main:guide.txt
Sua versão informa South entrance com 09:00-17:00; a do colega informa North entrance com 10:00-18:00. As decisões de negócio são independentes: use sua entrada sul e o novo horário do colega. Preserve a frase sobre a última entrada. Mantenha seu telefone de atendimento aos visitantes e a rampa à beira do rio do colega, presentes nas outras páginas.
Inicie o merge. --no-edit evita abrir um editor se o merge for concluído automaticamente. Aqui, espera-se que ele retorne um status diferente de zero e pare devido a um conflito de conteúdo. Execute-o separadamente e depois continue:
git merge --no-edit origin/main
Espere CONFLICT (content): Merge conflict in guide.txt e Automatic merge failed; fix conflicts and then commit the result. O Git não criou um novo commit.
Leia o status curto e o arquivo em conflito:
git status --short
cat guide.txt
UU guide.txt significa que o arquivo ainda não foi combinado. No arquivo, <<<<<<< HEAD inicia sua versão, ======= separa as alternativas e >>>>>>> origin/main encerra a versão do colega. Esses marcadores descrevem uma divergência; excluir apenas os marcadores deixaria linhas contraditórias. A página da rota pode já estar na área de preparação como M access.txt, porque o Git combinou essa alteração independente com sucesso.
Antes de resolver, pratique a recuperação. git merge --abort cancela apenas o merge inacabado, devolvendo os arquivos rastreados e o índice ao estado anterior ao merge. Este cenário começou limpo; no trabalho comum, registre em um commit ou guarde separadamente as edições não relacionadas antes de iniciar um merge.
git merge --abort
git status --short
Nenhuma alteração deve aparecer. Leia o guia novamente: a entrada sul original e o horário antigo voltaram.
cat guide.txt
Agora reinicie o mesmo merge. O conflito e o status diferente de zero são esperados novamente. Deixe este segundo conflito aberto para a próxima etapa:
git merge --no-edit origin/main
git status --short
O ponto de verificação espera um conflito ativo e não resolvido em guide.txt. Se digitar um caminho incorretamente, use pwd e ls e depois retorne com o comando cd completo acima. Não exclua .git nem reinicie a VM para se recuperar de um erro comum de navegação.
Resolva as Informações e Conclua o Merge
Nesta etapa, transforme o conflito em uma linha útil do guia, mantendo as páginas que o Git já combinou.
Permaneça em Terminal, em /home/labex/project/guide-team/editor, com o conflito da etapa anterior aberto. Você precisa de South entrance da sua contribuição e de 10:00-18:00 do colega. Escolher o arquivo inteiro de qualquer um dos lados perderia uma alteração aprovada.
O comando a seguir substitui apenas guide.txt por seu resultado completo de três linhas. > redireciona a saída para esse arquivo, substituindo seu conteúdo. <<'GUIDE' é um here-document: as linhas seguintes são uma entrada literal até uma linha que contenha apenas GUIDE. Copie o bloco inteiro, incluindo seu marcador final. Colocar o marcador entre aspas impede a expansão do shell dentro do texto. Não é necessário programar.
cat > guide.txt <<'GUIDE'
RIVERLIGHT GARDEN
Gate: South entrance; Hours: 10:00-18:00
Last entry is 30 minutes before closing.
GUIDE
Leia os três arquivos antes de prepará-los. A frase sobre a última entrada deve permanecer; access.txt deve conter a rampa à beira do rio; contacts.txt deve conter seu telefone atualizado.
cat guide.txt
cat access.txt
cat contacts.txt
Conteúdo esperado das páginas adicionais:
Step-free route: Use the riverside ramp
Visitor desk: 010-555-0120
git add registra o arquivo resolvido no índice e marca seu conflito como resolvido. Ele não cria um commit por si só:
git add guide.txt
Revise o que o merge adicionará em relação ao seu commit local original. diff --cached compara o resultado preparado com HEAD; --no-pager mantém a saída neste terminal:
git --no-pager diff --cached
Espere a alteração do horário em guide.txt e a alteração da rampa em access.txt. Sua entrada sul e seu telefone para visitantes já estavam no pai local, portanto não precisam aparecer como linhas recém-adicionadas nesta comparação. Confira os arquivos finais, além deste diff.
Se encontrar um erro de digitação, repita o bloco completo do guia com a correção e execute git add guide.txt novamente. Se quiser abandonar por completo a tentativa inacabada, use git merge --abort da etapa anterior, reinicie o merge e repita a resolução. Não use abort após concluir o commit.
Finalize o merge com uma mensagem descritiva. -m fornece a mensagem diretamente em vez de abrir um editor; outra redação significativa também é aceita:
git commit -m "Combine gate and opening hours"
Inspecione suas duas linhas de ancestralidade e a árvore de trabalho limpa:
git --no-pager log --oneline --graph --all --decorate
git status --short
Nenhuma saída de status é esperada. As mensagens das duas contribuições originais devem permanecer abaixo do novo merge. O ponto de verificação exige esse histórico e os arquivos completos e corretos, não apenas a ausência de marcadores de conflito.
Publique e Receba o Guia Completo
Nesta etapa, entregue a revisão combinada ao repositório compartilhado e leia-a em uma nova cópia de recebimento. Um merge local, por si só, ainda não entregou nada a outra cópia.
Permaneça em Terminal, em /home/labex/project/guide-team/editor. push origin main envia o histórico da main local ao repositório chamado origin. Desta vez, a contribuição compartilhada é um ancestral do seu merge, portanto o push pode avançar a main compartilhada sem removê-la.
git push origin main
Espere main -> main sem rejeição. Se houver rejeição, faça fetch e inspecione o grafo novamente; não adicione uma opção de força. Este cenário preparado não tem um colaborador atuando em segundo plano, mas uma equipe real pode publicar novos trabalhos a qualquer momento.
Agora mude para o diretório que contém os dois repositórios:
cd /home/labex/project/guide-team
git clone cria um novo repositório e arquivos de trabalho a partir de uma origem. Aqui, shared.git é o caminho da origem local existente e received-guide é o novo diretório de destino. A cópia de recebimento deve partir do repositório compartilhado, para revelar se o merge foi realmente entregue.
git clone shared.git received-guide
Espere Cloning into 'received-guide'... e done.. Se você já fez o clone ao experimentar, mantenha essa cópia: entre em received-guide e use git fetch origin, ensinado anteriormente, seguido de git merge --no-edit origin/main para atualizá-la. Não exclua o repositório de edição original para tentar um clone novamente.
Entre na cópia de recebimento:
cd received-guide
Leia cada arquivo real. cat exibe um arquivo sem alterá-lo:
cat guide.txt
cat access.txt
cat contacts.txt
Compare as informações com os requisitos de negócio combinados da etapa anterior. Os três arquivos devem estar completos, incluindo as linhas inalteradas. Uma mensagem de clone bem-sucedido, por si só, não comprova que as informações estão corretas.
Por fim, leia o histórico recebido. --oneline resume cada commit, --graph desenha seus vínculos com os pais e --decorate identifica os ponteiros de branch. --no-pager exibe a saída diretamente em vez de abrir um visualizador com rolagem.
git --no-pager log --oneline --graph --decorate
O merge no topo tem duas linhas de ancestralidade, incluindo as mensagens das duas contribuições originais e o commit inicial. Os IDs exatos dos seus commits variam. Confira se nenhum conteúdo foi perdido e se a cópia de recebimento está em main, com uma árvore de trabalho rastreada limpa:
git status --short
Nenhuma saída significa que não há alterações preparadas, não preparadas ou não rastreadas. Você entregou uma coleção útil de arquivos por meio de repositórios Git reais, todos nesta única máquina de treinamento.
Resumo
Você leu os dois lados de um conflito real, usou git merge --abort para se recuperar com segurança e depois compôs os campos corretos em vez de escolher um lado inteiro. Você manteve a rota combinada automaticamente, seu telefone para visitantes e a frase inalterada do guia.
O merge publicado e o clone independente de recebimento agora contêm o guia completo, com as duas contribuições originais preservadas. O desafio muda o manual e inverte qual colaborador tem cada campo correto.



