git add
Add file contents to the index
— Git 공식 매뉴얼(man git-add)
git add .을 남발하는 행위는 설사약과 지사제를 동시에 삼키고 결과를 기다리는 것과 같다. 아 맞다, 개인 계정 비번 적어둔 메모장 파일도 같이 들어갔다(...)
1. 개요
작업 디렉터리에서 수정한 변경 사항 중, 다음 커밋에 반영할 파일들을 엄선하여 준비 영역(Staging Area 또는 Index)으로 올리는 명령어다. 버전 관리 시스템에서 무지성 저장을 방지하고 개발자가 논리적인 단위로 버전을 쪼개어 만들 수 있도록 보장하는 아주 핵심적인 완충지대 역할을 한다.
2. 무지성 점(.)의 횡포
대부분의 초보 개발자들은 타이핑의 귀찮음을 이기지 못하고 항상 git add . 혹은 git add -A를 애용한다. 이는 현재 폴더 내부의 모든 변경 사항을 검열 없이 한꺼번에 웅장한 무대로 올려버리는 위험천만한 일이다. 배포되면 안 되는 로컬 전용 설정 파일(.env 등)이나 덩치가 몇 기가바이트씩 하는 테스트용 더미 파일들까지 함께 휩쓸려 들어가 GitHub 용량 초과 경고창을 유발하는 지름길이다.1
3. 장인의 정교한 칼질: 인터랙티브 스테이징
진정한 깃의 마스터들은 하나의 파일 안에서도 커밋할 코드 조각들을 세심하게 분리하여 스테이징한다. 이때 사용되는 구원투수가 바로 git add -p 옵션이다. 이 옵션을 켜면 변경된 코드 덩어리(Hunk)를 하나하나 짚어가며 '이 조각은 올릴래? 저 조각은 기각할래?'라고 물어보는 장인정신의 극치를 보여준다. 비록 손가락은 피곤할지언정, 극도로 깔끔하고 가독성 좋은 아름다운 커밋 히스토리를 가꿀 수 있게 된다.
4. 실제 사용 예시
특정 파일만 스테이징하려면 파일명을 직접 지정한다. 변경된 파일을 전부 올리는 .은 편하지만, 원하지 않는 파일까지 들어갈 수 있으니 커밋 전 status 확인이 필수다.
git add README.md src/app.ts
git status
# 현재 디렉터리 아래 변경 사항을 한꺼번에 스테이징
git add .
하나의 파일 안에서도 일부 변경만 커밋하고 싶다면 패치 모드를 쓴다.
git add -p src/app.ts
# 잘못 올린 파일을 스테이징에서 내리기
git restore --staged src/app.ts
5. 관련 밈 및 드립
5.1. 비밀번호 공공재화
보안 정보가 담긴 환경 변수 파일(.env 등)을 사전에 .gitignore에 등록하지 않은 채 무의식적으로 git add .을 쳐서 원격 저장소에 올린 후, 5초 만에 크롤링 봇에 털려 AWS 요금 폭탄 수천만 원 고지서를 받는 공포의 금융 치료 밈이다. 실제로 주니어 개발자들의 인생에 가장 깊은 영감을 선사하는 이벤트다.(...)
5.2. add 취소의 도돌이표
실수로 원하지 않는 거대한 라이브러리 폴더를 추가했다가 깜짝 놀라 git reset HEAD <file> 혹은 git restore --staged를 입력하여 내려보내고, 다시 마음을 가다듬고 git add를 하다가 또 손가락이 미끄러져 똑같은 참사를 무한히 반복하는 고전적인 서커스 쇼다.
6. 여담
- 스테이징 아레나: Index 혹은 Staging Area라고 불리는 영역은 물리적 디렉터리가 아니라
.git/index라는 단순 바이너리 인덱스 파일로 관리된다. - 트래킹의 기준: Git은 파일 자체보다는 '파일의 내용 변화'를 트래킹하므로, add를 한 이후에 파일을 다시 수정하면 수정한 그 뒷부분은 스테이징되지 않아 status에서 빨간색과 초록색에 동시에 걸치는 묘한 상황이 연출된다.
- 유령 파일: 이름만 바꾸고 내용을 그대로 둔 파일도 기특하게 알아채서
renamed상태로 자동 변환 처리해 준다.