Git
의 핵심은 단순한 Key-value
데이터 저장소git init
으로 저장소 생성.git/objects
, .git/objects/info
, .git/objects/pack
디렉토리가 생성pack
폴더 아래에 오브젝트를 압축한 바이너리 파일과 무엇이 압축되었는지 기록하는 index
파일이 생성.git/objects/{hash}
이름으로 파일, tree, commit이 생성git add
할 때 생성git commit
할 때 생성Tree
개체에 파일 이름, blob
의 해시값, 다른 tree
의 해시값 저장Tree
는 디렉토리, Blob
은 일반 파일, Inode
에 대응Tree
개체 하나는 여러 항목을 가질 수 있다git commit
할 때 생성Tree
개체를 불러오려면 해싱된 값을 기억해야하는 어려움 → 스냅샷을 누가, 언제, 왜 저장했는지 정보는 커밋 개체에 저장Tree
를 하나 가리킴Tree
개체를 하나씩 가리킴Blob
, Tree
, commit
개체는 모두 .git/objects
디렉토리에 저장git tag
할 때 생성commit명
, tag
, message
등이 기록.git/refs/heads
에 branch 디렉토리로 존재commit
hash 존재git init
했을 때는 heads
에 데이터 없음!.git/HEAD
파일에 명시commit
없이 브랜치 생성하면 .git/HEAD
에 명시되어 있지만 .git/refs/heads
에는 값이 없음git checkout
할 시 .git/HEAD
의 내용이 변경!commit
과 병합할 브랜치가 가리키는 commit
, 이 두 객체가 공통으로 물려받은 조상 commit
을 3 way-merge방식으로 병합JSON.stringify() & JSON.parse()
: 객체를 json 문자열로 변환하고 JSON.parse()
를 사용해 객체로 만들어주는 깊은 복사 (하지만 속도가 느리고 함수는 복사할 수 없음)Lodash - clonedeep
: 깊은 복사 및 함수 복사도 가능Array.prototype.slice()
: start와 end값을 설정하지 않으면 기존 배열을 얕은 복사Object.assign()
: 1차원 객체에는 깊은 복사, 2차원 객체는 얕은 복사Spread
1차원 객체에서만 깊은 복사, 2차원 객체는 얕은 복사
원본 주소와 참조를 끊어주기 위해서 새로운 주소값에 값을 할당하면 깊은 복사
let obj = { a: "안녕하세요?" };
let obj2 = { ...obj, a: "반갑습니다." };
console.log(obj); // { a: "안녕하세요?" };
console.log(obj2); // { a: "반갑습니다?" };
Number
, String
, Boolean
, Null
, Undefined
등이 있다Symbol
, Object
가 있다참고자료
https://git-scm.com/book/ko/v2/Git의-내부-Git-개체
https://git-scm.com/book/ko/v2/Git의-내부-Git-Refs
https://storycompiler.tistory.com/7
https://coding-groot.tistory.com/68
https://xzio.tistory.com/1024
https://velog.io/@recordboy/JavaScript-얕은-복사Shallow-Copy와-깊은-복사Deep-Copy