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차원 객체는 얕은 복사Spread1차원 객체에서만 깊은 복사, 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