수색…


레포

git repository 는 파일과 디렉토리 집합에 대한 메타 데이터를 저장하는 디스크상의 데이터 구조입니다.

프로젝트의 .git/ 폴더에 있습니다. git에 데이터를 커밋 할 때마다 여기에 저장됩니다. 반대로, .git/ 는 모든 단일 커밋을 포함합니다.

기본 구조는 다음과 같습니다.

.git/
    objects/
    refs/

사물

git 은 근본적으로 핵심 가치 저장소입니다. 당신이 데이터를 추가 할 때 git , 그것은 빌드 object 와의 SHA-1 해시를 사용하여 object 키로의 내용을.

따라서 git 모든 내용은 해시로 조회 할 수 있습니다.

git cat-file -p 4bb6f98

Object 에는 다음과 같은 4 가지 유형이 있습니다.

  • blob
  • tree
  • commit
  • tag

HEAD 심판

HEAD 는 특별한 ref 입니다. 항상 현재 객체를 가리 킵니다.

.git/HEAD 파일을 확인하여 현재 가리키는 위치를 볼 수 있습니다.

일반적으로 HEAD 는 다른 ref 가리 킵니다.

$cat .git/HEAD
ref: refs/heads/mainline

그러나 object 직접 가리킬 수도 있습니다.

$ cat .git/HEAD
4bb6f98a223abc9345a0cef9200562333

때문에 - 이것은 "분리 된 헤드"로 알려진 무엇 HEAD 어떤 (가리키는)에 연결되지 않은 ref 하지만, 오히려 직접 가리키는 object .

참고 문헌

ref 는 기본적으로 포인터입니다. 그것은 object 를 가리키는 이름입니다. 예를 들어,

"master" --> 1a410e...

그것들은 .git / refs / heads / 일반 텍스트 파일에 저장됩니다.

$ cat .git/refs/heads/mainline
4bb6f98a223abc9345a0cef9200562333

이것은 일반적으로 branches 이라고하는 것입니다. 그러나, 당신은에 있습니다 것이다 git A와 같은 것은 없다 branch 만 - ref .

이제 해시로 직접 다른 objects 바로 뛰어 git 순전히 탐색 할 수 있습니다. 그러나 이것은 대단히 불편할 것입니다. refobjects 를 참조 할 수있는 편리한 이름을 제공합니다. git 에게 해시가 아닌 이름으로 특정 장소로 ​​이동하는 것이 훨씬 쉽습니다.

커밋 개체

commitgit commit 명령을 사용하여 git commit 것처럼 git 사용자에게 가장 익숙한 object 유형 일 것입니다.

그러나 commit 은 변경된 파일이나 데이터를 직접 포함하지 않습니다. 오히려 대부분은 메타 데이터와 commit 의 실제 내용을 포함하는 다른 objects 대한 포인터를 포함합니다.

commit 은 다음을 포함합니다 :

  • tree 해시
  • 부모 commit 해시
  • 저자 이름 / 이메일, 커미터 이름 / 이메일
  • 메시지를 커밋

다음과 같은 커밋의 내용을 볼 수 있습니다 :

$ git cat-file commit 5bac93
tree 04d1daef...
parent b7850ef5...
author Geddy Lee <[email protected]>
commiter Neil Peart <[email protected]>

First commit!

나무

매우 중요한 점은 tree 객체는 프로젝트의 모든 파일을 저장하고 diff가 아닌 전체 파일을 저장한다는 것입니다. 즉, 각 commit 에는 전체 프로젝트 *의 스냅 샷이 포함됩니다.

* 기술적으로 변경된 파일 만 저장됩니다. 그러나 이것은 효율성을위한 구현 세부 사항입니다. 디자인 관점에서 commit 은 프로젝트의 전체 복사본을 포함하는 것으로 간주되어야합니다 .

부모의

parent 행은 다른 commit 객체의 해시를 포함하며 "이전 커밋"을 가리키는 "부모 포인터"로 생각할 수 있습니다. 이것은 암묵적으로 커밋 그래프 라는 커밋 그래프를 형성 합니다. 특히, 그것은 지시 된 비순환 적 그래프 (또는 DAG)입니다.

트리 개체

tree 기본적으로 전통적인 파일 시스템의 폴더를 나타냅니다. 파일 또는 다른 폴더의 중첩 컨테이너입니다.

tree 에는 다음이 포함됩니다.

  • 0 개 이상의 blob 객체
  • 0 개 이상의 tree 객체

ls 또는 dir 을 사용하여 폴더의 내용을 나열하는 것처럼 tree 객체의 내용을 나열 할 수 있습니다.

$ git cat-file -p 07b1a631
100644 blob b91bba1b   .gitignore
100644 blob cc0956f1   Makefile
040000 tree 92e1ca7e   src
...

먼저 commit 에서 tree 의 해시를 찾은 다음 해당 tree 를보고 commit 할 파일을 찾을 수 있습니다.

$ git cat-file commit 4bb6f93a
tree 07b1a631
parent ...
author ...
commiter ... 
 
$ git cat-file -p 07b1a631
100644 blob b91bba1b   .gitignore
100644 blob cc0956f1   Makefile
040000 tree 92e1ca7e   src
...

물방울 개체

blob 에는 임의의 2 진 파일 내용이 들어 있습니다. 일반적으로 소스 코드 나 블로그 기사와 같은 원시 텍스트입니다. 그러나 PNG 파일이나 다른 어떤 것의 바이트 일 수도 있습니다.

blob 의 해시가 있다면 그 내용을 볼 수 있습니다.

$ git cat-file -p d429810
package com.example.project

class Foo {
 ...
}
...

예를 들어 위와 같이 tree 를 탐색 한 다음 그 안에있는 blobs 중 하나를 볼 수 있습니다.

$ git cat-file -p 07b1a631
100644 blob b91bba1b   .gitignore
100644 blob cc0956f1   Makefile
040000 tree 92e1ca7e   src
100644 blob cae391ff   Readme.txt

$ git cat-file -p cae391ff
Welcome to my project! This is the readmefile
...

새 커밋 만들기

git commit 명령은 몇 가지 작업을 수행합니다.

  1. .git/objects 저장된 프로젝트 디렉토리를 나타내는 blobstrees 를 만듭니다.
  2. 작성자 정보, 커밋 메시지 및 1 단계의 루트 tree 를 사용하여 새 commit 개체를 만듭니다. 또한 .git/objects 저장 .git/objects
  3. .git/HEADHEAD ref를 새로 생성 된 commit 의 해시로 업데이트합니다.

그 결과 프로젝트의 새로운 스냅 샷이 이전 상태에 연결된 git 에 추가됩니다.

움직이는 머리

커밋 (hash 또는 ref로 지정)에서 git checkout 을 실행하면 git 이 작업 디렉토리를 스냅 샷을 찍을 때의 모습으로 보이게합니다.

  1. 작업 디렉토리의 파일을 committree 와 일치하도록 업데이트합니다.
  2. HEAD 를 업데이트하여 지정된 해시 또는 참조를 가리 키도록합니다.

심판 이동

git reset --hard 실행하면 지정한 해시 / 참조로 참조가 이동합니다.

MyBranchb8dc53 이동 :

$ git checkout MyBranch      # moves HEAD to MyBranch
$ git reset --hard b8dc53    # makes MyBranch point to b8dc53     

새 참조 만들기

git checkout -b <refname> 실행하면 현재 commit 을 가리키는 새로운 ref를 생성합니다.

$ cat .git/head
1f324a

$ git checkout -b TestBranch

$ cat .git/refs/heads/TestBranch
1f324a


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow