VCS란 (Version Control System)의 줄임말로 파일 변경을 시간에 따라 기록하고 필요할 때 특정 버전을 호출할 수 있는 시스템을 의미한다.
이번 git의 대한 설명은 이전의 포스트의 내용을 기반으로 작성을 했다.
깃에서 우리가 명령을 실행했을 때,
각각의 파일은 무조건 4가지 상태 중에 하나이다.
아래 그림은 동작에 따른 상태 변화를 보여준다.
여기까지 우리가 이미 알고 있던 지식과 함께 생각해보면 어쩌면 당연한 이야기이다.
그럼 여기서 우리가 알고있던 지식에서 Git 객체를 합쳐서 생각을 해보자.
종류
git init
명령을 치면 .git 폴더가 생기고 그 안에 여러 파일이 생긴다.
여기서 만약 우리가 아래 보이는 파일을 추가했다고 가정해보자.
// test.txt
Hello World!!
그럼 .git/objects
위치에 디렉토리가 하나 생기고 디렉토리 안에 수상한 이름의 파일이 생성될 것이다.
결론부터 이야기하면 해당 디렉토리명과 파일명은 파일 내용 "Hello World"
의 해시값을 기준으로 만들어진다.
"Hello World!!" 의 해시값
096c0a72c31f9a2d65126d8e8a401a2ab2f2e21d0a282a6ffe6642bbef65ffd9
해시 값을 기준으로 디렉토리 이름과 파일명은 다음과 같이 만들어진다.
09
)6c0a72c31f9a2d65126d8e8a401a2ab2f2e21d0a282a6ffe6642bbef65ffd9
)따라서 git add 명령이 들어오면 아래와 같이 Blob 객체가 만들어진다.
파일 모드 / 개체명 / 해시값 / 파일명
과 같이 기록한다.앞서 말했던 "Hello World!!" 로 만들어진 블롭을 기준으로 생각해보자.
Tree에는 해당 블롭 객체에 대한 정보가 다음과 같이 저장될 것이다.
100644 blob 096c0a72c31f9a2d65126d8e8a401a2ab2f2e21d0a282a6ffe6642bbef65ffd9 test.txt
어떤 파일인지 (ex: 일반파일은 100644) / 객체명(ex: blob) / 해시값 / 파일명
형식이다.
그럼 여기서 파일이 여러개 더 생기면 어떻게 될까?
당연하게도 트리에 어떤 파일인지 / 객체명(ex: blob) / 해시값 / 파일명
형식의 문자열이 몇줄 더 생길 것이다.
git commit -m "대충 커밋 메시지"
를 실행.[이전트리 해시값, 현재트리 해시값]
)그럼 이제 위의 동작을 바탕으로 git branch는 어떻게 될지 상상이 되는가?
나는 상상이 잘 안간다.
그 이유는 우리가 모르는 부분이 있기 때문이다.
깃이 생성되면 앞서 우리가 말한 깃 객체가 저장되는 objects 폴더도 생기고 다른 파일도 많이 생기지만, 주요 기능을 담당하는 2가지가 더 있다.
objects/
: 블롭, 트리, 커밋, 태그 객체가 저장된다.refs/
: 브랜치와 태그 등의 참조가 저장된다.HEAD
: 현재 체크아웃된 브랜치를 가리키는 포인터.우리가 궁금한 부분이 refs
에 간단하게 적혀있다.
이정도로는 쉽게 이해가 되지 않으니 동작의 흐름과 각 파일의 역할을 살펴보자.
HEAD 파일은 현재 체크아웃된 브랜치를 가리키는데 아래 예시를 보면 쉽게 이해된다.
예시
main
브랜치가 체크아웃된 상태: ref: refs/heads/main
new-branch
브랜치가 체크아웃된 상태: ref: refs/heads/new-branch
a1b2c3d4e5f6...
위에서 HEAD 파일에 저렇게 저장된다고 하는데 그럼 이 위치에는 무엇이 저장되어 있을까?
이 부분의 각 파일에는 각각의 브랜치가 가리키는 최신 커밋 객체의 해시값이 저장되어 있다.
예시
.git/refs/heads/main
파일의 내용: a1b2c3d4e5f6...
(main 브랜치의 최신 커밋 해시값).git/refs/heads/new-branch
파일의 내용: f7g8h9i0j1k2...
(new-branch 브랜치의 최신 커밋 해시값)브랜치 생성 (git branch new-branch
):
.git/refs/heads/new-branch
파일을 생성.브랜치 전환 (git checkout new-branch
):
.git/HEAD
파일이 ref: refs/heads/new-branch
로 업데이트된다.new-branch
브랜치의 최신 커밋 상태로 변경된다.이 부분은 이제 우리가 앞서 말한 동작과 동일하다.
add를 하면 블롭 객체가 저장되고 objects
디렉토리에 저장된다.
commit을 하면 트리 객체와 커밋 객체가 objects
디렉토리에 저장된다.
여기서 한가지 다른점은 HEAD가 가리키는 위치의 최신 커밋 해시값이 저장되는데,
HEAD가 refs/heads/main
을 가리키면 해당 위치의 main 파일에 최신 해시값이 저장되고
HEAD가 refs/heads/new-branch
를 가리키면 new-branch 파일에 최신 해시값이 저장되는 점이다.
.git/
├── HEAD (현재 체크아웃된 브랜치나 커밋을 가리킴: ref: refs/heads/<브랜치 이름> 또는 커밋 해시값)
├── refs/
│ └── heads/
│ ├── main (main 브랜치의 최신 커밋 해시값)
│ └── new-branch (new-branch 브랜치의 최신 커밋 해시값)
├── objects/
│ ├── (블롭, 트리, 커밋 객체들)
...
crypto 모듈은 암호화 기능을 제공하며 해시 생성, 암호화, 복호화 작업을 진행할 수 있게 해주는 Node.js에서 기본적으로 제공하는 모듈이다.
해시 생성
const crypto = require('crypto');
// 데이터 해시
const hash = crypto.createHash('sha256');
hash.update('Hello, world!');
console.log(hash.digest('hex'));
Node.js에서 데이터 압축과 압축 해제를 지원하는 기본 모듈로 공간을 절약하거나 네트워크 전송 시 데이터 전송량을 줄일 수 있다.
일반적으로 gzip
과 deflate
알고리즘을 사용.
압축
zlib.gzip()
: Gzip 형식으로 압축.zlib.deflate()
: Deflate 형식으로 압축.압축 해제
zlib.gunzip()
: Gzip 형식으로 압축 해제.zlib.inflate()
: Deflate 형식으로 압축 해제.const fs = require('fs');
const zlib = require('zlib');
// 압축할 파일 경로와 압축된 파일을 저장할 경로
const inputFilePath = 'input.txt';
const outputFilePath = 'input.txt.gz';
// 읽기 스트림과 쓰기 스트림 생성
const input = fs.createReadStream(inputFilePath);
const output = fs.createWriteStream(outputFilePath);
// Gzip 압축 스트림 생성
const gzip = zlib.createGzip();
// 읽기 스트림을 Gzip 압축 스트림을 거쳐 쓰기 스트림으로 전달
input.pipe(gzip).pipe(output);
console.log('File compression complete.');
const fs = require('fs');
const zlib = require('zlib');
// 압축 해제할 파일 경로와 복원된 파일을 저장할 경로
const inputFilePath = 'input.txt.gz';
const outputFilePath = 'input.txt';
// 읽기 스트림과 쓰기 스트림 생성
const input = fs.createReadStream(inputFilePath);
const output = fs.createWriteStream(outputFilePath);
// Gzip 압축 해제 스트림 생성
const gunzip = zlib.createGunzip();
// 읽기 스트림을 Gzip 압축 해제 스트림을 거쳐 쓰기 스트림으로 전달
input.pipe(gunzip).pipe(output);
console.log('File decompression complete.');
깃 동작
https://conceptbug.tistory.com/entry/Git-버전-관리-시스템Version-Control-System의-역사
https://nulab.com/ko/learn/software-development/git-tutorial/git-basics/what-is-git/git-components/
https://inpa.tistory.com/entry/GIT-⚡%EF%B8%8F-개념-원리-쉽게이해#
깃 파일 상태 & 동작
https://dev-coco.tistory.com/48
깃 객체
https://sjevie.tistory.com/entry/Git-개체
zlib
https://blog.naver.com/ndb796/221047657914
JS Blob 객체
https://www.heropy.dev/p/QlwiuS
Node crypto