소문으로만 듣던 그것이 나왔다.
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 구조
- Working Directory(Local Repository) : 작업할 파일이 있는 디렉토리 (Local)
- Staging Area : commit을 수행할 파일들이 올라가는 영역 (인덱스라고도 한다.)
- Git Directory : Git 프로젝트의 메타 데이터와 데이터 정보가 저장되는 디렉토리 (.git 폴더)
- 깃 프로젝트는 이러한 구성요소를 통해 동작한다.
- Repository : 파일이나 디렉터리를 저장하는 장소다.
- Remote Repository : 원격 저장소로, 파일을 원격 저장소 전용 서버에서 관리하고 공유 가능하다.
거의 모든 명령을 로컬에서 실행한다.
- 예를들어 Git 프로젝트의 히스토리를 조회할 때, 로컬 데이터베이스에서 히스토리를 읽어서 보여준다. 서버없이, remote에 접근할 필요 없이 예전 버전을 가져올 수 있는 것이다.
- 오프라인 상태에서도 커밋이 가능하다.
Git의 무결성
Git은 데이터를 저장하기 전 항상 체크섬을 구하고, 그 체크섬으로 데이터를 관리한다.
- SHA-1 해시를 사용해 체크섬을 만든다. -> 일단 읽은 글엔 이렇게 되어있는데 다시 확인해봐야 할듯?
- 파일의 내용이나 디렉토리 구조를 이용해 체크섬을 구한다.
- 깃은 모든 것을 해시로 식별한다. 실제로 파일을 이름으로 저장하는 것이 아닌, 해당 파일의 해시로 저장한다.
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에 저장된다.
- git은 파일 내용을 가져와 Hash한다.
- .git/object 폴더 내에 Blob을 만든다.
- git은 blob 내에 원본 파일(압축 버전)을 저장한다.
+ 여기에 추가로 'mysubtfolder/yourfile.txt'를 생성해 git add 했다고 가정한다.
git commit ...
이 명령어를 수행할 때, 다음 두 단계를 수행한다.
- repository의 root tree 를 생성한다.
- commit을 생성한다.
Tree 생성
- 전체 저장소의 파일 및 폴더 구조를 저장한다.
- 재귀 방식으로(?) 구축된 레포지토리에 포함된 모든 Blob 또는 하위 폴더에 대한 참조를 포함하는 파일이다.
- 루트 트리 각 행은 blob 또는 다른 하위 트리를 참조한다. 또 하위 트리는 동일한 방식으로 blob과 하위 트리를 참조한다.
- 즉, 트리는 티렉토리와 동일하다. 디렉토리에서 파일 및 하위 디렉토리에 액세스 가능한 것 처럼, 트리에서 Blob 및 하위 트리에 액세스할 수 있다.
- Git이 루트 트리와 모든 관련 하위 트리를 생성하면, 해싱 및 저장 작업을 수행한다.
- 각 트리를 해시하고, 처음 두문자를 사용해 .git/objects에 하위 폴더를 만들고, 나머지 해시 문자는 저장된 파일 이름을 형성한다.
- 여기서 데이터 구조의 트리 수만큼 많은 새 파일을 얻는다.
-> 예제에서 트리가 2개인 만큼 새 파일이 2개 생겼다.
commit 생성
- 커밋 내용은 루트 트리, (있으면) 부모 커밋, 커밋 메시지의 이름과, 전자 메일과 같은 일부 메타데이터와 관련된 정보가 포함된 파일에 저장된다.
- 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 |