Git 주니어 CS 기초 면접
새 면접Q. Git에서 파일의 내용이 동일하면 여러 커밋에서 같은 파일을 참조하더라도 저장 공간을 절약할 수 있습니다. 이것이 가능한 이유를 Git의 객체 저장 방식과 연관지어 설명해주세요.
Git은 파일의 내용을 기반으로 SHA-1 해시를 생성하여 Blob 객체로 저장합니다. 동일한 내용의 파일은 항상 같은 해시값을 가지므로, Git은 중복된 Blob 객체를 생성하지 않고 기존 객체를 재사용합니다. 이를 content-addressable storage라고 하며, 파일명이나 위치가 달라도 내용이 같으면 하나의 객체만 저장되어 공간 효율성이 높습니다. 또한 Git은 주기적으로 packfile을 생성하여 유사한 객체들을 델타 압축으로 더욱 효율적으로 저장합니다.
- • Content-addressable storage 방식으로 내용 기반 해시를 사용
- • 동일 내용은 같은 해시를 가지므로 Blob 객체 재사용
- • Packfile과 델타 압축으로 추가 공간 절약
Git의 packfile이 생성되는 시점과 델타 압축이 적용되는 방식을 설명해주세요.
Q. GitHub Flow와 Git Flow의 차이점을 설명하고, 각각 어떤 프로젝트 환경에 적합한지 말씀해주세요.
Git Flow는 main, develop, feature, release, hotfix 등 5가지 브랜치 타입을 사용하는 복잡한 전략으로, 정기적인 릴리즈 주기를 가진 전통적인 소프트웨어 개발에 적합합니다. 반면 GitHub Flow는 main 브랜치와 feature 브랜치만 사용하는 단순한 전략으로, main은 항상 배포 가능한 상태를 유지하며 feature 브랜치에서 작업 후 PR을 통해 병합합니다. GitHub Flow는 지속적 배포(Continuous Deployment)를 수행하는 웹 서비스나 SaaS 환경에 적합하며, 빠른 배포 주기와 간단한 워크플로우가 장점입니다.
- • Git Flow는 5가지 브랜치 타입으로 복잡하며 정기 릴리즈에 적합
- • GitHub Flow는 main과 feature만 사용하여 단순하고 빠른 배포에 적합
- • 프로젝트의 배포 주기와 팀 규모에 따라 선택
GitLab Flow나 Trunk Based Development 같은 다른 브랜치 전략에 대해 알고 있나요?
Q. 대용량 바이너리 파일(이미지, 동영상 등)을 Git 저장소에 커밋하면 어떤 문제가 발생하나요? 그리고 이를 해결하기 위한 방법을 설명해주세요.
Git은 모든 변경 이력을 저장하므로, 대용량 바이너리 파일을 커밋하면 저장소 크기가 급격히 증가합니다. 바이너리 파일은 델타 압축이 효과적이지 않아 수정할 때마다 거의 전체 파일 크기만큼 저장소가 커지며, clone이나 fetch 시 네트워크 전송 시간이 길어집니다. 해결 방법으로는 Git LFS(Large File Storage)를 사용하여 대용량 파일을 별도 서버에 저장하고 Git에는 포인터만 관리하거나, .gitignore에 추가하여 버전 관리 대상에서 제외하고 외부 CDN이나 스토리지를 활용할 수 있습니다.
- • 바이너리 파일은 델타 압축이 비효율적이어서 저장소 크기 급증
- • Clone과 fetch 성능 저하
- • Git LFS 사용이나 외부 스토리지 활용으로 해결
Git LFS의 동작 원리와 설정 방법을 간단히 설명해주세요.
Q. 팀에서 같은 브랜치에 여러 개발자가 작업할 때, push가 rejected되는 상황이 발생합니다. 이 상황의 원인과 해결 방법을 설명하고, git pull --rebase와 일반 git pull의 차이점을 말씀해주세요.
Push가 rejected되는 이유는 로컬 브랜치가 원격 브랜치보다 뒤처져 있기 때문입니다. 다른 개발자가 먼저 push한 커밋이 원격에 존재하는데, 로컬에는 그 커밋이 없어서 fast-forward가 불가능한 상태입니다. git pull은 fetch 후 merge를 수행하여 병합 커밋을 생성하므로 히스토리가 복잡해집니다. 반면 git pull --rebase는 fetch 후 rebase를 수행하여 로컬 커밋을 원격 커밋 위에 재배치하므로 선형적인 히스토리를 유지할 수 있습니다. 팀 컨벤션에 따라 선택하되, 일반적으로 feature 브랜치에서는 rebase를 사용하여 깔끔한 히스토리를 유지하는 것이 권장됩니다.
- • 원격 브랜치가 로컬보다 앞서 있어 fast-forward 불가능
- • git pull은 merge 커밋 생성, git pull --rebase는 선형 히스토리 유지
- • Rebase 사용 시 히스토리가 깔끔하지만 공유 브랜치에서는 주의 필요
이미 push한 커밋을 rebase하면 안 되는 이유를 설명해주세요.
Q. .git 디렉토리의 역할을 설명하고, 웹 서버에 프로젝트를 배포할 때 .git 디렉토리를 포함하면 안 되는 이유를 말씀해주세요.
.git 디렉토리는 Git 저장소의 모든 메타데이터와 객체 데이터베이스를 포함하는 핵심 디렉토리입니다. 여기에는 모든 커밋 히스토리, 브랜치 정보, 설정 파일, 객체(blob, tree, commit) 등이 저장되어 있습니다. 웹 서버에 .git 디렉토리를 포함하여 배포하면, 공격자가 .git 디렉토리에 접근하여 전체 소스코드, 커밋 히스토리, 삭제된 민감 정보(API 키, 비밀번호 등)를 복원할 수 있는 심각한 보안 위험이 발생합니다. 따라서 배포 시에는 빌드된 파일만 복사하거나, .git 디렉토리를 명시적으로 제외해야 합니다.
- • .git은 저장소의 모든 히스토리와 메타데이터를 포함
- • 노출 시 전체 소스코드와 민감 정보 유출 위험
- • 배포 시 .git 디렉토리 제외 필수
실수로 .git 디렉토리가 노출되었을 때 취해야 할 조치를 설명해주세요.
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!