Git 리포지토리 — 개발 전반에 걸쳐 Git이 파일의 모든 변경 사항을 추적하는 프로젝트 소스 코드 저장소입니다. 리포지토리에는 커밋, 브랜치, 태그의 전체 기록이 포함되어 있어 개발자들이 코드에서 공동 작업을 할 수 있습니다. Git, 2024에 따르면, 리포지토리는 모든 버전 관리 시스템의 기초이며 전 세계 수백만 프로젝트에서 사용됩니다.
핵심 요점
Git 리포지토리 — 버전 관리 시스템이 프로젝트 파일 변경 기록을 설명하는 메타데이터와 객체를 저장하는 데이터 구조입니다. 개발자가 git init 명령어로 리포지토리를 초기화하면 Git은 프로젝트 루트에 숨겨진 폴더 .git을 생성합니다.
이 폴더 안에는 시스템 작동에 필요한 모든 객체, 참조 및 구성 파일이 있습니다. 리포지토리는 특정 위치에 고정되지 않습니다 — 개발자가 로컬로 생성한 후 원격 서버에 연결할 수 있습니다.
Git은 분산 리포지토리 모델을 사용합니다. 프로젝트의 각 구성원은 자신의 컴퓨터에 전체 기록 복사본을 가지고 있습니다. 즉, 커밋, 기록 보기, 브랜치 생성 등 대부분의 작업이 서버에 접속하지 않고 로컬에서 수행됩니다.
Git 문서에 따르면, 분산 아키텍처는 시스템을 내결함성 있게 만듭니다. 서버가 다운되더라도 로컬 리포지토리가 프로젝트의 전체 기록을 복원하는 소스가 될 수 있습니다.
로컬 리포지토리 — 개발자 컴퓨터의 프로젝트 복사본입니다. 커밋, 브랜치, 태그의 전체 기록을 포함하며 네트워크 연결 없이 commit, branch, merge, rebase 작업을 수행할 수 있습니다.
원격 리포지토리 — 서버에 호스팅되며 모든 팀 구성원의 동기화 지점 역할을 합니다. 개발자는 git push 명령어로 변경 사항을 보내고 git pull 명령어로 다른 사람의 변경 사항을 가져옵니다.
로컬 리포지토리와 원격 리포지토리 간의 연결은 remote origin — Git 구성에 저장된 서버 URL — 을 통해 설정됩니다. 하나의 로컬 리포지토리를 여러 원격 리포지토리에 연결할 수 있어 포크 작업 시 유용합니다.
이 모델의 주요 장점은 개발자가 오프라인에서 코드 작업을 하고 결과를 보낼 준비가 되었을 때만 변경 사항을 동기화할 수 있다는 점입니다.
| 특성 | 로컬 | 원격 |
|---|---|---|
| 위치 | 개발자 컴퓨터 | 서버 (GitHub, GitLab) |
| 오프라인 접근 | 모든 작업에 완전 접근 | 연결 없이 사용 불가 |
| 동기화 | 원격과 Push/Pull | 로컬의 push 수신 |
| 백업 | 데이터 손실에 보호되지 않음 | 백업과 함께 서버에 저장 |
Git의 저장 모델은 다른 버전 관리 시스템과 근본적으로 다릅니다. 버전 간 변경 목록(델타)을 저장하는 대신 Git은 각 커밋 시점의 모든 프로젝트 파일에 대한 완전한 스냅샷을 저장합니다.
리포지토리의 각 객체는 고유한 40자 SHA-1 해시로 식별됩니다. 커밋 간에 파일 내용이 변경되지 않으면 Git은 새 객체를 만들지 않고 기존 객체를 재사용합니다 — 공간을 절약할 수 있습니다.
Git은 네 가지 유형의 객체를 사용합니다: blob(파일 내용), tree(디렉토리 구조), commit(메타데이터가 있는 스냅샷), tag(커밋에 대한 명명된 참조). 모든 객체는 .git/objects 폴더에 저장됩니다.
Git Internals에 따르면, Git의 객체 모델은 데이터 무결성을 보장합니다. 파일 내용의 변경은 새 해시를 생성하므로 기록을 눈에 띄지 않게 변경하는 것이 불가능합니다.
.git 폴더는 리포지토리의 핵심입니다. 이것이 없으면 Git은 변경 사항을 추적할 수 없으며, 일반 디렉토리는 단순한 파일 모음에 불과합니다. 이 폴더의 구조를 이해하면 리포지토리 문제를 진단하는 데 도움이 됩니다.
HEAD 파일은 특별히 주목할 만합니다. 정상 상태에서는 브랜치에 대한 기호 참조를 포함합니다(예: ref: refs/heads/main). detached HEAD 상태에서는 커밋을 직접 가리킵니다 — 새 커밋이 어떤 브랜치에도 연결되지 않음을 의미합니다.
Git 리포지토리 작업에는 개발자가 매일 수행하는 기본 작업들이 포함됩니다. 각 작업은 새 객체를 추가하거나 참조를 이동하여 리포지토리 상태를 변경합니다.
push와 pull 작업만이 원격 서버 연결이 필요합니다. 다른 모든 작업은 완전히 로컬에서 수행되므로 기록 양이 많아도 빠른 속도를 보장합니다.
리포지토리의 각 파일은 네 가지 상태를 거칩니다: untracked(추적 안 함), modified(수정됨), staged(준비됨), committed(커밋됨). Git은 git add를 통해 명시적으로 추가되었거나 이미 커밋 기록에 있는 파일만 추적합니다.
이 모델을 이해하는 것이 Git을 효과적으로 사용하는 핵심입니다. 개발자는 수정된 파일 중 일부만 선택적으로 커밋을 준비하여 명확한 설명과 함께 논리적으로 완결된 커밋을 만들 수 있습니다.
원격 리포지토리는 일반적으로 웹 인터페이스, 접근 관리 시스템 및 협업 개발을 위한 추가 도구를 제공하는 전문 플랫폼에 호스팅됩니다.
플랫폼 선택은 팀 규모, 개인정보 요구사항 및 필요한 통합에 따라 달라집니다. 모바일 개발에서는 폭넓은 커뮤니티 지원과 iOS 및 Android용 CI/CD 도구 통합으로 GitHub이 자주 선택됩니다.
실용적인 시나리오를 생각해 봅시다. 개발자가 기존 리포지토리를 클론하고, 새 브랜치를 만들고, 변경 사항을 적용한 후 서버에 푸시합니다. 각 명령어는 리포지토리의 다양한 구성 요소와의 작업을 보여줍니다.
# 원격 리포지토리 클론
git clone https://github.com/user/mobile-app.git
# 프로젝트 디렉토리로 이동
cd mobile-app
# 새 기능 브랜치 생성 및 전환
git checkout -b feature/auth
# 수정된 파일 상태 확인
git status
# 모든 변경 사항을 스테이징 영역에 추가
git add .
# 설명과 함께 커밋 생성
git commit -m "Add authentication module"
# 원격 리포지토리로 변경 사항 푸시
git push origin feature/auth
git status 명령어는 일상 작업에서 가장 유용한 명령어 중 하나입니다. 어떤 파일이 수정되었는지, 어떤 파일이 커밋 준비되었는지, 어떤 파일이 Git에서 전혀 추적되지 않는지 보여줍니다.
리포지토리 기록을 분석하려면 다양한 형식 플래그와 함께 git log 명령어를 사용합니다. 커밋의 연대순, 작성자, 날짜 및 SHA-1 식별자를 표시합니다.
# 브랜치 그래프 시각화와 함께 기록 보기
git log --oneline --graph --all
# 특정 커밋의 변경 사항 보기
git show a1b2c3d
# 현재 상태를 마지막 커밋과 비교
git diff HEAD
# 특정 파일의 기록 보기
git log --follow src/MainActivity.kt
--graph 플래그는 브랜치의 ASCII 그래프를 표시하며, 여러 브랜치에서 활발히 작업하는 리포지토리에서 특히 유용합니다. 빈번한 릴리스가 있는 모바일 프로젝트의 경우 시각적 그래프가 개발 구조를 빠르게 평가하는 데 도움이 됩니다.
자주 묻는 질문
리포지토리는 변경 기록이 있는 코드의 기술적 저장소입니다. 프로젝트는 리포지토리, 작업 관리 시스템, 문서, 개발 프로세스를 포함하는 더 넓은 개념입니다. 하나의 프로젝트에 여러 리포지토리가 포함될 수 있습니다.
GitHub 웹 인터페이스에서 New 버튼을 클릭하여 새 리포지토리를 만듭니다. 이름, 설명, 접근 수준을 지정합니다. 그런 다음 리포지토리를 로컬 머신에 클론하거나 git remote add origin을 통해 기존 로컬 리포지토리와 연결합니다.
원격 리포지토리가 서버에서 삭제되었지만 최소 한 명의 개발자가 로컬 복사본을 가지고 있다면 복원이 가능합니다. 새 원격 리포지토리를 만들고 전체 기록이 있는 로컬 복사본에서 git push --force를 실행하면 됩니다.
포크는 내 계정에 있는 다른 사람의 리포지토리 복사본입니다. 전체 기록 복사본을 얻고 원본에 영향을 주지 않고 모든 변경을 할 수 있습니다. 포크는 Pull Request를 통해 오픈 소스 프로젝트에 참여하는 데 사용됩니다.
git gc를 사용하여 객체를 압축하고 도달할 수 없는 데이터를 제거합니다. git filter-branch 또는 git filter-repo를 통해 기록에서 큰 파일을 제거합니다. 바이너리 파일이 있는 프로젝트의 경우 Git LFS(Large File Storage)를 고려하세요.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.