승인된 메뉴 변경 커밋하기

GitBeginner
지금 연습하기

소개

DAYLIGHT CAFE에서 플랫 화이트 가격을 수정하려고 합니다. 가격 변경과 이에 맞는 포장용 메뉴 다운로드 파일은 이미 초안으로 준비되어 있습니다. 같은 메뉴 파일에는 아직 완성되지 않은 시즌 안내문도 섞여 있으며, 비공개 시음 메모는 공개용 커밋에 포함되면 안 됩니다.

다른 작업은 그대로 보존하면서 하나의 Git 커밋에 넣을 내용을 정확히 선택해 보겠습니다. 기본적인 터미널 경로 이동과 간단한 텍스트 파일에 익숙하면 됩니다. Git의 작업 트리, 스테이징 영역, 커밋 스냅샷은 이 실습에서 설명합니다. 웹사이트 프로그래밍이나 GitHub 계정은 필요하지 않습니다.

명령은 Workspace에서 실행하고, 편집 중인 파일은 Working Copy에서, 현재 커밋에 저장된 정확한 파일 내용은 Committed Menu에서 확인하세요. 두 페이지는 실제 내용을 읽으며, 누락된 파일을 대신 채워 넣지 않습니다. 카페, 삽화, 메뉴는 교육을 위해 직접 제작한 자료입니다. 인터페이스 레이블과 실행 출력은 영어로 유지됩니다.

두 메뉴 버전 살펴보기

이 단계에서는 공개 메뉴와 준비된 작업 파일을 비교한 다음, 이 저장소에만 적용되는 작성자 정보를 설정합니다.

Committed Menu를 여세요. 플랫 화이트 가격은 EUR 3.80이며, 시즌 안내판에는 음료를 기획 중이라는 내용이 표시됩니다. Download takeaway menu를 눌러 실제 텍스트 다운로드 파일을 여세요. 이 파일에도 EUR 3.80이 표시됩니다.

Working Copy로 전환하세요. 여기서는 플랫 화이트 가격이 EUR 4.20으로 바뀌어 있지만, 시즌 안내판에도 비공개 시음 안내가 들어 있습니다. 승인된 변경은 가격 수정뿐입니다. 두 공개 메뉴 파일의 가격은 모두 EUR 4.20이어야 합니다. 시즌 초안과 tasting-notes.txt는 커밋 밖에 둔 채 현재 머신에 보존해야 합니다.

Working Copy에는 미완성 시즌 안내문이 계속 표시됩니다.

작업 중인 메뉴에 승인된 가격과 비공개 시즌 초안이 함께 표시되어 있습니다.

Workspace로 전환하세요. 준비된 Git 저장소인 /home/labex/project/daylight-menu에서 열립니다. pwd로 현재 디렉터리를 출력하세요.

pwd

다른 곳으로 이동했다면 전체 경로를 사용해 돌아오세요.

cd /home/labex/project/daylight-menu

**저장소(repository)**는 프로젝트의 스냅샷과 이력을 저장합니다. **작업 트리(working tree)**는 직접 편집할 수 있는 파일들의 집합입니다. git status --short는 이 파일들이 마지막 커밋 및 스테이징 영역과 어떻게 다른지 요약합니다. --short는 간결한 표시 형식을 요청합니다.

git status --short

수정된 menu.txt, menu-download.txt와 함께 ?? tasting-notes.txt가 표시되어야 합니다. ??는 메모가 추적되지 않는다는 뜻입니다. 즉, Git이 아직 이 파일을 스냅샷에 추가하지 않았습니다. 파일을 수정했다고 해서 자동으로 커밋에 포함되지는 않습니다.

Git은 각 커밋에 작성자의 이름과 이메일을 기록합니다. git config --local은 이 저장소 안에만 설정을 저장합니다. 따옴표는 이름의 두 단어를 하나의 값으로 묶습니다. 다음 가상의 교육용 작성자 정보를 사용하세요.

git config --local user.name "Alex Morgan"
git config --local user.email "alex@example.test"

설정값을 다시 읽어 확인하세요.

git config --local user.name
git config --local user.email

Alex Morgan과 alex@example.test가 출력되어야 합니다. 전역 Git 작성자 정보나 외부 계정은 변경되지 않습니다. 이 실습의 이후 명령도 모두 같은 저장소에서 실행합니다.

승인된 가격 변경 덩어리만 스테이징하기

이 단계에서는 시즌 초안을 제외하고 승인된 가격 수정만 스테이징 영역에 넣습니다.

Workspace에서 계속 진행하세요. **커밋(commit)**은 저장된 스냅샷입니다. HEAD는 현재 커밋을 가리킵니다. **인덱스(index)**라고도 하는 **스테이징 영역(staging area)**에는 다음 커밋이 기록할 정확한 스냅샷이 들어 있습니다. 스테이징은 선택한 내용을 인덱스로 복사하는 작업이며, 작업 중인 다른 변경 사항을 삭제하지 않습니다.

--no-pager는 대화형 뷰어를 열지 않고 출력을 바로 표시하는 Git 옵션입니다. 아래 비교 명령에서 이 옵션을 사용하세요. 이전 Git 명령으로 이미 뷰어가 열려 (END)가 표시되어 있다면 q를 눌러 셸로 돌아오세요. 뷰어 안에 다음 명령을 입력하지 마세요.

git --no-pager diff는 작업 트리와 인덱스를 비교합니다. 구분자 --는 뒤에 오는 인수가 Git 옵션이 아니라 파일 이름임을 나타냅니다.

git --no-pager diff -- menu.txt

**변경 덩어리(hunk)**라고 부르는 두 변경 묶음을 찾아보세요. -로 시작하는 줄은 이전 내용이고, +로 시작하는 줄은 제안된 내용입니다. 첫 번째 덩어리는 플랫 화이트 가격을 3.80에서 4.20으로 바꿉니다. 두 번째는 시즌 안내문을 바꿉니다. @@ 줄은 각 덩어리의 위치를 나타내며 메뉴 내용 자체가 아닙니다.

git add --patch는 어떤 변경 덩어리를 인덱스로 복사할지 묻습니다. 스테이징된 스냅샷만 변경하며, 작업 파일의 전체 내용은 그대로 둡니다.

git add --patch menu.txt

플랫 화이트 가격 덩어리에서는 y를 입력하고 Enter를 눌러 스테이징하세요. 시즌 안내판 덩어리에서는 n을 입력하고 Enter를 눌러 스테이징하지 않은 상태로 남겨 두세요. 답할 때마다 표시된 내용을 먼저 읽으세요. y는 예, n은 아니요를 뜻합니다.

이제 실제로 스테이징된 차이를 살펴보세요. --cached는 HEAD와 인덱스를 비교하도록 지정합니다.

git --no-pager diff --cached -- menu.txt

가격 수정만 표시되어야 합니다. 아직 스테이징되지 않은 내용과 비교하세요.

git --no-pager diff -- menu.txt

여기에는 시즌 안내문만 표시되어야 합니다. 아직 아무것도 커밋하지 않았습니다.

잘못된 덩어리를 선택했다면 git restore --staged로 이 파일의 인덱스 항목을 HEAD의 내용으로 복원하세요. --staged는 인덱스만 대상으로 하므로 가격 수정과 초안은 작업 파일에 그대로 남습니다.

git restore --staged menu.txt

그런 다음 git add --patch menu.txt를 다시 실행해 가격 덩어리를 선택하고, 두 차이를 다시 확인하세요. 이 복구 작업은 작업 파일을 버리지 않으므로 커밋 전에 안전하게 사용할 수 있습니다.

가격이 일치하는 포장용 다운로드 포함하기

이 단계에서는 가격이 일치하는 다운로드 파일을 추가하고 스테이징된 모든 파일을 검토하여, 다음 커밋만으로 변경 사항이 완결되도록 합니다.

Workspace에서 계속 진행하세요. 카페는 웹페이지와 포장용 메뉴를 모두 제공합니다. 한쪽만 수정해 공개하면 서로 다른 두 가격이 남습니다. cat은 작은 텍스트 파일의 내용을 출력합니다.

cat menu-download.txt

이미 Flat white: EUR 4.20이 들어 있습니다. 이 파일에는 승인된 수정만 있으므로 파일 전체를 스테이징하세요.

git add menu-download.txt

일반 git add 명령은 지정한 파일을 스테이징합니다. 디렉터리 전체를 스테이징하지 마세요. 디렉터리에는 비공개 메모와 미완성 안내문도 들어 있습니다.

--name-only는 차이에 포함된 경로만 나열하고 내용은 표시하지 않습니다. 스테이징된 경로를 검토하세요.

git --no-pager diff --cached --name-only

목록에는 menu-download.txt와 menu.txt만 있어야 합니다. 이어서 스테이징된 차이 전체를 검토하세요.

git --no-pager diff --cached

두 공개 버전의 가격은 모두 4.20이어야 합니다. 시즌 안내문과 시음 메모는 표시되면 안 됩니다.

차이가 아니라 스테이징된 파일 전체를 읽으려면 git --no-pager show에 :menu.txt를 지정하세요. 앞의 콜론은 인덱스 항목을 선택합니다.

git --no-pager show :menu.txt

스테이징된 메뉴에는 EUR 4.20과 원래 시즌 문구인 Seasonal drinks are being planned.가 함께 들어 있습니다. 이 조합은 인덱스와 작업 트리의 내용이 서로 다를 수 있음을 보여 줍니다.

비공개 메모를 실수로 스테이징했다면 파일을 삭제하지 않고 스테이징만 취소하세요.

git restore --staged tasting-notes.txt

이 복구 명령은 메모를 스테이징한 경우에만 실행하세요. 그렇지 않으면 Git이 해당 미추적 경로를 알 수 없다고 올바르게 보고할 수 있습니다. 계속하기 전에 git --no-pager diff --cached를 다시 확인하세요. 파일 이름에 오타가 있으면 아무것도 바뀌지 않습니다. git status --short로 실제 이름을 찾은 다음 원래 실행하려던 명령을 다시 실행하세요.

커밋하고 실제 공개 결과 확인하기

이 단계에서는 하나의 목적에 집중한 커밋을 기록하고, 이후에도 미완성 작업이 남아 있음을 확인합니다.

Workspace에서 계속 진행하세요. git commit은 인덱스 전체를 새 스냅샷으로 기록합니다. -m은 짧은 설명 메시지를 지정하며, 따옴표는 메시지를 하나로 묶습니다.

git commit -m "Correct the flat white price"

Git은 새 커밋과 변경된 파일 두 개를 보고합니다. 해시는 실행마다 다릅니다. 메시지는 작업을 설명하지만, 중요한 것은 스냅샷의 실제 내용입니다.

git --no-pager show는 커밋에서 파일을 직접 읽을 수 있습니다. HEAD:menu.txt는 현재 커밋에 저장된 menu.txt라는 파일을 뜻합니다.

git --no-pager show HEAD:menu.txt
git --no-pager show HEAD:menu-download.txt

둘 다 승인된 가격인 4.20을 표시합니다. 커밋된 시즌 안내문은 여전히 음료를 기획 중이라고 안내합니다.

남은 작업을 확인하세요.

git status --short

M menu.txt와 ?? tasting-notes.txt가 표시되어야 합니다. 상태의 두 열은 왼쪽의 스테이징된 변경과 오른쪽의 스테이징되지 않은 작업 변경을 구분합니다. 두 번째 열의 M은 시즌 초안이 스테이징되지 않은 채 남아 있다는 뜻입니다. 메모도 여전히 미추적 상태입니다. 이 과제에서 상태 출력이 비어 있으면 잘못된 결과입니다. 보존해야 할 미완성 작업이 사라졌거나 커밋에 들어갔다는 뜻이기 때문입니다.

남은 차이와 메모를 읽어 보세요.

git --no-pager diff -- menu.txt
cat tasting-notes.txt

Committed Menu로 전환하고 페이지를 새로 고치세요. 플랫 화이트 가격이 EUR 4.20이고, 시즌 안내판에는 원래 공개 문구가 유지되는지 확인하세요. 포장용 메뉴를 다시 다운로드하여 실제 파일에도 같은 가격이 있는지 확인하세요. Working Copy로 전환하면 비공개 시음 초안이 여전히 보입니다.

커밋된 메뉴에는 승인된 가격과 원래 공개 시즌 안내문이 표시됩니다.

커밋된 메뉴에 수정된 플랫 화이트 가격과 원래 시즌 문구가 들어 있습니다.

이제 관련 없는 작업을 온전히 보존하면서 공개용 수정 하나를 완성했습니다. 푸시는 필요하지 않습니다. 이 프로젝트에서는 로컬 커밋의 범위를 배웁니다. 원격 협업은 별도 프로젝트에서 다룹니다.

요약

작업 파일, 인덱스, 커밋을 구분하고, 변경 덩어리 하나를 선택한 뒤 가격이 일치하는 다운로드를 포함하여 실제 커밋된 메뉴를 확인했습니다. 시즌 초안과 비공개 메모는 커밋 밖에 남겨 두었습니다. 유용한 커밋에는 우연히 수정된 모든 파일이 아니라, 의도한 변경 사항이 완전하게 들어 있어야 합니다.