교재 홈: 바이브 코더를 위한 코딩 기초 학습

**버전 관리(version control)**는 파일의 여러 상태와 바뀐 이유를 기록해 비교하고 돌아볼 수 있게 하는 일입니다. **Git(깃)**은 이를 돕는 도구이고, **저장소(repository)**는 Git이 파일의 변경 이력을 관리하는 공간입니다. GitHub는 저장소를 외부 서버에서 보관하고 함께 작업하는 기능을 제공하는 서비스입니다. 서버는 요청을 받아 자료나 기능을 제공하는 프로그램 또는 컴퓨터로, 10. 웹과 API — 요청·응답과 화면 표시를 연결하기에서 다룹니다. Git은 인터넷에 올리지 않고 개인 컴퓨터 안에서도 사용할 수 있습니다.

이 장에서는 AI가 바꾼 내용을 읽고 원하는 상태를 저장하며 복구 범위를 구별합니다. 기존 파일과 새 파일의 차이를 보여 주는 비교를 **diff(디프)**라고 합니다.

세 상태 구분

**작업 폴더(working tree)**는 지금 편집하고 있는 파일 상태입니다. **스테이징 영역(index)**은 다음 기록에 넣을 내용을 골라 두는 중간 공간입니다. **커밋(commit)**은 그렇게 고른 상태를 변경 이력에 남기는 기록 단위이며, 커밋한다는 말은 그 기록을 만드는 동작을 뜻합니다. 현재 선택한 커밋을 가리키는 Git 이름이 HEAD입니다. 컴퓨터의 물리적인 머리 부분을 말하는 것이 아닙니다.

파일을 저장하는 것, 다음 커밋에 넣을 내용을 고르는 것, 커밋을 만드는 것은 서로 다른 단계입니다. git add 뒤에 다시 편집했다면 나중 편집은 자동으로 스테이징되지 않습니다. **추적(tracking)**은 Git이 해당 파일을 이력 관리 대상으로 알고 있다는 뜻이고, 미추적 파일은 아직 그런 대상으로 추가하지 않은 파일입니다.

명령 확인하는 것
git status 추적·수정·스테이징 상태
git diff 작업 폴더와 스테이징 영역 사이의 차이
git diff --staged 스테이징 영역과 현재 커밋 사이의 차이
git diff HEAD -- 파일명 해당 파일의 현재 커밋 대비 작업 상태
git log --oneline 커밋 이력의 짧은 목록

새로 만든 미추적 파일은 일반 git diff에 본문이 나오지 않을 수 있습니다. git status로 새 파일의 존재도 함께 확인해야 변경 전체를 놓치지 않습니다.

저장소 초기화와 제외 규칙

**초기화(initialization)**는 필요한 기본 구조를 만들어 사용을 시작할 상태로 준비하는 일입니다. git init은 현재 프로젝트에 Git 저장소의 기본 구조를 만듭니다. 아래 명령은 Python 파일 안에 적는 코드가 아니라 1장에서 사용한 터미널 명령입니다.

설치는 Git 공식 사이트의 운영체제별 안내를 확인합니다. git --version이 동작하면, 연습 프로젝트 폴더 안에서 다음 명령을 실행합니다. 이 교재의 명령은 학습자가 직접 연습할 절차이며, 교재 작성 과정에서 사용자의 저장소에 커밋하거나 푸시한 것은 아닙니다.

git init
git status

프로젝트에 .gitignore 파일을 만들고 다음 내용을 저장합니다.

.venv/
__pycache__/
*.pyc
.env
.env.*
!.env.example
output/
*.db

가상 데이터가 담긴 data/reading.csv는 학습 재현을 위해 추적할 수 있지만 실제 개인 데이터는 별도로 판단해야 합니다. .gitignore는 이미 추적된 파일이나 이전 커밋에 들어간 비밀정보를 없애지 않습니다. 키가 노출됐다면 파일에서 지우는 조치와 키를 폐기·교체하는 조치가 모두 필요합니다.

제외 규칙의 /는 해당 폴더를, *는 여러 글자와 맞아도 된다는 표시를, !는 앞의 제외 규칙에서 다시 포함할 예외를 나타냅니다. 이런 특별한 기호로 이름 묶음을 지정하는 방식을 **패턴(pattern)**이라고 합니다. 예를 들어 *.pyc는 끝이 .pyc인 파일입니다. .pyc는 Python이 다시 실행할 때 활용하도록 만든 중간 형태의 파일이며, 처음 학습할 때 직접 편집할 대상은 아닙니다.

작은 커밋 만들기

Git에서 **로컬(local)**은 자신의 컴퓨터 안, **원격(remote)**은 다른 컴퓨터나 서비스 쪽을 뜻합니다. **푸시(push)**는 로컬 커밋을 원격 저장소에 보내는 동작입니다. 아래 연습은 로컬에서 상태를 저장하며 푸시를 요구하지 않습니다. 남에게 공유한 이력인지 여부에 따라 복구 방법의 영향도 달라집니다.

먼저 한 파일의 상태를 저장하는 것으로 연습합니다. 작성자 정보가 설정되지 않아 커밋이 중단되면 Git의 안내에 따라 이 연습 저장소에 사용할 이름과 이메일을 설정합니다. 공유할 저장소라면 이 정보가 이력에 남는다는 점도 확인합니다. 자신의 정보를 교재의 가상 값으로 덮어쓰지는 않습니다.