CS와 Node.js 10. Git 직접 구현(init, commit, log, restore, clone, remote, push), 얕은/깊은 복사, Hash

박재하·2023년 11월 3일
0

CS와 Node.js

목록 보기
10/12

Git vs. 직접 구현한 Git

git - 간편 안내서 - 어렵지 않아요!

  • 공통점
    • 형상관리 시스템임
    • 해시 방식으로 동작하고 커밋 및 로그 조회, 복원 가능함
  • 차이점
    • git은 콘솔, 직접 구현한 git은 가상 콘솔 및 가상 경로에서 동작함
    • commit 전 staging 단계 없음. 커밋 로그 없음
    • branch, merge 등 브랜치 기능 없음
    • 원격에 저장하는 pull, push 및 clone 기능 없음

의문점..

  • 롤백 시 삭제된 파일 복구 및 최초 생성된 파일 삭제가 불완전
  • 한게 차이가 아닐까 했는데 직접 git으로 파일 삭제, 생성하고 롤백해보니

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2023-07-26_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_9 31 49

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2023-07-26_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_9 32 51

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2023-07-26_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_9 33 09

  • 아니 이게 뭐야 삭제한 건 복구가 안된다..?
    • 심지어 새로 생성한 것도 롤백시 삭제가 안됨..
    • 엄한 데 삽질하고 있었던 걸로 (근데 있으면 더 좋지 않을까..?)
  • 기능이 있긴 하다. 아래 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] 삭제된 파일 복구하는 방법

%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2023-07-26_%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE_9 37 56

요런식으로 하면 복구가 되더라.

Hard 옵션

git reset —hard [commit_id] 요런식으로 하드 옵션을 주면

  • 그 시점으로 돌아가 삭제됐던 파일은 복구되고.
  • 이후 생성되었던 파일들은 정상적으로 삭제가 됨.

원리 (reflog)

[Git] git reflog를 이용하여 git reset --hard로 지워진 커밋 복구하기

[Git] 내부 동작 원리에 대한 이해

해시 함수 성능 개선

충돌 가능성이 더 낮은 해시 함수를 만들기 위해 전혀 다른 두 알고리즘의 해시 이어붙이기를 활용했다.

  • 해시 함수 이어붙이기의 근거, 해시 함수 설명
    • 해시 함수는 해시함수는 큰 길이의 값을 단방향 함수로 작은 값으로 변환하는 함수로, 무결성 검사(위변조 검사) 등에 주로 활용된다. 이러한 의도 때문에 해시가 가장 크게 문제가 되는 포인트는 해시 충돌이다.

    • 해시 충돌을 피하는 방법선형 조사법, 이차 조사법, 이중 해시, 체이닝 등이 있다.

    • 본 미션 수행에서 사용한 방법은 이중 해시 활용의 일종으로, 전혀다른 두 해시함수를 사용하여 우연한 해시 충돌이 일어날 확률을 비약적으로 낮추어 충돌을 방지하는 방법이다.

      [자료구조] 해쉬 충돌(Collision) 문제의 해결책

퀴즈

  1. git object
  • 얕은 복사한 객체 안에 객체가 있는 경우, 객체를 freeze 하고 객체 안의 객체를 수정하면 원본 값이 변한다.
  • 정답: O

[TIL] Git 내부 작동과 깊은 복사

[JS] 참조 타입의 얕은 복사와 깊은 복사(Shallow Copy & Deep copy)

  1. hash
  • SHA256은 해시값 충돌이 일어나지 않은 안전한 해시함수이다.
  • 정답: X
  • 이론적으로는 (2^256 + 1)개의 서로 다른 숫자를 SHA-256에 대입하면 충돌 쌍이 발견될 것이다.

SHA-256 충돌은 왜 발견되지 않았을까?

  1. git clone
  • 서버에서 파일을 git clone하면 로컬 컴퓨터의 지정된 폴더에 숨겨진 폴더 .git이 생성되고, .git/config 파일에 remote url이 저장된다.
  • 정답: O
%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA_2023-07-28_%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB_10 29 30

그림으로 보는 Git의 개념 이해하기

[Git] 내부 동작 원리에 대한 이해

profile
해커 출신 개발자

0개의 댓글