본문 바로가기
기타/Git

[Git] Git 개체 - Tree

by 코딩하는 랄로 2023. 11. 21.
728x90

https://codingralro.tistory.com/247

 

[Git] Git 객체 - Blob

Git의 명령어를 보다 잘 사용하기 위해서는 해당 명렁어가 깃 내부적으로 어떻게 동작하는지에 대해 알아야 한다. 또한 동작과정을 이해하기 위해서는 깃 내부를 먼저 들여다볼 필요가 있다. 이

codingralro.tistory.com

 

저번 글에서는 Git 개체 중 Blob 개체에 대해서 알아보았다. 이번 글에서 사용하는 예제는 이전 글과 이어지기 때문에 예제가 잘 이해되지 않으신 분들은 위의 글을 한번 보고 오면 된다. 이번에는 Git 개체 중 Tree 개체에 대해서 알아보겠다. 

 

 

 

Tree 개체란

이름에서 알 수 있듯이, Tree 개체는 tree 구조를 가능하게 하기 위한 개체라고 생각하면 된다. 내용만을 저장했던 Blob 개체와는 달리, Tree 개체는 파일의 이름을 저장한다. 파일 여러개를 한꺼번에 저장할 수 도 있다.

 

Tree 개체를 잘 이해하기 위해서는 우리가 일반적으로 사용하는 유닉스 파일 시스템을 생각하면 된다. Tree는 하나의 폴더로서 그 안에 일반 파일들이 있을 수 있고 하위 폴더가 존재할 수 도 있다. 이때에 일반 파일은 Blob 개체이고 하위 폴더는 하위 Tree 개체가 되는 것이다.

 

Tree 개체에 저장되는 데이터는 Blob 개체 또는 하위 Tree 개체를 가리키는 SHA-1 포인터, 파일 모드, 개체 타입, 파일 이름으로 구성되어 저장된다. 여기서 중요한 점은, 해당 Blob 개체의 내용까지 저장되는 것이 아닌 그 내용을 가리키는 SHA-1 ( 해시 키 )만 저장함으로써, 저장 공간의 낭비를 최소화할 수 있다.

 

 

 

Tree 개체 생성

직접 Tree 개체를 생성해보자!! Git은 일반적으로 Staging Area(index)의 상태대로 Tree 개체를 만들고 기록한다. 그렇기 때문에 Tree 개체를 생성하기 위해서는 Staging area에서 파일을 추가하여 index를 생성해주어야 한다. 이전 글에서 생성한 file1.txt 를 먼저 staging area에 올려보겠다.

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ git update-index --add --cacheinfo 10644 \
> 01e6138faef088714355b81759a88101ce07a1a3 file1.txt

 

  • 10644 : 보통의 파일을 나타내는 파일 모드( 실행파일 : 100755, 심볼릭 링크 : 120000)
  • --add : 아직 staging area에 없는 파일이기 때문에 해당 옵션을 주어 추가
  • --cacheinfo : 현재 티렉토리에 있는 파일이 아닌 데이터베이스에 있는 파일을 추가

이제 staging area에 파일을 올려 index를 생성했으므로 해당 index로 tree 개체를 생성하면 된다.

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ git write-tree
9517b3c33e92dbc329ebcf5cd68e830c551dc90b

 

write-tree 명령을 사용하여 staging area를 tree 개체로 저장한다. 해당 명령은 Tree 개체가 없으면 자동으로 생성하기 때문에 -w 옵션은 필요없다. cat-file에 -t 옵션을 통해 해당 해시 포인터가 가리키는 개체가 어떤 타입인지 확인할 수 있다.

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ git cat-file -t 9517b3c33e92dbc329ebcf5cd68e830c551dc90b
tree

 

tree 개체가 잘 생성된 것을 확인하였으니, 이제 cat-file -p명령어를 통해 tree 개체의 내용을 확인해보면, 아래와 같이 file1.txt의 데이터를 저장하고 있는 것을 확인할 수 있다.

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ git cat-file -p 9517b3c33e92dbc329ebcf5cd68e830c551dc90b
100644 blob 01e6138faef088714355b81759a88101ce07a1a3    file1.txt

 

 

 

하위 Tree 개체 

조금 더 tree 개체를 가지고 놀아보자. 먼저 위의 tree 개체에서 file1.txt 에 내용을 변경하겠다. 현재는 same content라는 내용의 해시를 가리키고 있기 때문에 new version이라는 해시를 생성 후 해당 해시로 변경 후 staging area에 추가하였다.

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ echo 'new version' | git hash-object -w --stdin
2777791d6de7aac03f38b1b8403ad0fae82e28ac

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ git update-index --add --cacheinfo 100644 \
> 2777791d6de7aac03f38b1b8403ad0fae82e28ac file1.txt

 

여기서, 기존의 file2.txt 도 staging area에 추가 후, 해당 staging area로 트리 개체를 생성해보자.

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ git update-index --add file2.txt

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ git write-tree
d7dae4567372b22cb0abb2ba919ac2a93f7101f4

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ git cat-file -p d7dae4567372b22cb0abb2ba919ac2a93f7101f4
100644 blob 2777791d6de7aac03f38b1b8403ad0fae82e28ac    file1.txt
100644 blob 01e6138faef088714355b81759a88101ce07a1a3    file2.txt

 

변경된 내용을 해시 포인터로 가리키는 file1.txt와 file2.txt가 잘 저장되어 있다. 이 tree 개체에 이전에 file1.txt 만 저장되어 있던 트리개체를 하위 개체로 넣어보자!! git read-tree 명령을 사용하여 tree 개체를 읽어 staging area에 추가할 수 있고 --prefix 옵션을 통해 트리 개체를 하위 디렉토리로 추가할 수 있다.

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ git read-tree --prefix=dir 9517b3c33e92dbc329ebcf5cd68e830c551dc90b

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ git write-tree
8d56ef0d1c9626a311c252277765bfb4955de370

user@DESKTOP-UCJOAKJ MINGW64 /d/GitStudy (master)
$ git cat-file -p 8d56ef0d1c9626a311c252277765bfb4955de370
040000 tree 9517b3c33e92dbc329ebcf5cd68e830c551dc90b    dir
100644 blob 2777791d6de7aac03f38b1b8403ad0fae82e28ac    file1.txt
100644 blob 01e6138faef088714355b81759a88101ce07a1a3    file2.txt

 

prefix로 준 이름을 가진 하위 tree 개체가 생성된 것을 볼 수 있다. 이 tree 개체로 워킹 트리를 생성하게 되면, 다음과 같은 구조를 가지는 폴더와 파일들이 생성되는 것이다.

 

Git은 이처럼 staging area에서 커밋하는 그 때의 폴더와 파일의 상태를 tree 개체와 blob 개체로 스냅샷을 떠 놓기 때문에 언제든지 해당 버전으로 되돌아 갈 수 있는 것이다.

 

 

 

 

reference : git

 

728x90

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

[Git] add  (1) 2023.11.26
[Git] Git 개체 - Commit  (2) 2023.11.22
[Git] Git 개체 - Blob  (1) 2023.11.21
[Git] init  (0) 2023.11.18
[Git] 설치 및 초기 설정  (1) 2023.11.18