커밋의 3단계 — 장바구니에 담고 결제합니다
Article
5강에서 memo.txt 를 만들고 git status 를 쳤더니 Untracked 라는 말이 나왔습니다. 이번 시간에 그 상태를 넘겨서 첫 기록을 남깁니다.
그런데 순서를 하나 바꿔서 갑니다. 제대로 하는 법을 먼저 알려주지 않고, 일부러 틀리게 해보겠습니다. 이 자리는 거의 모든 사람이 한 번은 걸리는 곳이라, 미리 걸려보고 넘어가는 편이 낫습니다.
일부러 한 번 막혀봅니다
기록을 남기는 명령어는 git commit 입니다. 5강에서 만든 폴더에서 그대로 쳐봅니다.
- $ git commit -m "첫 기록"
- On branch master
- No commits yet
- Untracked files:
- (use "git add <file>..." to include in what will be committed)
- memo.txt
- nothing added to commit but untracked files present (use "git add" to track)
파일은 분명히 있는데 아무것도 기록되지 않았습니다. 마지막 줄이 이유를 말해줍니다. nothing added to commit — 결제할 것이 하나도 없다는 뜻입니다.
파일이 있는데 왜 없다고 할까요. 여기서 비유가 필요합니다.
인터넷 쇼핑과 똑같습니다
쇼핑몰에서 물건을 삽니다. 상품 페이지를 아무리 오래 들여다봐도 결제창에는 아무것도 안 뜹니다. 마음에 든 물건을 장바구니에 담아야 결제 대상이 됩니다. 그리고 결제 버튼을 누르는 순간 그 목록이 주문 하나로 확정되고, 장바구니는 비워집니다.
깃이 정확히 이 순서로 돌아갑니다. 폴더에 파일이 있는 것은 진열대에 물건이 있는 것일 뿐입니다. 담지 않았으니 결제할 게 없다고 하는 겁니다.
- 폴더진열대 — 파일을 만들고 고치는 곳. 여기 있다고 기록되지 않는다
- 스테이지장바구니 — 이번에 기록할 것만 골라 담아두는 곳
- 저장소결제 완료 — 기록으로 확정된다. 장바구니는 비워진다
세 자리에 붙은 이름이 자료마다 조금씩 다릅니다. 지금은 비유로 기억해두면 충분하고, 뒤에서 영어 단어를 만났을 때 알아볼 수만 있으면 됩니다.
| 비유 | 우리말 | 영어로 보이는 것 | 옮기는 명령어 |
|---|---|---|---|
| 진열대 | 작업 폴더 | Working Directory | — |
| 장바구니 | 스테이지 | Staged · Index | git add |
| 결제 완료 | 저장소 | Repository · Commit | git commit |
담습니다 — git add
장바구니에 담아봅니다. 이번에는 add 를 먼저 칩니다.
- $ git add memo.txt
- $ git status
- On branch master
- No commits yet
- Changes to be committed:
- (use "git rm --cached <file>..." to unstage)
- new file: memo.txt
add 자체는 아무 말도 안 합니다. 4강에서 말한 대로 잘 되면 조용합니다. 대신 git status 의 문장이 바뀌었습니다.
Untracked files 였던 자리가 Changes to be committed 로 바뀌었습니다. "기록될 예정인 것들"이라는 뜻입니다. 장바구니에 담긴 상태입니다.
add 전후로 git status 가 하는 말담기 전
Untracked files:- 깃이 보긴 했지만 담지는 않았다
- 이대로
commit하면 아무것도 안 남는다
담은 뒤
Changes to be committed:- 이번 기록에 들어갈 목록이다
- 이제
commit이 통한다
결제합니다 — git commit
이제 아까 실패했던 명령을 그대로 다시 칩니다.
- $ git commit -m "메모 파일 추가"
- [master (root-commit) 3f2a1b9] 메모 파일 추가
- 1 file changed, 1 insertion(+)
- create mode 100644 memo.txt
기록이 하나 남았습니다. 1강에서 말한 세이브 슬롯 한 칸이 이렇게 찍힙니다. 이 한 칸을 커밋이라고 부릅니다.
출력이 낯설어 보이지만 뜯어보면 별것 없습니다.
| 조각 | 뜻 |
|---|---|
master | 가지 이름. 21강에서 다룬다 |
root-commit | 이 저장소의 첫 커밋이라는 표시. 처음 한 번만 나온다 |
3f2a1b9 | 이 커밋에 붙은 번호. 7강에서 다시 만난다 |
메모 파일 추가 | 내가 적은 메시지 |
1 file changed, 1 insertion(+) | 파일 1개, 추가된 줄 1개 |
결제가 끝났으니 장바구니는 비워졌을 것입니다. 확인해 봅니다.
- $ git status
- On branch master
- nothing to commit, working tree clean
working tree clean — 폴더와 마지막 기록이 똑같다는 뜻입니다. 고친 게 없다는 말입니다. 이 문장이 나오면 지금까지 한 일이 전부 안전하게 남았다는 신호라서, 앞으로 자주 보게 됩니다.
왜 굳이 두 번 시키나
여기서 한 번쯤 이런 생각이 듭니다. 어차피 다 기록할 건데 왜 담는 단계를 따로 두는가.
파일을 하나만 고칠 때는 확실히 번거롭습니다. 그런데 파일 다섯 개를 고쳤고 그중 셋만 이번 기록에 넣고 싶을 때, 담는 단계가 없으면 방법이 없습니다. 골라 담을 수 있다는 것이 이 단계의 존재 이유입니다.
파일이 여러 개일 때 하나씩 치는 대신 점 하나로 한 번에 담을 수도 있습니다. git add . 입니다. 지금 폴더 안에서 바뀐 것을 전부 담으라는 뜻입니다. 편하지만, 넣으면 안 되는 파일까지 같이 딸려 들어가기 쉽습니다. 9강에서 이걸 막는 방법을 배우기 전까지는 파일 이름을 직접 치는 편이 안전합니다.
한 번 더 해봅니다
같은 흐름을 한 번 더 돌려보면 몸에 붙습니다. memo.txt 를 열어 두 번째 줄을 아무거나 쓰고 저장한 다음, add 하고 commit 합니다.
- 01
memo.txt에 한 줄 더 쓰고 저장합니다내용은 아무거나 좋습니다. 저장을 꼭 합니다
- 02
git status로 확인합니다이번에는
Untracked가 아니라Changes not staged for commit아래에modified: memo.txt로 나옵니다. 새 파일이 아니라 고친 파일이기 때문입니다 - 03
git add memo.txt담습니다
- 04
git commit -m "메모에 한 줄 추가"결제합니다. 이번에는
root-commit이라는 말이 안 나옵니다
이제 이 폴더에 커밋이 두 개 쌓였습니다. 쌓인 기록을 어떻게 들여다보는지는 다음 강의 내용입니다.
정리하면
- 파일이 폴더에 있다고 기록되지 않습니다. 담아야 결제됩니다
- 세 자리를 오갑니다. 폴더(진열대) → 스테이지(장바구니) → 저장소(결제 완료)
git add 파일이름으로 담고,git commit -m "메시지"로 확정합니다git status는 지금 어느 단계에 있는지 알려줍니다. 막히면 제일 먼저 칩니다Untracked는 안 담긴 새 파일,Changes to be committed는 담긴 것,working tree clean은 전부 기록된 상태입니다- 담는 단계가 따로 있는 이유는 골라 담기 위해서입니다
-m을 빠뜨리면 편집기가 열립니다. Vim 이면:q!로 빠져나옵니다
다음 7강에서는 쌓인 기록을 읽습니다. 카톡 대화를 위로 스크롤하는 것과 같습니다. 언제 무슨 커밋을 남겼는지 목록으로 보고, 한 커밋에서 정확히 어느 줄이 어떻게 바뀌었는지까지 봅니다. 방금 남긴 커밋 두 개가 그 실습 재료가 됩니다.