Git vs. 직접 구현한 Git
git - 간편 안내서 - 어렵지 않아요!
- 공통점
- 형상관리 시스템임
- 해시 방식으로 동작하고 커밋 및 로그 조회, 복원 가능함
- 차이점
- git은 콘솔, 직접 구현한 git은 가상 콘솔 및 가상 경로에서 동작함
- commit 전 staging 단계 없음. 커밋 로그 없음
- branch, merge 등 브랜치 기능 없음
- 원격에 저장하는 pull, push 및 clone 기능 없음
의문점..
- 롤백 시 삭제된 파일 복구 및 최초 생성된 파일 삭제가 불완전
- 한게 차이가 아닐까 했는데 직접 git으로 파일 삭제, 생성하고 롤백해보니



- 아니 이게 뭐야 삭제한 건 복구가 안된다..?
- 심지어 새로 생성한 것도 롤백시 삭제가 안됨..
- 엄한 데 삽질하고 있었던 걸로 (근데 있으면 더 좋지 않을까..?)
- 기능이 있긴 하다. 아래
GIT 심화
참조
얕은 복사와 깊은 복사
[JS] 참조 타입의 얕은 복사와 깊은 복사(Shallow Copy & Deep copy)
얕은 복사
얕은 복사
란 객체를 복사할 때 원본 값과 복사된 값이 같은 참조(=메모리 주소)를 가리키는 것.
- 객체 안의 객체가 있는 경우, 하나의 객체라도 원본 객체를 참조한다면 얕은 복사이다. 얕은 복사 후 해당 변수를 수정하면 원본 값이 변한다.
- 포인터, 레퍼런스 개념에서 같은 레퍼런스의 다른 두 포인터를 의미
깊은 복사
깊은 복사
란 객체가 다른 주소를 참조하며 내부의 값(Value)
만 복사
- 객체 안의 객체가 있더라도 완전한 의미의 복사이므로 수정해도 원본 값이 변하지 않는다.
Branch 구현을 위해
- 브랜치 구현은 기존의 .git/index/commits처럼 commits 파일을 하나만 만들지 말고, 새로운 브랜치를 만들 때
브랜치명
으로 파일을 하나 더 만들어서 이전의 값을 복사해서 가져온 다음 쌓아나가면 될 것이다.
- default로
main
브랜치를 두고, 변경 시 다음과 같이 하면 될 듯 하다.
git branch
: 전체 branch 조회
git branch [브랜치명]
: 새로운 commits 파일 [브랜치명]으로 생성
git checkout [브랜치명]
: 해당 [브랜치명]을 저장해두고 log, restore, commit 명령 시 이 commits 파일을 조회하도록 한다.
Clone 구현을 위해
- 클론 구현은 우선
.git
파일을 압축해서 인터넷상에 보관해둔다 가정하고, zlib으로 이를 압축 해제 한 후 파일들을 최근 커밋을 기점으로 순차적으로 압축해제하면 될 것이다.
commit()
에서 만들어 두었던 파일 이름별 최근 상태(hash)를 조회하는 로직을 이미 구현해 두었으므로, 이를 이용해 하나씩 blob 파일을 압축 해제하여 로컬에 fs.writeFileSync()로 쓰면 된다.
- 새로 생성된 파일을 따로 표시해두고, 최근 삭제된 파일을 따로 표시해 두었다면
최근 커밋 시점으로 restore
하는 것으로 해결할 수 있다.
GIT 심화
앞서 말했던 커밋 리셋 시 되지 않았던 삭제/생성을 기능상 제공하긴 한다.
따로 리스트에 저장해놓나봄
삭제한 파일 복구
[git] 삭제된 파일 복구하는 방법

요런식으로 하면 복구가 되더라.
Hard 옵션
git reset —hard [commit_id]
요런식으로 하드 옵션을 주면
- 그 시점으로 돌아가 삭제됐던 파일은 복구되고.
- 이후 생성되었던 파일들은 정상적으로 삭제가 됨.
원리 (reflog)
[Git] git reflog를 이용하여 git reset --hard로 지워진 커밋 복구하기
[Git] 내부 동작 원리에 대한 이해
해시 함수 성능 개선
충돌 가능성이 더 낮은 해시 함수를 만들기 위해 전혀 다른 두 알고리즘의 해시 이어붙이기
를 활용했다.
- 해시 함수 이어붙이기의 근거, 해시 함수 설명
-
해시 함수는 해시함수는 큰 길이의 값을 단방향 함수로 작은 값으로 변환하는 함수로, 무결성 검사(위변조 검사) 등에 주로 활용된다. 이러한 의도 때문에 해시가 가장 크게 문제가 되는 포인트는 해시 충돌
이다.
-
해시 충돌을 피하는 방법은 선형 조사법
, 이차 조사법
, 이중 해시
, 체이닝
등이 있다.
-
본 미션 수행에서 사용한 방법은 이중 해시
활용의 일종으로, 전혀다른 두 해시함수를 사용하여 우연한 해시 충돌이 일어날 확률을 비약적으로 낮추어 충돌을 방지하는 방법이다.
[자료구조] 해쉬 충돌(Collision) 문제의 해결책
퀴즈
- git object
- 얕은 복사한 객체 안에 객체가 있는 경우, 객체를 freeze 하고 객체 안의 객체를 수정하면 원본 값이 변한다.
- 정답: O
[TIL] Git 내부 작동과 깊은 복사
[JS] 참조 타입의 얕은 복사와 깊은 복사(Shallow Copy & Deep copy)
- hash
- SHA256은 해시값 충돌이 일어나지 않은 안전한 해시함수이다.
- 정답: X
- 이론적으로는 (2^256 + 1)개의 서로 다른 숫자를 SHA-256에 대입하면 충돌 쌍이 발견될 것이다.
SHA-256 충돌은 왜 발견되지 않았을까?
- git clone
- 서버에서 파일을 git clone하면 로컬 컴퓨터의 지정된 폴더에 숨겨진 폴더 .git이 생성되고, .git/config 파일에 remote url이 저장된다.
- 정답: O
그림으로 보는 Git의 개념 이해하기
[Git] 내부 동작 원리에 대한 이해