GIT 백엔드(후면)
7931 단어 gitgitinternalsversioncontrol
소개
저는 Git의 내부 구조를 깊이 연구하여 이 도구의 기본 지식을 진정으로 이해하고 Git가 모두가 알고 있는 기능인 버전 제어를 어떻게 실현하는지 깊이 있게 이해하고 있습니다.본고에서 저는 간단한 언어로 가능한 한 많은git의 내부 구조를 보여줌으로써 모든 git 사용자들이 이 신기한 도구 뒤의 핵심 개념을 이해하고 여러분과 저의 발견을 공유할 수 있도록 하고자 합니다.
중요 참고: 본고는 Git 자료에 대한 설명은 아니지만 프로젝트 파일의 다양한 버전을 추적하는 방법을 보여 줍니다.만약에 Git 초보자라면 본문Git documentation에 따라 문서를 읽거나 다운로드progit에 따라 Git basic의 멋진 설명을 얻을 수 있습니다. 그리고 본문을 되돌아보고 Git에 대해 깊이 있게 이해할 수 있습니다.
GIT 프런트엔드
지금까지 당신은 Git의 핵심이 사람들이 사용할 수 있는 버전 제어 시스템(VCS)이라는 것을 틀림없이 알고 있을 것이다. (지금은 개발자가 말하지 않고 누구나 Git를 사용할 수 있다. 예를 들어 나는 Git를 사용하여 본문을 작성하고 발표하기 전에 변경할 때 본문의 각 판본을 추적한다) 프로젝트 파일(문서)의 다른 버전/교체를 추적할 수 있다.
Git 이전에 대량의 VC가 존재했다. 예를 들어 CVS,subversion,perforce 등은 모두 중앙 버전 제어 시스템(CVCS)에 귀속되었다. 이것은 모든 버전화된 파일이 하나의 데이터베이스에 저장되고 이 프로젝트와 접촉하는 모든 다른 사람(클라이언트)은 중앙 데이터베이스에 연결해야 한다는 것을 의미한다.
다른 한편, Git는 분포식 버전 제어 시스템(DVCS)에 속하는데 이것은 중앙 데이터베이스가 없기 때문에 사람들이 파일을 전송하거나 저장해야 한다는 것을 의미한다.모든 Git 사용자의 컴퓨터는 파일의 데이터베이스이다. 이것은 프로젝트에 종사하는 모든 사람들이 프로젝트를 복제할 때 그들의 로컬 기계에서 프로젝트의 모든 역사를 가지고 있다는 것을 의미한다.그럼 이 데이터베이스는 당신의 컴퓨터에 어디에 놓을까요?프로젝트 디렉터리를 검사하면 Git를 사용하면 프로젝트의 하위 디렉터리와 파일만 볼 수 있다는 것을 확신합니다.나는 이 Git 마술을 서슴없이 폭로할 것이다
GIT 내부 위젯
프로젝트 디렉터리를git 저장소로 만드는 것은 이 프로젝트 디렉터리에 숨겨진 것입니다
.git directory
.이것git 폴더에git 대상 데이터베이스가 포함되어 있습니다. 이것이git의 신기한 점입니다.이 폴더는 마음속에 닿는 이야기(파일이 서로 관련되고 오류)가 없도록 일부러 숨겨져 있으며 Git의 완전성을 유지한다.윈도우즈 극객이라면 show hidden files
기능 follow this tutorial if you have no clue how to do this 을 사용하여 이 폴더를 볼 수 있습니다. 맥 사용자 here is your link 라면.이것git 디렉터리는 다음과 같이 다른 디렉터리와 파일을 포함합니다.
- .git/
- hooks
- info/
- exclude
- objects/
- info
- pack
- refs/
- heads
- tags
- config
- description
- HEAD
Git는 파일의 내용을 추적하고 추적한 내용을 대상으로 대상 데이터베이스에 저장하기 때문에 프로젝트의 다양한 버전을 효과적으로 관리할 수 있다.개체 디렉토리
Git 는 컨텐츠 주소 지정 파일 시스템으로, Git 가 파일 (객체) 을 포맷
key:value
으로 저장하는 것을 의미합니다. 여기서 키는 Git 저장소 컨텐츠 (객체) 의 주소, 즉 값입니다.Git는 SHA-1(보안 해시 알고리즘)을 사용하여 각 객체의 is 저장소에 고유한 키를 생성합니다.SHA-1은 객체 데이터베이스에 저장된 객체를 참조하기 위해 40자 길이의 영숫자 문자를 생성합니다(예:
f7de3a39b026386f8f826bc230a112ae792ec035
.이 개체 디렉토리는 Git가 각 개체를 저장하는 위치입니다. 개체 디렉토리는 개체 데이터베이스입니다.
Git은 객체 데이터베이스(객체 디렉토리)에 다음과 같은 세 가지 주요 객체 유형을 저장합니다.
Objects/
f7/
de3a39b026386f8f826bc230a112ae792ec035
GIT 실행 중
이 절에서 우리는 일부 버전 제어를 실시하여 Git 대상이 어떻게 만들어지고 대상 데이터베이스에 저장되는지 직접 볼 것이다. 나는 이 절이 끝날 때까지 모든 것이 더욱 의미가 있을 것이라고 믿는다.
나는gitbash와 합작하여 시범을 진행할 것이다.
$ git init
을 입력하여 비어 있는 Git 저장소를 만듭니다.나의 예에서, 나는 한 가지 소식Initialized empty Git repository in C:/Users/opara prosper/Desktop/GitHub Projects/Git-Backend/.git/
을 받았다. 너는 틀림없이 비슷한 소식을 받을 것이다. 그러나 목록은 다르다.example.txt
을 내용으로 하는 새 파일Hello world
을 만듭니다. 터미널에서 이 작업을 수행하려면 다음 명령cat > example.txt
을 입력하고 새 줄에 내용을 입력하고 Ctrl Dfind .git/objects -type f
을 입력하면 Objects 디렉터리에 아무런 내용이 없지만 곧 변경될 것입니다.git add example.txt
을 입력하여 파일을 임시 저장 영역으로 이동합니다.find .git/objects -type f
를 입력합니다.SHA-1은git 대상을 위한 랜덤 키를 만들기 때문에 이러한 응답.git/objects/70/c379b63ffa0795fdbfbc128e5a2818397b7ef8
을 받을 수 있습니다.이것은 Git의 개체 데이터베이스에 개체가 추가되었다는 것을 의미하지만, 우리는 아직 이것이 무엇인지 모른다.git cat-file -p 70c379b63ffa0795fdbfbc128e5a2818397b7ef8
를 입력하면 Hello World로 되돌아갔지만 파일 이름의 예시를 되돌려줍니다.txt는 어디에서도 찾을 수 없습니다. 이것은 제가 Git에 대해 내용 추적기라는 것을 강화했습니다.git add example.txt
명령을 실행할 때 Git은 eample의 내용을 캡처합니다.txt는 이를git 대상 데이터베이스에 압축하고 SHA-1을 사용하여 유일한 표지부호인 70c379b63ffa0795fdbfbc128e5a2818397b7ef8을 제공합니다.대상의 유형을 확인하려면 다음 명령 git cat-file -t 70c379b63ffa0795fdbfbc128e5a2818397b7ef8
을 입력하십시오. 우리의 예시에서blob을 되돌려줍니다. 이것은 새로 만든 대상이 blob 대상임을 의미합니다.git commit -m "I created an example.txt file"
을 입력하십시오. 변경 사항을 임시 저장 영역에서.git 디렉터리로 이동합니다.find .git/objects -type f
를 입력하면 제 예에서 두 개의 새로운 대상이objects 디렉터리에 추가되었음을 알 수 있습니다..git/objects/70/c379b63ffa0795fdbfbc128e5a2818397b7ef8
.git/objects/7a/68edc879868601bf427c8c2238bbc8752c33b3
.git/objects/f2/9f2741b30ecc1529da7dbae4aff9974b69e271
이러한 객체를 검사하여 객체를 캡처하고 git cat-file -t 7a68edc879868601bf427c8c2238bbc8752c33b3
를 입력합니다.제 예에서 commit
이 되돌아왔다는 것은 이 대상이 제출 대상이라는 것을 의미합니다. 이 대상을 보려면 -t
로고를 우리의 이전 명령에서 -p
, 즉 git cat-file -p 7a68edc879868601bf427c8c2238bbc8752c33b3
으로 변경하면 다음과 같은 응답을 받을 수 있습니다.tree f29f2741b30ecc1529da7dbae4aff9974b69e271
author OPARA-PROSPER <[email protected]> 1541583214 +0100
committer OPARA-PROSPER <[email protected]> 1541583214 +0100
I created an example.txt file
이것이 무엇을 의미하는지 자세히 봅시다.첫 번째 줄 트리 f29f2741b30ecc1529da7dbae4aff9974b69e271은 지난번에 제출했을 때 만든 두 번째 대상을 가리키는 지침(이 대상은 항상 트리 대상), 두 번째 줄과 세 번째 줄은 제출자에 대한 정보를 포함하고 마지막 줄은 제출 메시지를 포함한다.git cat-file -t f29f2741b30ecc1529da7dbae4aff9974b69e271
하는 것을 검사합니다.tree
응답을 되돌려줍니다. 이것은 이 대상이 나무라는 것을 의미합니다. 우리는 -t
로고를 -p
로 바꾸어 이 트리 대상의 내용, 즉 git cat-file -p f29f2741b30ecc1529da7dbae4aff9974b69e271
을 볼 수 있습니다. 이것은 다음과 같은 응답을 되돌려줍니다.100644 blob 70c379b63ffa0795fdbfbc128e5a2818397b7ef8 example.txt
트리 대상은blob와 다른 트리를 포함하는 디렉터리와 유사하며, 지난번에 제출했을 때 작업 디렉터리의 현재 상태의 스냅샷입니다.지난번에 제출했을 때, 우리 작업 디렉터리의 유일한 서류가 바로 이 예시였다.txt 파일, 이것이 바로 우리의 트리 대상에 포함된 내용입니다. 그러나 이번은gitadd 명령을 실행하여 변경을 준비할 때 만든blob 대상입니다.Git가 파일을 추적하지 않고 내용을 추적하기 때문입니다.우리의 트리 대상은 파일 모드 (100644, 이것은 일반적인 파일이라는 것을 의미), 대상 유형, SHA-1 키와 그 안에서 추출한 내용의 파일 이름에 대한 정보를 포함한다.
총결산
변경 사항, 임시 저장, 제출이 많을수록, 대상 데이터베이스에 새로운blob,tree,commit 대상을 만들고 인용합니다.
한 마디로 하면 이것은 사실상 Git가 프로젝트 파일에 대한 변경 사항을 추적하기 위해 백그라운드에서 어떻게 일을 하는지 하는 것이다.
Reference
이 문제에 관하여(GIT 백엔드(후면)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/kodekage/git-backend-behind-the-scene-12l5텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)