Git 원리
git의 명령어는 어떻게 동작할까.
git 분석을 위해 gistory 파이썬 패키지를 사용한다.
https://pypi.org/project/gistory/
Git add 원리
프로젝트에 ABC.txt 파일과 test.txt 파일이 있다. ABC 파일은 Tracked 상태이며 test.txt은 UnTracked 상태이다. 이 상태에서 git add test.txt 명령을 수행하면 다음의 일들이 벌어진다.
- test.txt의 오브젝트 파일 생성, git의 모든 오브젝트 파일의 이름은 파일 내용의 해시 값으로 저장된다. 즉 git은 내용이 같은 오브젝트 파일을 중복 저장하지 않는 내부 매커니즘을 가지고 있다.
- index(Staging Area)의 스냅샷에 오브젝트 파일 링크가 추가된다.
Git commit / status 원리
위 상태에서 commit 시 커밋 오브젝트 파일이 생성된다. 커밋 오브젝트 파일은 index의 스냅샷을 영구적인 스냅샷으로 만든 것이다. 이 파일의 안에는 트리 파일 포인터, 부모 커밋 객체의 포인터, 저자나 커밋 메세지 같은 메타 데이터를 가지고 있다. 트리 파일은 commit시 index의 스냅샷을 저장한 것으로 트리 구조를 가진다. 트리 파일을 통해 오브젝트 파일을 참조 할 수 있다.
커밋마다 그 시점의 버전을 스냅샷 형태로 갖게 된다. 따라서 이 커밋 오브젝트를 참조한다면 현재 버전과 이전 버전을 비교해 현재 버전의 어떤 파일이 변경되었는지 알 수 있고 언제든지 이전 버전으로 워킹 디렉터리를 체크아웃 할 수 있다.
Git rm 원리
마지막으로 git rm 명령만 살펴보자.
git rm test.txt 명령을 실행하면 그 변경사항이 index의 스냅샷에 반영된다.
git add/rm/mv 명령을 실행하면 위와 같이 변경사항이 index의 스냅샷에 반영된다.
이 상태에서 커밋 시 커밋 오브젝트 파일이 만들어지고 index의 스냅샷은 트리 파일로 저장되어 그 포인터가 커밋 오브젝트 파일 안에 포함 된다. git rm 명령을 수행해도 저장되어진 오브젝트 파일은 삭제되지 않는다. 즉 git은 절대로 데이터를 삭제하지 않는 구조를 가진다.
더 자세히
더 상세한 원리를 알려면 아래 공식 문서를 참고하자.
https://git-scm.com/book/ko/v2/Git%EC%9D%98-%EB%82%B4%EB%B6%80-Git-%EA%B0%9C%EC%B2%B4
'CM > Git' 카테고리의 다른 글
Git 히스토리 삭제 (0) | 2024.05.31 |
---|---|
Git 원격 저장소 (0) | 2022.08.04 |
Git branch (0) | 2022.08.01 |
Git 기초 (0) | 2022.07.31 |