logo

git 버전 관리

Git

  • 버전 관리 시스템(Version Control System): 소프트웨어 개발에서 변경 이력을 체계적으로 저장해 "언제, 누가, 무엇을, 왜 바꾸었는가"를 추적하게 해주는 도구
  • Git은 현재 가장 널리 쓰이는 버전 관리 시스템 중 하나
  • 리눅스 소스 코드 관리를 위해 개발됨
  • 여러 작업 흐름을 분리하거나 합칠 수 있음
  • 이전 상태로 되돌릴 수 있음
  • 어떤 변경이 문제를 일으켰는지 추적할 수 있음
  • 여러 사람이 같은 프로젝트를 동시에 작업할 수 있음
  • 실험적인 수정과 안정적인 코드를 분리할 수 있음
  • 코드 변경의 맥락을 기록으로 남길 수 있음

에이전틱 코딩에서 버전 관리의 필요성

  • AI는 여러 파일에서 코드를 빠르게 많이 바꿈
  • 기존 기능을 깨뜨리거나 사람이 정확히 지시하지 않은 부분까지 바꿀 수 있음
  • 여러 개의 기능을 동시에 개발하기 위해 흐름을 분리하고 나중에 합치는 기능이 필요
  • 에이전트가 점점 오랜 시간 동안 작업하게 되면서 필요

git의 작동 원리

git-version-control-slide206-image01

  • 각 개발자는 로컬에 전체 이력을 가진 저장소(repo)를 둘 수 있음
    • 분산형 버전 관리
  • working directory: 실제 작업하는 디렉토리
  • 변경 내역을 staging area에 임시 저장
  • 커밋(commit)을 하면 staging된 내용이 저장소에 하나의 단위로 기록
    • 커밋 메시지를 통해 변경 내용에 대한 설명을 추가할 수 있음
  • 커밋을 로컬 저장소에서 원격 저장소로 보내거나(push), 가져올 수 있음

변경 확인

  • git status
    • 현재 작업 공간의 상태를 보여줌
    • 새로 생긴 파일(untracked)
    • 수정되었지만 아직 staging하지 않은 파일
    • git add로 staging된 파일
    • 현재 브랜치와 커밋 상태
  • git diff
    • staging하지 않은 변경 내용을 이전과 비교
  • git diff --staged
    • 다음 커밋에 들어갈 staging된 변경을 이전과 비교
git status
git diff
git diff --staged

변경 저장하기

  • git add
    • 커밋할 변경을 고름
  • git add <파일명>
    • 파일 하나를 고름
  • git add <폴더명>
    • 폴더 하나를 고름
  • git commit
    • 고른 변경들을 하나의 기록으로 남김
  • git commit -m "<메시지>"
    • 메시지 한 줄과 함께 바로 저장
  • git commit --amend
    • 직전 커밋을 수정
git add
git add <파일명>
git add <폴더명>
git commit
git commit -m "<메시지>"
git commit --amend

변경 되돌리기

  • git restore <file>
    • 아직 커밋하지 않은 파일 수정을 버리고 원상 복귀
  • git restore --staged <file>
    • staging한 변경을 내림
  • git reset
    • 최근 로컬 커밋을 되돌려서 커밋/스테이징 상태를 이전으로 이동
  • git reset --soft HEAD~1
    • 마지막 커밋을 취소하지만 변경 내역은 남김
  • git reset --hard HEAD~1
    • 마지막 커밋을 취소하고 변경 내역도 원상 복귀
git restore <file>
git restore --staged <file>
git reset
git reset --soft HEAD~1
git reset --hard HEAD~1

.gitignore: 저장하지 않을 파일 정하기

  • .gitignore는 Git이 추적하지 않을 파일과 폴더를 지정하는 설정 파일
  • 코드와 함께 저장하면 안 되는 파일을 실수로 커밋하는 것을 방지
    • 비밀 정보: .env, API key, 인증 파일
    • 임시 파일: 로그, 캐시, 빌드 결과
    • 대용량 파일: 데이터셋, 모델 파일, 다운로드 자료
    • 개인 환경 파일: 가상환경, IDE 설정 일부
  • 이미 Git이 추적 중인 파일은 .gitignore에 추가해도 자동으로 제외되지 않음
  • 필요하면 git rm --cached <파일명>으로 추적만 해제
.env
__pycache__/
.venv/
node_modules/
*.log
git rm --cached <파일명>

git log와 git show: 변경 이력 읽기

  • git log는 지금까지 저장된 커밋 이력을 보여줌
    • 누가, 언제, 어떤 메시지로 변경을 저장했는지 확인
    • 특정 시점으로 돌아가거나 문제의 원인을 찾을 때 사용
  • git show는 특정 커밋의 상세 내용을 보여줌
git log
git log --oneline
git log --oneline --graph --all
git show <커밋해시>
git show HEAD
git show HEAD~1

브랜치: 기능 추가와 실험을 분리

  • 브랜치는 Git에서 작업 흐름을 분리하는 방법
  • 실제로는 커밋을 가리키는 가벼운 이동 가능한 포인터
  • 브랜치가 필요한 이유
    • 안정적인 코드와 실험 코드를 분리
    • 여러 작업을 동시에 진행
    • 완성된 변경만 나중에 합칠 수 있음
  • git switch 대신 git checkout도 가능
git branch <브랜치명>
git switch <브랜치명>
git switch -c <브랜치명>

Worktree: 여러 작업을 병렬로 돌리는 개발 환경

  • git worktree는 하나의 Git 저장소에서 여러 작업 폴더를 만들어, 서로 다른 브랜치를 동시에 열어둘 수 있게 해주는 기능
  • 에이전틱 코딩에서 AI에게 여러 작업을 동시에 맡기고 싶을 때 사용
  • 일반 브랜치만 쓰면 한 폴더에서 계속 git switch를 해야 함
  • worktree를 쓰면 작업마다 별도 폴더가 생기므로 여러 Codex/Claude Code 세션을 각각 다른 폴더에서 동시에 실행 가능
git worktree add ../<워크트리명>
구분BranchWorktree
역할작업 이력을 분리작업 폴더를 분리
위치같은 폴더 안에서 전환서로 다른 폴더로 동시에 존재
사용 방식git switch로 이동각 폴더에서 독립적으로 작업
Previous
에이전틱 코딩의 도구들