Git 미드레벨 기술면접

Git 미드레벨 (3~7년) 종합 5문항 조회수 50 · 2026-07-11 (토) 11:11:05
1 Git 내부 구조
Medium

Q. Git의 index(staging area)는 실제로 어떤 파일 형태로 저장되며, 이 구조가 부분적 커밋(partial commit)과 충돌 해결에 어떻게 활용되나요? index의 3단계 슬롯(stage 0, 1, 2, 3)의 역할도 함께 설명해주세요.

A. 모범답안

Git의 index는 .git/index 파일에 바이너리 형태로 저장되며, 각 파일의 경로, 모드, SHA-1, 타임스탬프 정보를 포함합니다. 부분적 커밋 시 index에 추가된 파일만 커밋 객체에 포함되어 작업 디렉토리와 다른 스냅샷을 만들 수 있습니다. 충돌 발생 시 stage 0은 정상 파일, stage 1은 공통 조상(base), stage 2는 현재 브랜치(ours), stage 3은 병합 대상(theirs)을 저장하여 3-way merge를 지원합니다. git ls-files -s 명령으로 각 단계의 파일을 확인할 수 있으며, 충돌 해결 후 git add로 stage 0으로 통합됩니다.

핵심 포인트
  • • .git/index 파일에 바이너리 형태로 저장되며 파일 메타데이터와 SHA-1 해시 포함
  • • 부분적 커밋 시 index에 추가된 파일만 커밋되어 선택적 스냅샷 생성 가능
  • • 충돌 시 stage 1(base), 2(ours), 3(theirs)로 분리 저장하여 3-way merge 지원
  • • git add로 충돌 해결 시 stage 0으로 통합되어 정상 상태로 복귀
Follow-up 질문

대용량 프로젝트에서 index 파일 자체가 수백 MB로 커질 때 성능 문제가 발생할 수 있습니다. split-index 기능은 이를 어떻게 해결하나요?

2 Git 성능 최적화
Hard

Q. Git의 delta compression과 bitmap index의 동작 원리를 설명하고, 이들이 clone, fetch, push 성능에 미치는 영향을 분석해주세요. 특히 reachability bitmap이 객체 탐색을 어떻게 최적화하는지 설명해주세요.

A. 모범답안

Delta compression은 git gc 실행 시 유사한 객체들을 찾아 차이(delta)만 저장하는 방식으로, packfile 크기를 크게 줄입니다. Base 객체와 delta chain을 구성하며, 너무 긴 chain은 압축 해제 성능을 저하시킵니다. Bitmap index는 각 커밋에서 도달 가능한 모든 객체를 비트맵으로 미리 계산하여 저장하므로, clone이나 fetch 시 전송할 객체를 빠르게 계산할 수 있습니다. pack.writeBitmaps 옵션으로 활성화되며, 특히 대규모 저장소에서 객체 그래프 탐색 시간을 수십 배 단축시킵니다. 하지만 bitmap 생성 자체에 시간이 걸리고 추가 디스크 공간을 사용하는 트레이드오프가 있습니다.

핵심 포인트
  • • Delta compression은 유사 객체 간 차이만 저장하여 packfile 크기 감소
  • • Delta chain이 너무 길면 압축 해제 시 성능 저하 발생
  • • Reachability bitmap은 커밋별 도달 가능 객체를 비트맵으로 사전 계산
  • • Clone/fetch 시 객체 그래프 탐색 시간을 대폭 단축하지만 생성 비용과 저장 공간 필요
Follow-up 질문

pack.deltaCacheSize와 pack.windowMemory 설정이 delta compression 성능에 어떤 영향을 미치며, 메모리가 제한된 환경에서는 어떻게 튜닝해야 하나요?

3 Git 워크플로우 설계
Medium

Q. Feature Flag를 활용한 개발 방식과 Git 브랜치 전략을 결합하여 지속적 배포(Continuous Deployment)를 구현하려고 합니다. 미완성 기능을 main 브랜치에 통합하면서도 프로덕션 안정성을 유지하는 워크플로우를 설계하고, 브랜치 수명을 최소화하는 전략을 제시해주세요.

A. 모범답안

Trunk-based Development 방식으로 모든 개발자가 main 브랜치에 직접 또는 1-2일 내 병합되는 짧은 feature 브랜치로 작업합니다. 미완성 기능은 Feature Flag로 감싸서 프로덕션에서 비활성화하고, 테스트 환경에서만 활성화하여 검증합니다. CI/CD 파이프라인은 main 브랜치 커밋마다 자동 배포하되, Feature Flag 설정은 별도 관리 시스템에서 런타임에 제어합니다. 이를 통해 긴 수명의 feature 브랜치로 인한 통합 지옥을 방지하고, 작은 단위의 잦은 통합으로 충돌을 최소화하며, 배포와 기능 출시를 분리할 수 있습니다. 브랜치 보호 규칙과 자동화된 테스트로 main 브랜치 품질을 보장합니다.

핵심 포인트
  • • Trunk-based Development로 짧은 수명의 브랜치 유지 (1-2일 내 병합)
  • • Feature Flag로 미완성 기능을 프로덕션에서 비활성화하여 안정성 유지
  • • 배포와 기능 출시를 분리하여 지속적 배포 가능
  • • 작은 단위의 잦은 통합으로 merge 충돌 최소화 및 통합 리스크 감소
Follow-up 질문

Feature Flag가 누적되어 기술 부채가 되는 것을 방지하기 위한 Flag 생명주기 관리 전략과 Git을 활용한 자동화 방안은 무엇이 있을까요?

4 Git 트러블슈팅
Hard

Q. 개발자가 git rebase -i로 여러 커밋을 squash하고 force push한 후, 다른 팀원들이 해당 브랜치에서 작업하던 내용과 충돌이 발생했습니다. 각 팀원이 로컬 작업을 잃지 않고 rebase된 브랜치와 동기화하는 복구 전략과, 이런 상황을 예방하기 위한 팀 가이드라인을 제시해주세요.

A. 모범답안

먼저 각 팀원은 현재 작업을 git stash 또는 임시 브랜치로 백업합니다. git fetch origin으로 원격의 rebase된 히스토리를 가져온 후, git rebase --onto origin/branch old-branch-tip current-branch 명령으로 자신의 커밋들을 새로운 base 위로 재배치합니다. 또는 git reset --hard origin/branch 후 백업한 변경사항을 git cherry-pick이나 수동 적용합니다. 예방책으로는 공유 브랜치에서는 rebase 금지 규칙을 설정하고, force push는 --force-with-lease 옵션으로 제한하며, rebase가 필요한 경우 팀 공지 후 모든 작업 중단을 확인합니다. 또한 protected branch 설정으로 force push를 원천 차단하거나, PR 기반 워크플로우로 개인 브랜치에서만 rebase를 허용합니다.

핵심 포인트
  • • 작업 백업 후 git rebase --onto로 커밋을 새 base 위로 재배치
  • • git reflog로 이전 상태 추적 가능하며 필요시 cherry-pick으로 복구
  • • 공유 브랜치에서 rebase/force push 금지 규칙 설정
  • • --force-with-lease 사용으로 의도치 않은 덮어쓰기 방지 및 protected branch로 강제
Follow-up 질문

git pull --rebase와 git pull --merge의 차이점과, 팀 전체가 일관된 히스토리 관리를 위해 pull.rebase 설정을 어떻게 표준화해야 할까요?

5 Git 코드 리뷰
Medium

Q. Pull Request 리뷰 과정에서 리뷰어의 피드백을 반영할 때, 기존 커밋을 수정하는 방식(amend, rebase)과 새 커밋을 추가하는 방식의 장단점을 비교하고, 각 방식을 선택하는 기준과 팀 컨벤션 수립 시 고려사항을 설명해주세요.

A. 모범답안

기존 커밋 수정 방식은 git commit --amend나 git rebase -i로 리뷰 피드백을 원래 커밋에 통합하여 깔끔한 히스토리를 유지하지만, force push가 필요하고 리뷰 변경 이력 추적이 어렵습니다. 새 커밋 추가 방식은 'Address review comments' 같은 커밋으로 피드백을 반영하여 리뷰 과정을 투명하게 기록하고 force push가 불필요하지만, 히스토리가 지저분해집니다. 일반적으로 리뷰 중에는 새 커밋으로 피드백을 반영하여 변경사항 추적을 쉽게 하고, 최종 머지 전에 squash merge나 rebase로 정리하는 하이브리드 방식을 권장합니다. GitHub의 'Squash and merge' 기능이나 GitLab의 'Squash commits' 옵션을 활용하면 자동화할 수 있습니다.

핵심 포인트
  • • 커밋 수정 방식은 깔끔한 히스토리 유지하나 force push 필요 및 리뷰 이력 손실
  • • 새 커밋 추가 방식은 리뷰 과정 투명하게 기록하나 히스토리 복잡도 증가
  • • 리뷰 중 새 커밋 사용 후 머지 전 squash로 정리하는 하이브리드 전략 권장
  • • 플랫폼의 squash merge 기능으로 자동화하여 일관성 유지
Follow-up 질문

대규모 리팩토링 PR에서 수십 개의 파일이 변경되었을 때, 리뷰어가 효과적으로 리뷰할 수 있도록 커밋을 논리적 단위로 분리하는 전략은 무엇인가요?

댓글 0

로그인 후 댓글을 작성할 수 있습니다.

아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!