Git이란?
간단하게 말하면 '분산 버전 관리 시스템' 이라고 할 수 있다.
그럼, 여기서 분산이란 무엇일까?
중앙 서버에만 의존하지 않고, 로컬 저장소에 전체 히스토리와 파일을 복제하여 그 복사본으로 작업을 이어나갈 수 있다는 것이다.
그렇다면 버전관리는 왜 필요할까?
개발 과정에서 발생하는 파일의 변경 사항을 체계적으로 추적하고 관리하기 위해 필요하다.
결과적으로, Git은 이러한 버전 관리를 통해 코드의 변경 사항을 추적하고 협업을 효율적으로 도와주는 분산형 버전 관리 시스템인 것이다.
Github란?
이러한 Git을 사용한 코드를 저장하고, 공유하고, 협업할 수 있는 온라인 플랫폼이다.
인터넷에 코드를 올려 다른 사람들과 공유할 수 있다.
📌 규칙 1
"수정"의 단계는 "의미"를 기준으로 사용자가 정해줘야 한다. (commit)
이를 commit이라고 한다. 이 파일의 수정이 끝났다. 즉, 이 파일의 의미있는 수준의 수정 작업이 끝났다고 git에게 알려주는 행위/명령어이다.
📌 규칙 2
하나의 수정에는 여러 개의 파일이 포함될 수 있다.
📌 규칙 3
상태(변화하는 것)를 저장하는 공간을 만들 수 있다. (branch)
git의 시작
1. 생성
git init
지정한 폴더의 변경 내용을 추적하기 위한 준비
위 명령어로 저장소가 만들어질 때, master라는 defalut 브랜치를 기본으로 생성한다.
2. 기록
git commit -m [커밋메세지]
여기서 -m은 옵션으로, 메세지를 입력하겠다는 뜻이다.
메세지를 바로 입력할 수 있도록 도와주는 단축 옵션이다.
새로운 브랜치 만들기
1. 생성
git branch [브랜치명]
2. 이동
git checkout
현재 브랜치에서 다른 브랜치로 이동할 수 있다.
브랜치와 브랜치의 병합(Merge)
git merge
우리는 위와 같이 git log 명령어를 통해 commit id(노란색)를 확인하고,
특정 버전으로의 commit으로 되돌리고는 한다.
이때, 이 commit id는 어떻게 생성될까?
Hash를 활용한 commit 관리
1. Git은 commit의 순서를 기억하기 위해서 SHA-1 알고리즘을 채택하여 고유한 해시 값을 사용한다. 이를 통해 Git은 commit 간의 관계와 순서를 추적할 수 있다.
SHA-1의 input으로 들어가는 많은 정보들 중에 한 글자만 바뀌더라도 commit id인 output은 바뀌게 된다.
(SHA-1은 최대 2⁶⁴의 input 데이터를 160비트의 output 데이터 (해시 값, commit id)로 바꾼다.)
2. Git은 각 commit에 대해 고유한 해시 값을 생성해서 각 commit을 다른 commit과 구별할 수 있다.
3. 해시는 한번 계산되면 변경할 수 없다. 이 특성 덕에 Git은 각 commit의 무결성을 유지할 수 있는 것이다. commit이 변경되면 그 해시 값도 달라지기 때문에, 이 전 상태로 되돌릴 수 없게 되어 변경이 의도치않게 이루어지는 것을 방지할 수 있다.
Hash 값으로 commit의 순서를 기억하는 방법?
단순한 hash 값으로는 commit의 순서를 기억할 수 없다. 따라서, Git에서는 commit Id를 저장할 때 부모 hash 값도 같이 저장한다고 한다. 커밋의 내용, 시간, 부모 commit 등으로 고유한 값이 계산되어 출력되므로 이를 통해 이전에 어떤 commit이 있는지 확인할 수 있고 이 순서를 기억하여 commit들을 관리할 수 있는 것이다.
아니 그래서 왜 Hash를 사용하는데?
그 이유는 오프라인 상태나 서버가 연결되어 있지 않은 상태에서도 commit이 가능해야 하기 때문이다.
해시 값이 아니라 1, 2, 3과 같은 정수형 ID를 부여한다면? 충돌 이슈 등으로 서버를 통한 확인 작업이 필요할 것이다. 따라서, 이러한 중복을 방지하기 위해 고유한 hash 값을 사용하는 것이다.