git은 Content-addressable 파일 시스템이며
VCS 사용자 인터페이스를 가지고 있음 !
Plumbing 명령과 Porcelain 명령
Plumbing 명령 : 고수준 명령어 - 우리가 사용하는 명령어들 ex) add, commit, branch 과 같은
Porcelain 명령 : 저수준 명령어 - git의 내부구조에 접근하는 명령어들
.git 디렉토리의 요소
- HEAD 파일 : 현재 Checkout 한 브랜치
- index 파일 : Staging Area의 정보를 저장
- object 디렉토리 : 모든 컨텐트를 저장하는 데이터베이스
- refs 디렉토리 : 커밋 개체의 포인터(브랜치, 태그, 리모트 등)를 저장
Content-addressable 파일 시스템
git은 Content-addressable 파일시스템임 -> Key : Value 데이터 저장소
git의 핵심 요소에는 4가지 종류의 개체가 있는데 Blob, Tree, Commit, Tag가 그것임
그리고 얘네는 모두 sha-1 해쉬 값을 가지고 있음
object 디렉토리 내부를 살펴보면 -> 디렉토리와 파일들이 들어있는데
sha-1 값의 앞의 두글자가 디렉토리 이름이 되고
나머지 38 글자가 파일 이름이 된다.
tree Object는 blob Object로 구성되어 있음
commit object는 tree를 참조하고 있음
두개의 파일을 어떻게 비교?
이전 커밋의 트리와 비교 blob 단위로 달라졌으면 새로운 blob 참조하도록 수정
바뀌지 않았으면 참조 수정 x -> 저장 공간 효율적 사용
merge 방법들 ? (4가지)
중심 브랜치(A)와 다른 브랜치(B) -> B를 A로 병합하는 상황
1. 3-way merge
- 가장 일반적인 방법
2. fast-forward merge ( 조건 : 중심브랜치에 commit 내역이 없을 때 )
3. rebase
- 커밋을 중심 브랜치에 연결해서 이어줌 -> 그걸 중심 브랜치로!
- 커밋 기록 예쁘게 유지하기 위해~ 3-way로 하면 브랜치가 많으면 커밋 기록도 너무 중첩돼서 복잡해짐!
4. squash
- B 가 간단한 중요하지 않은 브랜치일 경우 이런 식으로 B의 커밋기록 그냥 A에 하나의 커밋으로 합쳐버림
참고자료
Git - Plumbing 명령과 Porcelain 명령
10.1 Git의 내부 - Plumbing 명령과 Porcelain 명령 여기까지 다 읽고 왔든지 바로 여기부터 보기 시작했던지 간에 이제 마지막 장이다. 이번 장은 Git이 어떻게 구현돼 있고 내부적으로 어떻게 동작하는
git-scm.com