git이 내부적으로 어떻게 동작하는지 알아보기
gistory
.git폴더의 상태변화를 웹에서 보여줌
gistory설치
pip install gistory
gistory 실행
.git폴더안에서 gistory
localhost:8805
git add명령어 실행시
파일생성시 변동없음
add 실행시 index파일과 objects폴더안의 파일 변경됨
index파일 해당파일의 해시값-파일의 이름
objects안의파일들 파일의 내용 저장
git은 파일 이름이 달라도 내용이 같으면 같은 오브젝트 파일을 사용한다.
object파일의 이름은 sha1해시 알고리즘을 사용하여 저장한다.
sha1해시값의 앞의 2글자는 폴더의 이름 나머지 글자는 파일명으로 저장된다.
ex)hi라는 내용의 파일을 만들어서 git add 하였을시
hi의 sha1 해시값은 c22b5f9178342609428d6f51b2c5af4c0bde6a42이다
hi의 내용을 담은 해시파일은
objects/c2/2b5f9178342609428d6f51b2c5af4c0bde6a42라는 폴더에 저장된다.
기본적으로 이런 원리이지만 부가적인 정보들이 추가되기 때문에 sha1 해시값을 구하기때문에 값은 달라질수 있다.
git add의 동작원리
gitstory를 통해 확인해 본 결과로 추측해 보았을때 git add명령어를 실행하면 add한 파일에 부가정보를 추가하여 압축하고 sha1 해시값을구해 objects폴더에 해당 해시값을 통해 폴더와 파일을 만들고(있다면 기존 파일 사용) index에 파일이름을 저장한다.
git commit의 동작원리
commit의 내용도 objects안에 파일로 저장된다.
이 파일의 내용을 보면 tree의 값이 나와있고 tree값의 object파일을 살펴보면 commit된 각각의 파일이름과 해사 값들이 나와있다.
같은 파일을 업데이트하고 commit했을시 parent 해시값을 볼 수 있으며 이전 버전의 해시값을 보여준다.
각각의 만들어진 시점의 스냅샷을 tree라는 정보를 통해서 저장하고있다.
objects 파일의 3가지 유형
blob 내용을 담고있는것
tree 디렉토리의 파일명과 blob에 대한 정보를 담고있는것
commit commit 정보
git status의 동작원리
status는 add를 하기 전 현재 상태와 index를 비교하는 과정
git branch의 동작원리
branch를 생성하면 refs/heads/<branch> 파일이 생성되며 이 파일은 가장 최신의 commit파일명을 가지고있다.
git checkout의 동작원리
head파일은 checkout한 refs/heads/<branch> 를 가르키게되고
index파일은 해당 branch에 포함된 파일명들을 가지게된다.
git reset의 동작원리
reset을 하면 최신 commit을 변경하고 그전 commit들을 삭제한다.
reset은 checkout 하고 있는 branch에 최신commit을 바꾸는 행위이다.
이때 지워진 commit은 ORIG_HEAD에 저장되어 다시 복구할수 있다.
ORIG_HEAD는 위험한 명령어를 사용하였을때 이전 상태를 저장하는 파일이다.
git merge의 동작원리
충돌이 일어나면 index파일안에 파일을 나타내는 해시값뒤에 숫자가 0에서 다른 숫자로 바뀐다.
MERGE_HEAD merge가 될 대상의 최신commit저장
MERGE_MSG 다음 commit에 자동으로 보여줄 메세지
ORIG_HEAD 충돌전 상태저장
충돌한 파일의 내용은 ===를 기준으로 나뉘어진다.
3-way Merge
https://www.youtube.com/watch?v=J0W-WA0aYJI&list=PLuHgQVnccGMA8iwZwrGyNXCGy2LAAsTXk&index=32
명령어에 따른 상태변화
'프로그래밍 > Git 사용법' 카테고리의 다른 글
Git Tag (0) | 2020.06.11 |
---|---|
Git 원격 저장소 (0) | 2020.06.11 |
Git Stash (0) | 2020.06.08 |
Git Branch (0) | 2020.06.08 |
Git설치 및 초기화 (0) | 2020.06.07 |
최근댓글