GIT 백엔드(후면)


소개


저는 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은 객체 데이터베이스(객체 디렉토리)에 다음과 같은 세 가지 주요 객체 유형을 저장합니다.
  • Blobs Object-Git는 파일 내용을 blob으로 저장합니다.주의해야 할 것은blob은 파일 이름이나 파일 모드를 포함하지 않고 엄밀히 말하면 Git 버전 제어 파일의 내용이다.SHA-1은 Blob 컨텐트(값)의 파일 이름(키)으로 사용됩니다.
  • 트리 대상 - 트리 대상은 디렉터리와 유사하며blob 대상과 다른 트리 대상을 포함합니다.트리 객체는 마지막으로 커밋할 때 작업 디렉토리의 스냅샷입니다.
  • 제출 객체 - 제출 객체는 현재 체크 아웃된 분기의 마지막 제출에 대한 세부 정보 (이것은 상위로 참조됨), 제출된 현재 트리 객체에 대한 포인터, 제출자의 이름 및 실제 제출 메시지를 기본적으로 저장합니다.
  • Git 객체 유형은 Git에서 객체를 저장하려고 할 때 자동으로 생성되는 하위 디렉토리에 구성됩니다.하위 디렉토리는 나머지 38개의 해시 키를 사용하여 명명된 파일에 저장된 SHA-1의 처음 두 문자를 사용하여 이름을 지정합니다.
      Objects/
        f7/
          de3a39b026386f8f826bc230a112ae792ec035
    

    GIT 실행 중


    이 절에서 우리는 일부 버전 제어를 실시하여 Git 대상이 어떻게 만들어지고 대상 데이터베이스에 저장되는지 직접 볼 것이다. 나는 이 절이 끝날 때까지 모든 것이 더욱 의미가 있을 것이라고 믿는다.
    나는gitbash와 합작하여 시범을 진행할 것이다.
  • 터미널/cmd 및 Cd를 선택한 디렉토리에 열고 명령$ git init을 입력하여 비어 있는 Git 저장소를 만듭니다.나의 예에서, 나는 한 가지 소식Initialized empty Git repository in C:/Users/opara prosper/Desktop/GitHub Projects/Git-Backend/.git/을 받았다. 너는 틀림없이 비슷한 소식을 받을 것이다. 그러나 목록은 다르다.
  • 프로젝트 디렉터리에서 새로운 터미널과 cd를 열고 두 터미널을 나란히 놓으면 내부에서 발생하는 일을 추적할 수 있습니다.git 디렉터리.
  • 포함 example.txt 을 내용으로 하는 새 파일Hello world을 만듭니다. 터미널에서 이 작업을 수행하려면 다음 명령cat > example.txt을 입력하고 새 줄에 내용을 입력하고 Ctrl D
  • 를 저장하고 사용하여 종료할 수 있습니다.
  • 두 번째 터미널에서 이 명령 find .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 디렉터리로 이동합니다.
  • Naviagate가 두 번째 터미널로 돌아가서 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가 프로젝트 파일에 대한 변경 사항을 추적하기 위해 백그라운드에서 어떻게 일을 하는지 하는 것이다.

    좋은 웹페이지 즐겨찾기