커밋

커밋의 개념

커밋(commit)은 git의 버전 관리의 기본 단위로, (1) 파일 변경 사항을 저장소에 기록하는 작업 (2) 특정 시점에 저장소에 기록된 상태 를 의미한다.

커밋 ID

커밋은 메시지와 별도로 자신만의 고유한 ID를 가지고 있다. 이 ID는 SHA-1 해시 값의 40자리 문자열로 이루어져있다.

1
2
3
4
git log -s
>> commit c175163158d0e78f259b64ffb76b72a985e7f697 (HEAD -> main)
>> commit cbf9cc608bbd1656ba9008c7e25c94493700a91b
>> commit 37b90cce0f841afd5e6368f02c4a7e77810bf127

커밋의 구성 요소

구성 요소 설명
커밋 ID 커밋을 고유하게 식별하는 SHA-1 해시 값 (40자리 문자열)
작성자 정보 커밋을 만든 사람의 이름과 이메일
작성 날짜 커밋이 작성된 날짜와 시간
커밋 메시지 변경 사항에 대한 설명으로 커밋시에 작성하는 것. 변경 의도를 표현하는 중요한 것.
트리(Tree) 해당 커밋에서 관리하는 파일 및 디렉터리의 스냅샷 구조.
부모 커밋 해당 커밋의 직전 커밋 ID. 이것을 통해 이력을 알 수 있다. 첫 번째 커밋은 부모가 없다.

커밋의 동작 원리

(1) 스냅샷 저장
-변경 파일 뿐만 아니라 프로젝트 전체 스냅샷을 기록한다.
-다만 저장 효율성을 위해 동일한 파일은 중복 저장하지 않는다.

(2) 연결된 그래프
-커밋은 부모 커밋과 연결된 DAG(Direct Acyclic Graph, 방향성 비순환 그래프) 구조를 형성한다.
-이를 통해 프로젝트 변경 이력을 추적할 수 있다.

(3) HEAD 포인터
-현재 체크아웃된 브랜치를 가리킨다.
-새로운 커밋이 생성될 때마다 해당 브랜치의 HEAD가 새 커밋을 가리키도록 한다.

(참고) 커밋 ID의 사용

커밋 ID는 40자리 문자열로, 명령어에서 그 모든 ID값을 입력하는 것은 오류 가능성이 높다. 알고리즘에 따라 앞의 4자리만 적어도 겹칠 가능성이 적으므로, 커밋의 ID값을 직접 사용할 때에는 보통 문자열의 앞 4자리를 적는다.