소개
정원의 다음 안내서 업데이트에서는 같은 줄에 두 가지 올바른 정보를 반영해야 합니다. 준비된 로컬 커밋은 방문객 출입구를 남쪽으로 옮기고 안내 데스크 전화번호를 바꿉니다. 팀원이 게시한 커밋은 운영 시간과 무단차 이동 경로를 바꿉니다. 최종 안내서에는 양쪽 정보가 모두 필요합니다.
이 실습은 독립적으로 준비된 저장소에서 시작하므로 이전 VM의 파일은 필요하지 않습니다. 실제 내용 충돌을 확인하고 미완성 병합을 취소하는 연습을 한 뒤, 올바른 필드를 조합하여 새 수신용 클론으로 결과를 전달합니다.
이전 가이드 실습을 완료했거나 원격 저장소 이름, 가져오기, 병합, 푸시, 복제를 이미 이해하고 있어야 합니다. 기본적인 터미널 경로 이동, 커밋, diff도 사전 지식으로 필요합니다. 소요 시간 45분은 저자의 추정치입니다.
충돌 읽고 안전하게 다시 시작하기
이 단계에서는 두 작업을 비교하고 자동 병합이 중단되는 이유를 확인한 다음, 원래 로컬 상태로 안전하게 돌아가는 연습을 합니다.
Terminal을 열고 이 실습을 위해 독립적으로 준비된 저장소로 들어가세요.
cd /home/labex/project/guide-team/editor
이 저장소에만 작성자 정보를 설정하세요. --local은 전역 설정을 바꾸지 않으며, 따옴표는 이름을 하나의 값으로 묶습니다. 다음 가상 값은 예시이며, 실제 개인정보를 입력할 필요는 없습니다.
git config --local user.name "Guide Editor"
git config --local user.email "guide@example.com"
준비된 로컬 안내서를 읽은 다음 팀원의 업데이트를 가져오세요.
cat guide.txt
git fetch origin
팀원의 버전을 읽으세요. revision:path는 실제 커밋된 파일을 선택하며, --no-pager는 바로 출력합니다.
git --no-pager show origin/main:guide.txt
자신의 버전에는 South entrance와 09:00-17:00이, 팀원의 버전에는 North entrance와 10:00-18:00이 적혀 있습니다. 업무상 결정은 서로 독립적입니다. 자신의 남쪽 출입구와 팀원의 새 운영 시간을 사용하세요. 마지막 입장 시간 문장을 보존하세요. 다른 페이지에서도 자신의 방문객 안내 데스크 전화번호와 팀원의 강변 경사로를 유지하세요.
병합을 시작하세요. --no-edit는 병합이 자동으로 완료될 경우 편집기가 열리지 않게 합니다. 여기서는 0이 아닌 상태를 반환하고 내용 충돌 때문에 멈추는 것이 정상입니다. 명령을 단독으로 실행한 뒤 계속 진행하세요.
git merge --no-edit origin/main
CONFLICT (content): Merge conflict in guide.txt와 Automatic merge failed; fix conflicts and then commit the result.가 표시되어야 합니다. Git은 새 커밋을 만들지 않은 상태입니다.
간결한 상태 출력과 충돌한 파일을 읽으세요.
git status --short
cat guide.txt
UU guide.txt는 파일이 아직 병합되지 않았다는 뜻입니다. 파일 안에서 <<<<<<< HEAD는 자신의 버전이 시작되는 지점이고, =======는 두 대안을 구분하며, >>>>>>> origin/main은 팀원 버전이 끝나는 지점입니다. 이 표식은 내용이 서로 맞지 않음을 나타냅니다. 표식만 지우면 모순되는 줄이 그대로 남습니다. 경로 페이지는 Git이 독립적인 변경을 성공적으로 병합했으므로 이미 M access.txt로 스테이징되어 있을 수 있습니다.
해결하기 전에 복구를 연습하세요. git merge --abort는 미완성 병합만 취소하여 추적 중인 파일과 인덱스를 병합 전 상태로 되돌립니다. 이 환경은 깨끗한 상태에서 시작했습니다. 일반적인 작업에서는 병합 전에 관련 없는 수정 사항을 커밋하거나 따로 보관하세요.
git merge --abort
git status --short
변경 사항이 표시되지 않아야 합니다. 안내서를 다시 읽으세요. 원래의 남쪽 출입구와 이전 운영 시간으로 돌아왔습니다.
cat guide.txt
이제 같은 병합을 다시 시작하세요. 다시 충돌하고 0이 아닌 상태가 반환되는 것이 정상입니다. 두 번째 충돌은 다음 단계를 위해 해결하지 않은 채 남겨 두세요.
git merge --no-edit origin/main
git status --short
확인 항목은 해결되지 않은 guide.txt 충돌이 진행 중인 상태를 요구합니다. 경로를 잘못 입력했다면 pwd와 ls를 사용한 다음 위의 전체 cd 명령으로 돌아오세요. 일반적인 이동 오류를 복구하려고 .git를 삭제하거나 VM을 초기화하지 마세요.
올바른 정보로 충돌 해결하고 병합 완료하기
이 단계에서는 Git이 이미 병합한 페이지를 유지하면서 충돌을 사용 가능한 안내서 한 줄로 정리합니다.
이전 단계의 충돌이 진행 중인 상태로 Terminal의 /home/labex/project/guide-team/editor에서 계속 진행하세요. 자신의 작업에서 South entrance를, 팀원의 작업에서 10:00-18:00을 가져와야 합니다. 어느 한쪽의 파일 전체를 선택하면 승인된 변경 하나를 잃게 됩니다.
다음 명령은 guide.txt만 완전한 세 줄의 결과로 교체합니다. >는 출력을 해당 파일로 보내 기존 내용을 덮어씁니다. <<'GUIDE'는 히어 도큐먼트(here-document)입니다. GUIDE만 있는 줄이 나올 때까지 이어지는 줄들을 그대로 입력으로 사용합니다. 마지막 표식까지 블록 전체를 복사하세요. 표식을 따옴표로 묶으면 텍스트 안에서 셸 확장이 일어나지 않습니다. 프로그래밍은 필요하지 않습니다.
cat > guide.txt <<'GUIDE'
RIVERLIGHT GARDEN
Gate: South entrance; Hours: 10:00-18:00
Last entry is 30 minutes before closing.
GUIDE
스테이징하기 전에 세 파일을 모두 읽으세요. 마지막 입장 시간 문장이 남아 있어야 하며, access.txt에는 강변 경사로가, contacts.txt에는 자신의 새 전화번호가 들어 있어야 합니다.
cat guide.txt
cat access.txt
cat contacts.txt
추가 페이지에 있어야 할 내용은 다음과 같습니다.
Step-free route: Use the riverside ramp
Visitor desk: 010-555-0120
git add는 해결한 파일을 인덱스에 기록하고 충돌을 해결된 것으로 표시합니다. 이 명령 자체가 커밋을 만들지는 않습니다.
git add guide.txt
원래 로컬 커밋과 비교하여 병합으로 무엇이 추가되는지 검토하세요. diff --cached는 스테이징된 결과를 HEAD와 비교합니다. --no-pager는 출력을 이 터미널에 바로 표시합니다.
git --no-pager diff --cached
guide.txt의 운영 시간 변경과 access.txt의 경사로 변경이 표시되어야 합니다. 남쪽 출입구와 방문객 전화번호는 이미 로컬 부모 커밋에 들어 있으므로, 이 비교에서 새로 추가된 줄로 표시될 필요가 없습니다. diff와 최종 파일을 모두 확인하세요.
오타가 보이면 전체 안내서 블록을 수정하여 다시 실행하고 git add guide.txt를 다시 실행하세요. 미완성 시도 전체를 취소하려면 이전 단계의 git merge --abort를 사용하고 병합을 다시 시작한 뒤 해결 과정을 반복하세요. 커밋을 완료한 뒤에는 abort를 사용하지 마세요.
작업을 설명하는 메시지로 병합을 마무리하세요. -m은 편집기를 여는 대신 메시지를 직접 지정합니다. 의미가 분명한 다른 문구도 허용됩니다.
git commit -m "Combine gate and opening hours"
두 갈래의 조상 이력과 깨끗한 작업 트리를 확인하세요.
git --no-pager log --oneline --graph --all --decorate
git status --short
상태 출력이 없어야 합니다. 원래 두 작업의 메시지는 새 병합 아래에 남아 있어야 합니다. 확인 항목은 단순히 충돌 표식이 없는 상태가 아니라, 이 이력과 완전하고 정확한 파일을 요구합니다.
완성된 안내서 게시하고 받기
이 단계에서는 병합한 리비전을 공유 저장소에 전달하고 새 수신용 복사본에서 읽어 봅니다. 로컬에서 병합한 것만으로는 다른 복사본에 아무것도 전달되지 않습니다.
Terminal의 /home/labex/project/guide-team/editor에서 계속 진행하세요. push origin main은 로컬 main 이력을 origin이라는 저장소에 보냅니다. 이번에는 공유 작업이 병합 커밋의 조상이므로, 해당 작업을 제거하지 않고 공유 main을 앞으로 이동시킬 수 있습니다.
git push origin main
거부 없이 main -> main이 표시되어야 합니다. 거부되면 다시 가져오고 그래프를 확인하세요. 강제 옵션을 추가하지 마세요. 이 준비된 환경에는 백그라운드에서 작업하는 팀원이 없지만 실제 팀에서는 언제든 새 작업이 게시될 수 있습니다.
이제 두 저장소가 들어 있는 디렉터리로 이동하세요.
cd /home/labex/project/guide-team
git clone은 원본으로부터 새 저장소와 작업 파일을 만듭니다. 여기서 shared.git는 기존 로컬 원본 경로이고, received-guide는 새 대상 디렉터리입니다. 수신용 복사본은 공유 저장소를 원본으로 삼아야 합니다. 그래야 병합이 실제로 전달되었는지 확인할 수 있습니다.
git clone shared.git received-guide
Cloning into 'received-guide'...와 done.이 표시되어야 합니다. 시험하면서 이미 복제했다면 그 복사본을 보존하세요. received-guide로 들어가 앞서 배운 git fetch origin과 git merge --no-edit origin/main을 차례로 실행하여 최신 상태로 만드세요. 복제를 다시 시도하려고 원래 편집용 저장소를 삭제하지 마세요.
수신용 복사본에 들어가세요.
cd received-guide
각 실제 파일을 읽으세요. cat은 파일을 변경하지 않고 출력합니다.
cat guide.txt
cat access.txt
cat contacts.txt
앞 단계에서 합친 업무 요구 사항과 정보를 비교하세요. 변경하지 않은 줄까지 포함하여 세 파일이 모두 완전해야 합니다. 복제 성공 메시지만으로 정보가 정확하다고 입증할 수는 없습니다.
마지막으로 수신용 이력을 읽으세요. --oneline은 각 커밋을 짧게 표시하고, --graph는 부모 연결을 그리며, --decorate는 브랜치 포인터에 이름표를 붙입니다. --no-pager는 스크롤 가능한 뷰어를 열지 않고 직접 출력합니다.
git --no-pager log --oneline --graph --decorate
맨 위 병합에는 원래 두 작업의 메시지와 최초 커밋을 포함하는 두 갈래의 조상 이력이 있습니다. 구체적인 커밋 ID는 실행마다 다릅니다. 내용이 손실되지 않았고 수신용 복사본이 main에 있으며 추적 중인 작업 트리가 깨끗한지 확인하세요.
git status --short
출력이 없으면 스테이징된 변경, 스테이징되지 않은 변경, 미추적 변경이 없다는 뜻입니다. 이제 하나의 교육용 머신에서 실행되는 실제 Git 저장소들을 통해 사용 가능한 파일 모음을 전달했습니다.
요약
실제 충돌의 양쪽 내용을 읽고 git merge --abort로 안전하게 복구한 다음, 어느 한쪽 전체를 선택하는 대신 올바른 필드를 조합했습니다. 자동으로 병합된 경로, 자신의 방문객 전화번호, 변경하지 않은 안내서 문장을 보존했습니다.
게시된 병합과 독립적인 수신용 클론에는 이제 완전한 안내서가 들어 있으며, 원래 두 작업도 보존되어 있습니다. 챌린지에서는 핸드북으로 대상을 바꾸고, 각 올바른 필드를 제공한 기여자의 역할도 뒤바꿉니다.



