Antilog의 개발로 쓰다
article thumbnail
반응형

Git을 사용하다 보면 commit 하고 기록을 보면
73a771c 혹은 73a771c58bf22d3419aff71cb9e0b86c506d9287와 같은 요상한 문자열을 볼 수 있습니다.

이것을 확인하기 위해 git에서 commit 이력을 보여주는 log를 사용하면

$ git log

아래와 같이 bash창에 표시되는 것을 볼 수 있습니다.

해당 문자는 commit을 할 경우 git이 commit한 순서를 알려주는 id로 저장하는 hash 값이고.
73a771c58bf22d3419aff71cb9e0b86c506d9287가 전체적인 id이고73a771c로 간단히 표기합니다.


여기서 의문이 하나 생기는데, 왜 git은 commit id를 Hash로 사용하는가? 이다. 뭐라 쓰인건지 알아보기 힘든데 이것을 사용하는 이유가 뭐지?

이유는 git은 분산 버전 관리 시스템이기 때문에 어떤 상황에서도 commit을 할 수 있어야한다. 현재 상태가 온라인 or 오프라인 이건, 어떤 서버에 연결되어 있던 commit으로 관리가 될 수 있어야 하기 때문입니다.

만약, commit id로 1,2,3과 같은 정수형 번호를 할당하면 저장시 git은 이전에 commit id가 어떤 것인지 서버에서 최신 번호 확인이 필요하기 때문이죠.

하지만, 이것을 hash로 사용하면 온,오프라인 어떤 환경에서도 commit이 가능합니다.

따라서 현재 사용자가 온라인/오프라인 어떤 상황이던 최신 번호 확인이 필요 없이 바로 커밋하기 위해서 hash 값을 사용합니다.

commit id의 자세한 내용을 아래에서 더 살펴보면

Git의 commit id

Git은 commit의 순서를 기억하기위해서 SHA1 알고리즘으로 만들어진 hash 값을 사용합니다.

쉽게 말해서 이것은 일종의 중복이 없는 임의의 문자열이라고 볼 수 있습니다.

SHA1 알고리즘으로 만들어진 hash는 중복이 없는지 관련한 내용은 더보기 참고.
더보기

SHA1 알고리즘으로 생성된 hash도 중복이 없다고는 할 수 없지만

중복이 발생할 확률은

1/ 2^80로 2의 80승 분의 1의 확률로 발생한다고 한다.

해당 숫자가 감이 잡히지 않을 사람들을 위해서 git pro라는 책에서는

지구상에 모든 모래알에 1200을 곱한 수 중에 한번

혹은 

지구에서 약 6.5억명 인구가 개발하고 매초 리눅스 커널 히스토리 전체(100만 개)
맞먹는 개체를 쏟아내고 바로 push한다 해도 해시 값 충돌이 날 확률이 50%가 되기까지 5년이 걸린다. 

라고 말하며 더 설명하여 차라리 지나가다 동료들이 늑대에게 물려 다 죽는 확률이 더 크다고 한다.

hash 값을 사용하는 이유?

git은 분산 버전 관리 시스템이기 때문에 어떤 상황에서도 commit을 할 수 있어야한다. 현재 상태가 온라인 or 오프라인 이건, 어떤 서버에 연결되어 있던 commit으로 관리가 될 수 있어야 하기 때문입니다.

만약, commit id로 1,2,3과 같은 정수형 번호를 할당하면 저장시 git은 이전에 commit id가 어떤 것인지 서버에서 최신 번호 확인이 필요하기 때문이죠.

하지만, 이것을 hash로 사용함으로 최선 번호 확인이 불필요하고, 중복이 없으므로 오프라인일때도 커밋이 가능해집니다.

그리고 나서 나중에 해당 커밋들을 합치면서 순서대로 나열하는 방법으로 관리합니다.

hash 값으로 순서를 기억하는 방법은?

단순한 hash의 사용으로는 commit의 순서를 기억할 수 없습니다.

따라서 git에서는 commit id를 저장할 때 부모 hash 값도 같이 저장합니다.

따라서 이전에 어떤 commit이 있는지 확인이 가능하고 이것으로 순서를 기억하여 commit들을 합칠 수 있습니다.

반응형
profile

Antilog의 개발로 쓰다

@Parker_J_S

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

profile on loading

Loading...