Git으로 실험 코드 버전 관리하기
이 토픽을 마치면
Git으로 분석 코드의 변경 이력을 기록하고, 과거 버전으로 되돌리고, GitHub에 백업할 수 있습니다.
Git이 필요한 이유
연구실에서 이런 파일명을 본 적 있나요?
analysis_final.py
analysis_final_v2.py
analysis_final_v2_교수님수정.py
analysis_final_v2_교수님수정_진짜최종.pyGit은 하나의 파일에 모든 변경 이력을 저장합니다. 파일을 복사할 필요가 없습니다.
설치 & 초기 설정
Google Colab에는 Git이 이미 설치되어 있습니다. 이름과 이메일만 설정하면 됩니다.
git config --global user.name "Your Name"git config --global user.email "your@email.com"
# 설정 확인git config --list --global | grep user첫 번째 저장소 만들기
git init은 빈 실험 노트를 새로 펴는 것과 같습니다.
# 실습용 디렉토리 생성 + Git 초기화mkdir -p /tmp/bio-analysis && cd /tmp/bio-analysisgit init
# .git 폴더가 생성됨 (Git이 이력을 저장하는 곳)ls -la .git/첫 번째 커밋: 스냅샷 찍기
커밋(commit)은 실험 노트에 날짜를 찍고 "여기까지 완료"라고 적는 것입니다.
cd /tmp/bio-analysis
# 분석 스크립트 생성cat > gc_analysis.py << 'SCRIPT'"""GC Content 분석 스크립트 v1"""
def calculate_gc(sequence: str) -> float: seq = sequence.upper() gc = seq.count("G") + seq.count("C") return (gc / len(seq)) * 100
sequences = { "BRCA1": "ATGGATTTATCTGCTCTTCG", "TP53": "ATGGAGGAGCCGCAGTCAG",}
for name, seq in sequences.items(): print(f"{name}: GC={calculate_gc(seq):.1f}%")SCRIPT
# Git의 3단계: 작업 → 스테이징 → 커밋git add gc_analysis.py # 1. 스테이징 (사진 찍을 파일 선택)git status # 확인: 초록색 = 스테이징됨git commit -m "feat: GC content 분석 스크립트 초기 버전" # 2. 커밋 (스냅샷!)
# 이력 확인git log --oneline변경 추적: diff로 차이 보기
논문 교정 시 변경 사항을 빨간 펜으로 표시하듯, git diff는 무엇이 바뀌었는지 보여줍니다.
cd /tmp/bio-analysis
# 기존 파일이 없으면 생성if [ ! -f gc_analysis.py ]; then git init cat > gc_analysis.py << 'SCRIPT'"""GC Content 분석 스크립트 v1"""
def calculate_gc(sequence: str) -> float: seq = sequence.upper() gc = seq.count("G") + seq.count("C") return (gc / len(seq)) * 100
sequences = { "BRCA1": "ATGGATTTATCTGCTCTTCG", "TP53": "ATGGAGGAGCCGCAGTCAG",}
for name, seq in sequences.items(): print(f"{name}: GC={calculate_gc(seq):.1f}%")SCRIPT git add gc_analysis.py git commit -m "feat: GC content 분석 스크립트 초기 버전"fi
# 스크립트 수정: EGFR 유전자 추가cat > gc_analysis.py << 'SCRIPT'"""GC Content 분석 스크립트 v2 — EGFR 추가"""
def calculate_gc(sequence: str) -> float: seq = sequence.upper() gc = seq.count("G") + seq.count("C") return (gc / len(seq)) * 100
sequences = { "BRCA1": "ATGGATTTATCTGCTCTTCG", "TP53": "ATGGAGGAGCCGCAGTCAG", "EGFR": "ATGCGACCCTCCGGGACGGC",}
for name, seq in sequences.items(): gc = calculate_gc(seq) label = "HIGH" if gc > 60 else "NORMAL" print(f"{name}: GC={gc:.1f}% [{label}]")SCRIPT
# 변경 사항 확인git diff gc_analysis.py
# 커밋git add gc_analysis.pygit commit -m "feat: EGFR 추가 + GC 60% 이상 HIGH 라벨"
git log --oneline되돌리기: 과거로 여행
실험이 실패했을 때 이전 프로토콜로 돌아가듯, Git은 어떤 시점으로든 되돌아갈 수 있습니다.
cd /tmp/bio-analysis
# 기존 환경이 없으면 생성if [ ! -d .git ]; then git init git config user.name "Test" && git config user.email "test@test.com" echo "v1" > gc_analysis.py git add gc_analysis.py && git commit -m "v1" echo "v2" > gc_analysis.py git add gc_analysis.py && git commit -m "v2"fi
# 이력 보기git log --oneline
# 특정 파일만 이전 커밋 상태로 되돌리기FIRST_COMMIT=$(git log --oneline | tail -1 | cut -d' ' -f1)echo "첫 번째 커밋: $FIRST_COMMIT"
# 현재 내용 확인echo "--- 현재 ---"cat gc_analysis.py
# 첫 번째 커밋의 내용 확인 (되돌리기 전 미리보기)echo "--- 첫 커밋 ---"git show $FIRST_COMMIT:gc_analysis.py주의:
git checkout -- 파일명은 수정 사항을 되돌립니다 (커밋하지 않은 변경이 사라짐). 중요한 변경은 먼저 커밋하세요.
.gitignore: 추적 제외
실험에서 중간 산물(intermediate)은 보관하지 않듯, Git에서도 큰 데이터 파일이나 임시 파일은 제외합니다.
cd /tmp/bio-analysis
# .gitignore 생성 — 바이오 프로젝트용cat > .gitignore << 'EOF'# 대용량 데이터 (Git에 넣지 않음)*.fastq*.fastq.gz*.bam*.sam
# Python 캐시__pycache__/*.pyc.ipynb_checkpoints/
# 환경 설정 (개인 정보 포함 가능).env*.log
# OS 파일.DS_StoreThumbs.dbEOF
# 테스트: 큰 파일을 만들어도 Git이 무시하는지 확인echo "fake fastq data" > sample.fastqgit status # sample.fastq가 Untracked에 안 나오면 성공직접 해보기 (Faded Example)
아래 빈칸을 채워 Git의 기본 워크플로를 완성하세요.
# 1. 새 저장소 만들기git# 2. 파일을 스테이징 영역에 추가git analysis.py# 3. 스냅샷 저장git -m "first analysis script"
흔한 에러 & 해결법
Q: fatal: not a git repository
현재 디렉토리가 Git 저장소가 아닙니다. git init으로 초기화하거나, cd로 Git 저장소 폴더로 이동하세요.
Q: nothing to commit, working tree clean
변경 사항이 없습니다. 파일을 수정한 후 git add하세요. 이미 git add한 후라면 이미 커밋된 상태입니다.
Q: 실수로 큰 FASTQ 파일을 커밋했습니다
.gitignore에 *.fastq를 추가한 후, git rm --cached sample.fastq로 추적을 해제하세요 (파일 자체는 삭제되지 않음).
Q: 커밋 메시지를 잘못 썼습니다
git commit --amend -m "새 메시지"로 마지막 커밋 메시지를 수정할 수 있습니다 (아직 push하지 않은 경우에만).
다음 글에서는 Python으로 실험 데이터를 시각화하는 법을 배웁니다.