4 분 소요

이 장에서 배울 것

이번 장에서는 Git과 버전관리(version control)를 배웁니다. 버전관리는 파일이 언제, 어떻게, 왜 바뀌었는지 기록하는 방법입니다. 생물정보학 연구에서는 코드, 분석 설정, 작은 설명 문서가 계속 바뀝니다. 이 기록이 없으면 나중에 “이 그림은 어떤 코드로 만들었지?”라는 질문에 답하기 어렵습니다.

핵심 용어를 먼저 정리하겠습니다.

  • 버전관리(version control): 파일의 변경 이력을 기록하고 되돌릴 수 있게 하는 방식입니다.
  • Git: 가장 널리 쓰이는 버전관리 도구입니다. 앞으로는 Git이라고 부르겠습니다.
  • 저장소(repository): Git이 변경 이력을 관리하는 프로젝트 폴더입니다.
  • 커밋(commit): 특정 시점의 변경 내용을 하나의 기록으로 남긴 것입니다.
  • 스테이징(staging): 커밋에 넣을 파일을 고르는 중간 단계입니다.
  • 브랜치(branch): 같은 프로젝트에서 다른 실험 방향을 따로 진행하는 갈래입니다.
  • 병합(merge): 한 브랜치의 변경 내용을 다른 브랜치에 합치는 일입니다.
  • 원격 저장소(remote repository): GitHub 같은 외부 서버에 있는 저장소입니다.
  • pull request: 다른 사람에게 내 변경 내용을 검토하고 합쳐 달라고 요청하는 방식입니다.

Git과 버전관리

가장 쉬운 비유: 게임 저장 슬롯

게임을 하다가 중요한 지점마다 저장한다고 생각해 봅시다. 실수하면 이전 저장 지점으로 돌아갈 수 있습니다. Git의 커밋도 비슷합니다. 분석 코드가 잘 작동하는 시점마다 커밋을 남기면, 나중에 코드가 망가져도 과거 기록을 확인할 수 있습니다.

단, Git은 게임 저장보다 더 강력합니다. 단순히 되돌리는 것뿐 아니라, 어떤 줄이 바뀌었는지, 누가 바꿨는지, 왜 바꿨는지 메시지로 남길 수 있습니다.

Git의 기본 흐름

Git의 기본 흐름은 다음과 같습니다.

파일 수정
→ git status로 상태 확인
→ git add로 커밋할 파일 선택
→ git commit으로 변경 기록 저장
→ 필요하면 git push로 원격 저장소에 업로드

아주 작은 프로젝트에서 시작하면 다음처럼 진행할 수 있습니다.

git init
git status
git add analysis.py
git commit -m "Add first analysis script"

git init은 현재 폴더를 Git 저장소로 만듭니다. git status는 어떤 파일이 바뀌었는지 보여줍니다. git add는 다음 커밋에 넣을 파일을 고릅니다. git commit은 실제 기록을 남깁니다.

커밋 메시지는 연구 노트입니다

나쁜 커밋 메시지는 다음처럼 너무 모호합니다.

git commit -m "update"

좋은 커밋 메시지는 변경 내용을 짧게 설명합니다.

git commit -m "Filter low-quality cells before PCA"

생물정보학에서는 작은 분석 선택 하나가 결과를 바꿀 수 있습니다. 그래서 커밋 메시지는 단순한 코드 기록이 아니라 연구 노트에 가깝습니다.

브랜치는 안전한 실험 공간입니다

분석 코드를 바꿔 보고 싶은데 기존 결과를 망가뜨리고 싶지 않을 수 있습니다. 이때 브랜치를 씁니다.

git branch try-new-normalization
git switch try-new-normalization

이제 새 브랜치에서 정규화 방법을 바꿔 보다가 괜찮으면 원래 브랜치에 병합할 수 있습니다. 별로라면 버리면 됩니다. 브랜치는 “실험용 작업대”라고 생각하면 쉽습니다.

diff와 log는 과거를 보는 창입니다

git diff는 아직 커밋하지 않은 변경 내용을 보여줍니다.

git diff

git log는 커밋 기록을 보여줍니다.

git log --oneline

분석 결과가 갑자기 달라졌다면, diff와 log를 확인해서 어떤 코드 변경이 영향을 줬는지 추적할 수 있습니다.

.gitignore는 기록하지 않을 파일 목록입니다

모든 파일을 Git에 넣으면 안 됩니다. 대용량 FASTQ, BAM, 중간 결과 파일, 비밀번호가 들어 있는 설정 파일은 Git에 올리면 위험하거나 비효율적입니다. .gitignore 파일에는 기록하지 않을 파일 패턴을 적습니다.

data/raw/
results/tmp/
.env
*.bam

이 예시는 원시 데이터 폴더, 임시 결과 폴더, 비밀 설정 파일, BAM 파일을 Git 추적 대상에서 제외합니다.

GitHub는 백업이자 협업 장소입니다

Git은 내 컴퓨터에서도 쓸 수 있습니다. GitHub는 원격 저장소를 제공하는 서비스입니다. 원격 저장소에 코드를 올리면 다른 컴퓨터에서도 받을 수 있고, 동료와 함께 검토할 수 있습니다.

git remote add origin https://github.com/user/project.git
git push -u origin main

다만 인간 유전체 원본 데이터, 환자 정보, 개인 식별 정보는 공개 저장소에 올리면 안 됩니다. 코드와 작은 예제 데이터, 문서는 공개할 수 있지만 민감한 데이터는 별도 보안 규칙을 따라야 합니다.

실전 보강: 생물정보학에서 Git에 올리면 안 되는 것

Git은 코드와 작은 설정 파일을 추적하는 데 좋지만, 모든 파일을 넣는 도구는 아닙니다. FASTQ, BAM, 큰 HDF5 파일, 환자 개인정보가 들어 있는 원자료는 보통 Git에 올리면 안 됩니다.

Git에 적합: scripts/, Snakefile, README.md, environment.yml, 작은 예제 데이터
Git에 부적합: 수십 GB FASTQ/BAM, 개인식별정보, API key, 비밀번호

이런 파일은 .gitignore에 넣어 실수로 커밋되지 않게 해야 합니다.

실전 보강: 커밋은 작고 의미 있게

좋은 커밋은 나중에 분석 과정을 되짚을 수 있는 연구 노트입니다.

나쁜 예: update
좋은 예: Add mitochondrial QC filter for single-cell data
좋은 예: Fix sample_id join in variant annotation table

한 커밋에 분석 코드 수정, 결과 파일 교체, 환경 변경을 모두 넣으면 나중에 원인을 찾기 어렵습니다. 가능하면 “한 가지 의미 있는 변경”을 하나의 커밋으로 남기는 습관이 좋습니다.

초보자가 자주 하는 오해

  • 오해 1: GitHub에 올리면 자동 백업이므로 아무거나 올려도 된다. 민감 데이터와 대용량 원자료는 위험합니다.
  • 오해 2: commit은 최종 완성본에만 한다. 작은 단위로 자주 기록해야 되돌리기 쉽습니다.
  • 오해 3: branch는 고급 개발자만 쓴다. 분석 실험을 안전하게 분리할 때도 유용합니다.
  • 오해 4: Git은 데이터베이스 백업 도구다. Git은 코드 버전관리 도구에 가깝습니다.

이전 개념과 다음 개념의 연결

Git은 E20 환경 파일, E21 워크플로우 파일, E23 테스트 코드, E24 재현성 문서를 함께 관리하는 중심 도구입니다. 단, 실제 대규모 데이터는 별도의 스토리지와 checksum으로 관리해야 합니다.

생물정보학에서 왜 중요한가

계산생물학 연구는 코드가 곧 실험 과정입니다. 실험실에서 실험 노트를 남기듯이, 계산 연구자는 Git으로 코드의 실험 노트를 남깁니다. Git을 쓰면 분석이 망가졌을 때 되돌릴 수 있고, 논문 그림을 만든 코드의 정확한 버전을 추적할 수 있습니다.

미니 실습 블록: Git commit으로 분석 변경 추적하기

이 실습은 Git commit으로 분석 변경 추적하기를 직접 손으로 확인하는 연습입니다. 왜 필요한가 하면, 분석 코드와 설정이 바뀐 이유를 기록하지 않으면 나중에 어떤 코드로 그림을 만들었는지 알기 어렵기 때문입니다.

git status
git diff
git add scripts/run_qc.sh README.md
git commit -m "Add FASTQ QC script and document input paths"
git log --oneline

각 코드 요소의 의미를 풀어보면 다음과 같습니다. git status는 변경 상태, git diff는 바뀐 내용, git add는 커밋에 넣을 파일 선택, git commit은 기록 저장입니다.

생물정보학/계산생물학에서 쓰이는 장면은 분명합니다. QC 기준 변경, reference 버전 변경, Snakemake rule 수정 같은 분석 변경을 추적할 때 필요합니다.

흔한 오해 또는 주의점도 있습니다. update, fix 같은 메시지만 남기면 나중에 무엇을 왜 바꿨는지 알기 어렵습니다.

핵심 정리

Git은 프로젝트의 변경 이력을 관리하는 도구입니다. 기본 흐름은 수정, add, commit, push입니다. 커밋은 분석 기록이고, 브랜치는 안전한 실험 공간이며, .gitignore는 기록하지 않을 파일을 정하는 규칙입니다.

문제 풀이

Git과 버전관리

0 / 42
Gemini AI 채점

주관식 답안은 Gemini API로 채점합니다. API 키는 이 브라우저에만 저장됩니다.

API KEY 미등록
  1. 1. [객관식] 객관식

    버전관리의 설명으로 적절한 것은?

    선택지
  2. 2. [객관식] 객관식

    Git의 역할로 적절한 것은?

    선택지
  3. 3. [객관식] 객관식

    저장소(repository)에 대한 설명으로 적절한 것은?

    선택지
  4. 4. [객관식] 객관식

    커밋(commit)의 의미로 적절한 것은?

    선택지
  5. 5. [객관식] 객관식

    스테이징(staging)의 의미로 적절한 것은?

    선택지
  6. 6. [객관식] 객관식

    git status가 주로 알려주는 것은?

    선택지
  7. 7. [객관식] 객관식

    git add analysis.py의 의미로 적절한 것은?

    선택지
  8. 8. [객관식] 객관식

    git commit -m "message"의 역할은?

    선택지
  9. 9. [객관식] 객관식

    좋은 커밋 메시지에 가까운 것은?

    선택지
  10. 10. [객관식] 객관식

    브랜치(branch)의 설명으로 적절한 것은?

    선택지
  11. 11. [객관식] 객관식

    병합(merge)의 의미로 적절한 것은?

    선택지
  12. 12. [객관식] 객관식

    git diff의 용도로 적절한 것은?

    선택지
  13. 13. [객관식] 객관식

    .gitignore에 넣기 적절한 것은?

    선택지
  14. 14. [객관식] 객관식

    원격 저장소(remote repository)의 설명으로 적절한 것은?

    선택지
  15. 15. [객관식] 객관식

    git push의 의미로 적절한 것은?

    선택지
  16. 16. [객관식] 객관식

    git pull의 의미로 적절한 것은?

    선택지
  17. 17. [객관식] 객관식

    pull request의 설명으로 적절한 것은?

    선택지
  18. 18. [객관식] 객관식

    민감한 인간 유전체 원본 데이터를 공개 GitHub에 올리면 안 되는 이유는?

    선택지
  19. 19. [객관식] 객관식

    Git이 분석 재현성에 도움 되는 이유는?

    선택지
  20. 20. [객관식] 객관식

    git log --oneline의 역할로 적절한 것은?

    선택지
  21. 21. [객관식] 객관식

    .gitignore에 넣는 것이 가장 적절한 파일은?

    선택지
  22. 22. [객관식] 객관식

    API key나 비밀번호가 들어 있는 파일을 GitHub에 올리면 안 되는 이유는?

    선택지
  23. 23. [객관식] 객관식

    좋은 커밋 메시지에 가장 가까운 것은?

    선택지
  24. 24. [객관식] 객관식

    브랜치를 사용하는 이유로 적절한 것은?

    선택지
  25. 25. [객관식] 객관식

    git diff의 역할로 가장 적절한 것은?

    선택지
  26. 26. [객관식] 객관식

    git log로 주로 확인하는 것은?

    선택지
  27. 27. [객관식] 객관식

    한 커밋에 코드 수정, 데이터 교체, 환경 변경을 모두 섞으면 생기는 문제는?

    선택지
  28. 28. [객관식] 객관식

    Git에 올리기 적절한 생물정보학 프로젝트 구성은?

    선택지
  29. 29. [객관식] 객관식

    merge conflict가 생기는 대표 상황은?

    선택지
  30. 30. [객관식] 객관식

    재현성 관점에서 Git commit hash가 유용한 이유는?

    선택지
  31. 31. [실전] 객관식

    git diff의 역할은?

    선택지
  32. 32. [실전] 객관식

    좋은 commit message에 가까운 것은?

    선택지
  33. 주관식 33. [응용] 주관식 · Gemini 채점

    Git의 기본 흐름을 수정부터 원격 저장소 업로드까지 설명하라.

  34. 주관식 34. [응용] 주관식 · Gemini 채점

    커밋 메시지가 연구 노트처럼 중요한 이유를 설명하라.

  35. 주관식 35. [응용] 주관식 · Gemini 채점

    브랜치를 분석 실험 공간에 비유해 설명하라.

  36. 주관식 36. [응용] 주관식 · Gemini 채점

    .gitignore가 필요한 이유를 설명하라.

  37. 주관식 37. [응용] 주관식 · Gemini 채점

    GitHub에 올려도 되는 것과 조심해야 하는 것을 구분해 설명하라.

  38. 주관식 38. [응용] 주관식 · Gemini 채점

    Git이 계산생물학 연구 재현성에 기여하는 방식을 설명하라.

  39. 주관식 39. [응용] 주관식 · Gemini 채점

    생물정보학 프로젝트에서 Git에 넣을 파일과 넣지 않을 파일을 구분해 설명하라.

  40. 주관식 40. [응용] 주관식 · Gemini 채점

    좋은 커밋 단위와 메시지가 재현성에 왜 도움이 되는지 설명하라.

  41. 주관식 41. [실습] 주관식 · Gemini 채점

    수정한 scripts/run_qc.shREADME.md를 커밋하는 명령어 흐름을 작성하라.

  42. 주관식 42. [실습] 주관식 · Gemini 채점

    Git이 생물정보학 재현성에 도움이 되는 이유를 설명하라.