boostcamp

Day13 학습정리

daykim 2023. 7. 26. 13:27

소문으로만 듣던 그것이 나왔다.

 

VCS(Version Control System) 버전관리 시스템


코딩을 하다보면 마주하는 여러 문제가 있다.

  • 기능을 추가하다 문제가 발생해 원래 버전으로 돌아가고 싶은데, 수정사항이 너무 많을 때
  • 여러명이 동시에 작업할때 발생하는 오류나 충돌

등의 문제들이 생기는데, 이런 문제를 해결하기 위한 것이 VCS다.

즉, 소프트웨어 개발 및 유지보수 과정에서 발생하는 소스코드, 문서 등의 생성, 변경, 삭제 이력 등을 관리하는 것이다.

내가 원하는 버전으로 이동할 수 있다.

 

버전관리 시스템 종류

자세한건 git만 다루겠다. 이거만 쓰기도 하고.. 당장 필요한 내용이라

  • Local VCS (로컬 버전 관리 시스템)
  • CVCS (Centralized VCS, 중앙 집중식 버전 관리 시스템)
  • DVCS (Distributed VCS, 분산식 버전 관리 시스템) 

 

 

Git


  • 앞의 언젠가에 정리한 리눅스를 만든 리누스 토르발즈가 개발한 VCS다. 이 양반 뇌 좀 공유받고 싶다. 나도 저런 똑똑이 하고싶다.
  • CVS, SVN과 같은 기존 버전 관리 시스템의 성능이 마음에 들지 않아 어쩌구저쩌구들을 겪다 만들었다고 한다. (소문엔 2주 걸렸다는데..)
  • 공홈 소개
    • 소규모에서 대규모 프로젝트에 이르기까지 모든 것을 빠르고 효율적으로 처리하도록 설계된 무료 오픈소스 분산 버전 제어 시스템이다.
    • 배우기 쉽고 매우 빠른 성능과 작은 설치 공간을 갖는다.

 

Git 서비스

  • GitLab수많은 기업에서 보안성을 중시하는 프로그램 코드를 올려 협업하는 툴이다.
  • Github
    • Git으로 관리하는 프로젝트를 올려둘 수 있는 대표적 Git 호스팅 사이트다.
    • 호스팅 : 서버 컴퓨터 전체 또는 일정 공간을 이용할 수 있도록 임대해주는 서비스다. -> 운체에서 한 듯 찾아보자.
    • 무료 서버 저장소를 지원하고, 자신의 소스코드가 오픈되어 수많은 사람이 보며 활용 가능하다.

 

Git 구조

https://ux.stories.pe.kr/182

  • Working Directory(Local Repository) : 작업할 파일이 있는 디렉토리 (Local)
  • Staging Area : commit을 수행할 파일들이 올라가는 영역 (인덱스라고도 한다.)
  • Git Directory : Git 프로젝트의 메타 데이터와 데이터 정보가 저장되는 디렉토리 (.git 폴더)
  • 깃 프로젝트는 이러한 구성요소를 통해 동작한다.
  • Repository : 파일이나 디렉터리를 저장하는 장소다.
    • Remote Repository : 원격 저장소로, 파일을 원격 저장소 전용 서버에서 관리하고 공유 가능하다.

 

거의 모든 명령을 로컬에서 실행한다.

  • 예를들어 Git 프로젝트의 히스토리를 조회할 때, 로컬 데이터베이스에서 히스토리를 읽어서 보여준다. 서버없이, remote에 접근할 필요 없이 예전 버전을 가져올 수 있는 것이다.
  • 오프라인 상태에서도 커밋이 가능하다.

 

Git의 무결성

Git은 데이터를 저장하기 전 항상 체크섬을 구하고, 그 체크섬으로 데이터를 관리한다.

 

 

SHA (Secure Hash Algorithm, 안전한 해시 알고리즘)


Hash

  • 임의의 데이터(Key)를 고정된 크기의 데이터(Value)로 변화시켜 저장하는 것이다.
  • Hashing : 키에 대한 해시값을 구하는 과정이다.
  • 해시 알고리즘
    • 해싱을 할 때 사용하는 알고리즘(함수)다.
    • 계산이 복잡하지 않고, 키값에 대해 중복없이 해시값을 고르게 만들어내는 함수가 좋은 함수다.

 

SHA

  • 데이터 및 인증서를 해시해 디지털 지문이나, 메시지 다이제스트를 생성하는데 사용하는 암호화 해시 함수의 집합이다. 
  • 임의 크기의 입력 메시지를 일련의 연산을 적용해, 해시 또는 메시지 다이제스트로 고정 크기 출력을 생성한다.
  • 이 출력은 고유하다. -> 데이터 무결성
  • 해시는 단방향으로, 일단 데이터를 해시하면 브루트 포스 공격을 하지 않는 한 크래킹할 수 없다.
  • 여러 종류가 있는데, SHA-1 같은 경우는 길이가 짧아 크랙되기 쉽다..?

 

 

Git에서 Hash 사용


git에서 이런 이상한 문자열을 보는 경우가 많다.

  • 이 문자는 commit할 경우, git이 커밋한 순서를 알려주는 id로 저장하는 hash값이다.

 

왜 commit Id를 Hash로?

  • 앞에서 설명한 SHA의 데이터 무결성 때문이다.
  • git은 오프라인에서도 버전 관리를 할 수 있다고 했다.
  • 오프라인 상태에서 이전에 어떤 값을 썼는지 알 방법이 없다. 따라서 SHA를 사용하면, 어떤 상황에서도 commit이 가능한 것이다.
  • 깃에선 SHA1 알고리즘으로 만든 해시값을 사용한다고 한다.
  • 다만, 단순히 hash한다고 commit 순서를 기억할 수 없다.
  • 따라서 부모 hash값도 같이 저장한다.
    즉 이전에 어떤 commit이 있는지 확인 가능하고, 이것으로 순서를 기억해 commit을 합칠 수 있다.

 

Git 작동 방식


git init
  • git 내부를 저장하는데 사용되는 .git 이라는 숨겨진 폴더를 자동으로 생성한다. (git clone한 폴더 안에도 있다.)

 

 

git add FILENAME

Blob

  • 파일 컨텐츠를 저장하는 하위 폴더 .git/objects에 있는 blob 파일을 생성한다.
  • blob을 생성하는 것은 파일 내용의 그림을 저장하는 것과 같다.
  • 콘텐츠가 Hash 되면, 처음 두 문자는 .git/objects에 하위 폴더를 만드는데 사용되고, 해시의 나머지 문자는 Blob의 이름을 구성한다.
  • 서로 다른 파일인데, 콘텐츠 내용이 동일할 경우, 동일한 Hash를 가지므로, 동일한 blob에 저장된다.

https://towardsdatascience.com/how-git-truly-works-cd9c375966f6

  1. git은 파일 내용을 가져와 Hash한다.
  2. .git/object 폴더 내에 Blob을 만든다.
  3. git은 blob 내에 원본 파일(압축 버전)을 저장한다.

+ 여기에 추가로 'mysubtfolder/yourfile.txt'를 생성해 git add 했다고 가정한다.

https://towardsdatascience.com/how-git-truly-works-cd9c375966f6

 

 

git commit ...

이 명령어를 수행할 때, 다음 두 단계를 수행한다.

  • repository의 root tree 를 생성한다.
  • commit을 생성한다.

 

Tree 생성

https://towardsdatascience.com/how-git-truly-works-cd9c375966f6

  • 전체 저장소의 파일 및 폴더 구조를 저장한다.
  • 재귀 방식으로(?) 구축된 레포지토리에 포함된 모든 Blob 또는 하위 폴더에 대한 참조를 포함하는 파일이다.
  • 루트 트리 각 행은 blob 또는 다른 하위 트리를 참조한다. 또 하위 트리는 동일한 방식으로 blob과 하위 트리를 참조한다.
  • 즉, 트리는 티렉토리와 동일하다. 디렉토리에서 파일 및 하위 디렉토리에 액세스 가능한 것 처럼, 트리에서 Blob 및 하위 트리에 액세스할 수 있다.

https://towardsdatascience.com/how-git-truly-works-cd9c375966f6

  • Git이 루트 트리와 모든 관련 하위 트리를 생성하면,  해싱 및 저장 작업을 수행한다.
  • 각 트리를 해시하고, 처음 두문자를 사용해 .git/objects에 하위 폴더를 만들고, 나머지 해시 문자는 저장된 파일 이름을 형성한다.
  • 여기서 데이터 구조의 트리 수만큼 많은 새 파일을 얻는다.
    -> 예제에서 트리가 2개인 만큼 새 파일이 2개 생겼다.

 

commit 생성

  • 커밋 내용은 루트 트리, (있으면) 부모 커밋, 커밋 메시지의 이름과, 전자 메일과 같은 일부 메타데이터와 관련된 정보가 포함된 파일에 저장된다.

https://towardsdatascience.com/how-git-truly-works-cd9c375966f6

  • commit 파일이 생성되면, Git은 해당 컨텐츠를 해시하고, 해시 이름을 사용해 정확히 위와 같이 새 파일에 컨텐츠를 저장한다.

 

.git 내부


 

index

  • staging area를 index라고 하더라. 이 staging 영역을 기록하는 파일이다.
  • git add 를 수행하면, Working directory 정보와 동기화되며, 커밋이 가능해지는 대기상태가 된다.

 

object

  • commit
  • tree
  • blob

 

HEAD

  • Git은 우리가 어떤 브랜치에 있는지 알기 위해 HEAD를 본다.

 

 

 

 

File


 

 

참고 자료

'boostcamp' 카테고리의 다른 글

Day18 학습정리  (0) 2023.08.02
Day16 학습 정리  (0) 2023.07.31
Day11 학습 정리  (0) 2023.07.24
Day09 학습 정리  (0) 2023.07.20
Day08 학습 정리  (0) 2023.07.19