커밋 루프


지난 20분간 weather-app을 작업했다고 가정해보세요. src/index.js의 실제 버그를 수정했습니다. 온도 변환이 잘못되었었고, 그 과정에서 styles.css의 스타일링도 시작했지만 그 변경사항은 완성되지 않았으며 다른 사람에게 보여줄 준비가 되지 않았습니다. 지금 바로 버그 수정을 자신의 체크포인트로 저장하고 싶지만, 완성되지 않은 스타일링을 함께 포함하고 싶지는 않습니다.
이것이 바로 커밋 루프가 존재하는 이유입니다. 아직 저장소를 설정하지 않았다면, Your first repository에서 git init과 클로닝에 대해 설명합니다. 이제부터 이 장은 저장소가 열려있다고 가정합니다.
세 개의 정류장: 작업 디렉토리, 스테이징 영역, 커밋
Git의 모든 변경사항은 영구 기록이 되기 전에 세 개의 정류장을 지나갑니다. 작업 디렉토리는 지금 디스크에 있는 프로젝트이며, 현재 편집 중인 파일들입니다. **스테이징 영역**은 다음에 저장하고 싶은 변경사항을 정확히 배치하는 임시 보관 장소입니다. 커밋은 저장된 스냅샷 자체이며, 작성하면 이를 설명하는 메시지와 함께 저장됩니다.
이사를 할 때 짐을 싸는 것으로 생각해보세요. 전체 집은 작업 디렉토리입니다: 현재 상태가 어떤 것이든 당신이 소유한 모든 것입니다. 문 앞에 짐을 싸서 준비해놓은 상자들은 스테이징 영역입니다: 당신이 의도적으로 선택한 것만입니다. 그 상자들을 싣고 떠나는 이사 트럭은 커밋입니다: 정확히 무엇이 떠났는지, 언제 떠났는지에 대한 기록이며, 무엇이 들어있는지 설명하는 라벨이 붙어있습니다.
이 정신적 모델이 실제 터미널에서 어떻게 나타나는지 보겠습니다. weather-app의 두 파일을 모두 편집한 후, git status는 아무것도 변경하지 않고 현재 상태를 읽습니다:
$ git status
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: src/index.js
modified: styles.css
no changes added to commit (use "git add" to commit)파일 편집은 작업 디렉토리만 변경하기 때문에 두 파일 모두 "스테이징되지 않은" 상태로 표시됩니다. git add로 Git에게 해당 파일을 스테이징 영역에 놓으라고 지시할 때까지는 아무것도 스테이징 영역으로 이동하지 않습니다. 다음 섹션에서 이에 대해 설명합니다.
이것이 스테이징 영역이 존재하는 이유가 명확해지는 부분입니다. 스테이징 영역을 통해 작업 디렉토리의 다른 변경사항과 무관하게 커밋에 정확히 무엇이 들어갈지 선택할 수 있습니다. 스테이징 영역이 없다면, 체크포인트를 저장할 때마다 디스크의 모든 변경사항을 한 번에 가져가야 하므로 준비되지 않은 것도 함께 포함될 것입니다.
스테이징 영역이 있으면, src/index.js의 완성된 버그 수정만 스테이징하고, 완성되지 않은 styles.css는 제외한 후, 실제로 완성된 부분만 커밋할 수 있습니다. 스테이징과 작업 디렉토리가 동시에 다른 내용을 유지할 수 있다는 이 한 가지 세부사항은 첫 주에 거의 모든 사람을 혼란스럽게 합니다. 일단 이것을 이해하면, Git의 나머지 일상적인 워크플로우가 훨씬 더 명확해집니다.
git add로 무엇을 포함할지 선택하고, 이것이 완성된 변경사항 하나를 저장하면서 완성되지 않은 것을 제외할 수 있게 해줍니다. 변경사항 스테이징: git add
git add는 변경사항을 작업 디렉토리에서 스테이징 영역으로 이동합니다. 다음 커밋에 포함하고 싶은 파일을 지정하세요:
$ git add src/index.js
$ git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: src/index.js
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: styles.csssrc/index.js는 "커밋할 변경사항"으로 이동했습니다. 버그 수정은 스테이징되었고 준비되었습니다. styles.css는 여전히 "스테이징되지 않은" 아래에 나열되어 있으며, 이것이 리스타일링이 완성되지 않았을 때 원하는 상태입니다. git add styles.css도 실행하면 역시 스테이징됩니다; git add .은 현재 폴더의 모든 변경된 파일을 한 번에 스테이징하며, 디스크의 모든 것이 실제로 준비되었을 때 편리합니다.
git add <file>은 해당 파일의 현재 변경사항을 스테이징 영역으로 이동하며, 다음 커밋을 준비합니다. 아직 추가하지 않은 파일은 남아있으므로 한 가지를 완료하고 다른 것은 중간에 둘 수 있습니다. git add .은 모든 변경된 파일을 한 번에 스테이징하며, 모든 것이 실제로 준비되었을 때 편리합니다. 스냅샷 저장: git commit
스테이징 영역이 원하는 것을 보유하면, git commit은 이를 영구 스냅샷으로 저장합니다. -m 플래그 (message의 약자)는 함께 전달되는 설명을 제공합니다:
$ git commit -m "온도 변환 공식에서 섭씨-화씨 변환 버그 수정"
[main 4f2a1c9] 온도 변환 공식에서 섭씨-화씨 변환 버그 수정
1 file changed, 1 insertion(+), 1 deletion(-)스테이징한 것만 들어갔으므로 src/index.js만 들어갔습니다. styles.css는 여전히 작업 디렉토리에 편집된 채로 남아있으며, 리스타일링이 완료될 때까지 기다리고 있습니다. 짧은 아이디인 4f2a1c9는 정확히 이 커밋의 이름이며, History 장에서 이와 같은 프로젝트의 전체 커밋 목록을 읽는 방법을 다룹니다.
git commit -m "메시지"는 현재 스테이징된 것을 영구 스냅샷으로 저장하며, 제공한 메시지를 사용합니다. 스테이징하지 않은 것은 남아있고 편집 가능합니다. 메시지를 짧고 명확하게 유지하세요. 커밋이 무엇을 하는지 미래의 당신이 예상보다 더 자주 읽을 것입니다. 
