Git

물복딱복준복
|2024. 1. 5. 22:04

Git의 내부

Git의 파일 상태

  • Tracked
    • git에 add 된적이 있는 파일
      • Modified
        • git에 add된적이 있고 내용이 변경된 파일
        • 변경된 내용을 git에 add 하지는 않은 상태
      • Unmodified
        • git에 add된적이 있지만 내용이 변경되지 않은 파일
      • Staged
        • git에 add되어 Staging Area에서 commit되기를 기다리는 상태
        • commit이 되고 나면 파일들은 Unmodified 상태로 변경된다
  • Untracked
    • git에 add 된적 없는 파일
    • ignore된 파일

 

Git의 3가지 공간

Working directory

  • 내가 작업하고 있는 디렉토리 (git init 멍령어를 실행한 디렉토리)
  • Untracked파일과 Tracked파일들이 있다

Staging area

  • 커밋을 위한 준비 단계
  • git add로 추가된 파일들이 모여있다

Repository

  • commit들이 모여있는 곳

Git의 원리

git add

먼저 git add로 추가한 파일의 내용을 해싱하여 해시값을 얻어낸다

// workingDirectory/a.txt
Hello World!
git add a.txt
// a.txt의 내용을 해싱한 값
980a0d5f19a64b4b30a87d4206aade58726b60e3

objects폴더 안에 얻어낸 해시값의 앞의 2자리를 사용하여 폴더를 생성하고

원본파일의 내용을 가지고 나머지 해시값을 이름으로 하는 파일을 생성한다.

// workingDirectory/.git/objects/98/0a0d5f19a64b4b30a87d4206aade58726b60e3
// 파일의 내용은 원본파일의 내용
Hello World!

 

git add a.txt

 

파일의 이름과 해시값을 Index파일 에 추가한다.

// workingDirectory/.git/Index
blob 980a0d5f19a64b4b30a87d4206aade58726b60e3 a.txt

파일의 내용을 해싱을 하기 때문에 파일 이름이 다르더라도 내용이 같다면

Index에는 파일이름은 다르지만 같은 해시값이 추가된다

// workingDirectory/b.txt
// a.txt와 내용이 동일한 b.txt
Hello World!
git add b.txt
// a.txt와 b.txt의 내용이 동일하기 때문에 파일이름이 다르더라도 동일한 해시값이 나온다
// a.txt에서 이미 동일한 해시값으로 objects폴더에 추가되어있기 때문에 변경되지 않는다
// b.txt의 해시값
980a0d5f19a64b4b30a87d4206aade58726b60e3

git add b.txt

 

// workingDirectory/.git/Index
blob 980a0d5f19a64b4b30a87d4206aade58726b60e3 a.txt
blob 980a0d5f19a64b4b30a87d4206aade58726b60e3 b.txt

지옥에서 온 GIT : 원리 - git add

git commit

  • commit을 하게되면 commit object를 생성한다
  • commit object의 내용은 tree의 해시값과 commit을 한 유저, 커밋메세지가 들어가 있다
  • tree는 commit시 만들어진 시점의 파일의 이름과 파일의 내용이 들어있다.
    • tree의 내용은 git add된 파일들의 내용을 해싱한값과 파일이름들이 적혀져있다.
    • Index파일에 저장된것과 비슷하다.
  • 폴더는 tree로 저장된다
    • 폴더 tree의 내용은 폴더 안에 있는 파일들이다
  • commit object를 만들면 log에 commit object를 기록한다.
commit -m "first commit"
// [tree object]
// .git/objects/01/3b124e284bc818c797339f1197b9497079c375
blob 980a0d5f19a64b4b30a87d4206aade58726b60e3 a.txt
blob 980a0d5f19a64b4b30a87d4206aade58726b60e3 b.txt
// [commit object]
// .git/objects/5f/e98c86fd49136382add0b309e7c592727b4f
tree 013b124e284bc818c797339f1197b9497079c375
parent (이전 commit object의 해시값 첫 commit이라면 없다)
commit user --
message "first commit"
// log 파일
commit user 5fe98c86fd49136382add0b309e7c592727b4f 

지옥에서 온 GIT : 원리 - commit의 원리

git reset

  • git log를 통해 reset을 할 커밋 오브젝트의 해시값을 가져온다.
  • git reset —hard 해쉬값 명령어로 해당 commit object파일의 기록된 내용으로 reset한다

지옥에서 온 Git - 원리 : reset checkout

 

'iOS > 기타' 카테고리의 다른 글

함수형 프로그래밍  (0) 2024.01.05