Skip to main content

CLI & Git 기초

CLI와 Git은 “개인 작업”을 “팀이 재현 가능한 작업”으로 바꾸는 최소 도구입니다.

학습 목표

  • 반복 작업을 터미널 명령으로 자동화할 수 있습니다.
  • Git 브랜치/커밋/리뷰 흐름을 안정적으로 운영할 수 있습니다.
  • 실험 변경 이력을 재현 가능한 단위로 남길 수 있습니다.
  • .gitignore를 활용하여 불필요한 파일을 관리할 수 있습니다.

CLI 핵심 습관

  • 한 번 실행하고 끝나는 명령보다, 반복 가능한 스크립트를 우선합니다.
  • 출력은 파이프(|)와 리다이렉션(>)으로 조합합니다.
  • 긴 명령은 쉘 히스토리보다 스크립트 파일로 저장합니다.
# 최근 로그에서 에러만 추출
cat app.log | rg "ERROR"

# 명령 결과를 파일로 저장 (stdout + stderr)
python train.py > train.log 2>&1

# 백그라운드 실행 + nohup (SSH 끊어도 유지)
nohup python train.py > train.log 2>&1 &

자주 쓰는 CLI 명령어

목적명령설명
파일 찾기find . -name "*.py"현재 디렉터리 하위에서 Python 파일 검색
텍스트 검색rg "pattern" --type pyripgrep으로 빠른 패턴 검색
디스크 사용량du -sh */하위 디렉터리별 용량 확인
프로세스 확인ps aux | rg python실행 중인 Python 프로세스 확인
환경변수 확인echo $PATH현재 PATH 확인
파일 비교diff file1 file2두 파일의 차이 확인
압축/해제tar -czf archive.tar.gz dir/디렉터리 압축
원격 복사scp file user@host:/path서버로 파일 전송
alias를 활용하면 자주 쓰는 긴 명령을 짧게 줄일 수 있습니다. ~/.bashrc 또는 ~/.zshrcalias gs='git status'처럼 등록하세요.

Git 기본 워크플로우

1

브랜치 분리

작업 전 반드시 main에서 새 브랜치를 만듭니다.
git switch -c feature/data-validation
2

작업 및 커밋

작은 단위로 수정하고, 작은 단위로 커밋합니다.
git status
git add src/validate.py tests/test_validate.py
git commit -m "feat: add dataset schema validation"
3

원격 푸시 및 PR 생성

변경사항을 원격에 푸시하고 Pull Request를 생성합니다.
git push -u origin feature/data-validation
4

코드 리뷰 및 병합

PR에서 “무엇을 왜 바꿨는지” 설명하고, 리뷰 후 병합합니다.

브랜치 전략

전략브랜치 구성적합 팀 규모특징
Simplemain + feature/*1-3명가장 단순, 빠른 반복
GitHub Flowmain + feature/* + PR3-10명PR 리뷰 필수, CI 연동
Git Flowmain + develop + feature/* + release/* + hotfix/*10명+릴리스 주기가 긴 프로젝트
ML 프로젝트는 코드뿐만 아니라 실험 파라미터, 데이터 버전, 모델 산출물까지 관리 범위가 넓습니다. 코드는 Git, 데이터/모델은 DVC 또는 MLflow로 분리 관리하는 것이 일반적입니다.

커밋 품질 기준

  • 한 커밋은 한 가지 의도만 담습니다.
  • 커밋 메시지에 “무엇”과 “왜”를 포함합니다.
  • 대용량 산출물(.pt, .ckpt, .csv)은 기본적으로 저장소에 올리지 않습니다.
# 좋은 커밋 메시지 예시
git commit -m "feat: add batch inference endpoint for embedding model"
git commit -m "fix: resolve OOM error by reducing batch size to 32"
git commit -m "docs: update API schema for v2 migration guide"

# 나쁜 커밋 메시지 예시
git commit -m "fix"
git commit -m "update"
git commit -m "misc changes"

.gitignore 설정

AI/ML 프로젝트에서 반드시 제외해야 할 파일 목록입니다.
# Python
__pycache__/
*.pyc
.venv/
*.egg-info/

# ML 산출물 (대용량)
*.pt
*.ckpt
*.safetensors
*.bin
*.h5

# 데이터
data/raw/
*.csv
*.parquet
*.arrow

# 환경/비밀정보
.env
.env.*
*.key
credentials.json

# IDE
.vscode/
.idea/

# OS
.DS_Store
Thumbs.db

# 실험 로그 (MLflow/W&B 등으로 관리)
mlruns/
wandb/
outputs/
한 번이라도 Git에 커밋된 비밀정보(API 키, 비밀번호)는 히스토리에 남습니다. .gitignore에 추가해도 과거 커밋에서 여전히 노출됩니다. 이미 커밋된 비밀정보는 즉시 키를 회전(rotate)하세요.

자주 쓰는 Git 명령어

목적명령설명
상태 확인git status변경/스테이지 상태 확인
이력 확인git log --oneline -n 10최근 10개 커밋 요약
변경 비교git diff작업 디렉터리 변경사항 확인
스테이지 취소git restore --staged file스테이지에서 제거
브랜치 목록git branch -a로컬+원격 브랜치 전체 확인
원격 동기화git fetch --prune원격 변경사항 가져오기
충돌 해결 후git add . && git rebase --continue리베이스 충돌 해결 계속
임시 저장git stash / git stash pop작업 중 변경사항 임시 보관
초보 팀은 main + feature 브랜치 2단계만으로 시작하세요. 릴리스/핫픽스 브랜치는 팀 규모와 배포 주기가 올라갈 때 추가해도 늦지 않습니다.
  1. 충돌 파일 확인 → 2) 의도 기준으로 수동 병합 → 3) 테스트 실행 → 4) 병합 커밋. 충돌 자체보다, 병합 후 검증을 생략하는 것이 더 큰 사고 원인입니다.
실험 파라미터만 바꾸고 문서를 안 바꾸면 팀은 결과를 재현할 수 없습니다. 코드, 설정, 실행 방법, 결과 해석을 같은 변경 세트로 관리하세요.
Git LFS(Large File Storage)를 사용하면 대용량 파일을 별도 저장소에 보관하면서 Git 히스토리는 가볍게 유지할 수 있습니다. 단, ML 모델 산출물은 DVC 또는 MLflow Artifacts로 관리하는 것이 더 실용적입니다.

초보자 체크리스트

  • 브랜치 이름만 보고 작업 목적을 알 수 있나요?
  • 커밋 메시지에 문제 맥락이 포함되어 있나요?
  • .gitignore에 대용량 파일과 비밀정보가 포함되어 있나요?
  • 병합 전 최소 테스트를 실행했나요?
  • 팀원이 동일 명령으로 재현 가능한가요?

다음 문서