[Git] Commit ID를 Hash로 관리하는 이유는 무엇일까?

LIMHALIM·2024년 12월 22일
0


우리는 위와 같이 git log 명령어를 통해 commit id(노란색)를 확인하고, 특정 버전으로의 commit으로 되돌리고는 한다.

이때, 이 commit id는 어떻게 생성될까?

Hash를 활용한 commit 관리

해시 값을 사용한 commit ID 관리에 관한 이야기를 하기 전에 SHA-1 알고리즘에 대해서 설명하고자 합니다.

SHA-1 알고리즘이 무엇일까?

SHA-1 알고리즘은 암호학적 해시 함수로, 주어진 데이터를 160비트(20바이트) 길이의 고유한 해시값으로 변환합니다. 이 해시값은 입력 데이터가 조금이라도 변경되면 완전히 달라지며, 단방향성과 충돌 저항성이 특징입니다.

Git에서 commit을 생성하면 그 commit은 다음과 같은 SHA-1 해시값을 가진 고유 ID를 부여받습니다.

commit f5e2b71f5cd34b616568741d72cb4f616eb0f5ab

Hash 값으로 commit의 순서를 기억한다?

단순한 hash 값으로는 commit의 순서를 기억할 수 없다. 따라서, Git에서는 commit Id를 저장할 때 부모 hash 값도 같이 저장한다고 한다. 커밋의 내용, 시간, 부모 commit 등으로 고유한 값이 계산되어 출력되므로 이를 통해 이전에 어떤 commit이 있는지 확인할 수 있고 이 순서를 기억하여 commit들을 관리할 수 있는 것이다.

아니 그래서 왜 Hash를 사용하는데? 🤔

➡️ 그 이유는 오프라인 상태나 서버가 연결되어 있지 않은 상태에서도 commit이 가능해야 하기 때문이다.
해시 값이 아니라 1, 2, 3과 같은 정수형 ID를 부여한다면? 충돌 이슈 등으로 서버를 통한 확인 작업이 필요할 것이다. 따라서, 이러한 중복을 방지하기 위해 고유한 hash 값을 사용하는 것이다.

💡 따라서,

  1. Git은 commit의 순서를 기억하기 위해서 SHA-1 알고리즘을 채택하여 고유한 해시 값을 사용한다. 이를 통해 Git은 commit 간의 관계와 순서를 추적할 수 있다.

  2. Git은 각 commit에 대해 고유한 해시 값을 생성해서 각 commit을 다른 commit과 구별할 수 있다.

  3. 해시는 한번 계산되면 변경할 수 없다. 이 특성 덕에 Git은 각 commit의 무결성을 유지할 수 있는 것이다. commit이 변경되면 그 해시 값도 달라지기 때문에, 이 전 상태로 되돌릴 수 없게 되어 변경이 의도치않게 이루어지는 것을 방지할 수 있다.

더 강력한 SHA-256 알고리즘으로 왜 안바꿀까?

➡️ Git은 이미 많은 시스템에서 SHA-1을 사용하고 있으며, 기존의 Git 저장소는 모두 SHA-1 기반으로 생성된 커밋 ID를 사용하고 있습니다.
❓ 만약 기존 저장소들이 SHA-256으로 전환된다면, 기존의 SHA-1 기반 시스템 저장소와 호환되지 않게 됩니다. 즉, 새로운 커밋 ID가 기존 SHA-1 기반 시스템과 호환되지 않으면, 다양한 Git 클라이언트 및 서버 간 호환성 문제가 발생할 수 있습니다.

Git의 분산 특성상, 수천, 수만 개의 기존 저장소와 사용자들이 존재합니다. 이러한 시스템에서 갑작스러운 변화는 기존의 데이터와 시스템에 심각한 영향을 미칠 수 있습니다. 따라서 기존 시스템과의 호환성을 유지하면서 점진적으로 전환하는 방식이 필요합니다.

💡 실제로, Git은 2020년 10월에 출시된 Git 2.29 버전부터 SHA-256을 지원하기 시작했으며 단계적으로 전환하려는 계획을 진행하고 있다고 합니다. 최신 Git에서는 SHA-256을 선택적으로 사용할 수 있는 옵션을 제공하고 있습니다. 즉, 사용자가 기존의 SHA-1을 계속 사용할 수도 있고, 원한다면 SHA-256을 사용할 수 있는 선택권이 주어지는 것이죠.

📌 SHA-256 적용 방법

새로운 저장소를 생성할 때 아래와 같이 --object-format=sha256 플래그를 사용하면 됩니다!

git init --object-format=sha256

이렇게 하면 해당 저장소는 SHA-256 해시 알고리즘을 사용하여 객체를 식별하게 됩니다.


🔍 하지만, 이와 같은 점진적인 전환 방식을 통해 SHA-256을 사용할 수 있지만, SHA-1 기반 저장소와 SHA-256 기반 저장소와 상호 연동이 되지 않는 상태라고 합니다.
이를 참고해서 적용해보면 좋을 것 같습니다 !


참고문헌

https://zdnet.co.kr/view/?no=20201023091820

profile
모든 익숙함에 물음표 더하기

0개의 댓글