수색…
레포
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
순전히 탐색 할 수 있습니다. 그러나 이것은 대단히 불편할 것입니다. ref
는 objects
를 참조 할 수있는 편리한 이름을 제공합니다. git
에게 해시가 아닌 이름으로 특정 장소로 이동하는 것이 훨씬 쉽습니다.
커밋 개체
commit
은 git 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
명령은 몇 가지 작업을 수행합니다.
-
.git/objects
저장된 프로젝트 디렉토리를 나타내는blobs
과trees
를 만듭니다. - 작성자 정보, 커밋 메시지 및 1 단계의 루트
tree
를 사용하여 새commit
개체를 만듭니다. 또한.git/objects
저장.git/objects
-
.git/HEAD
의HEAD
ref를 새로 생성 된commit
의 해시로 업데이트합니다.
그 결과 프로젝트의 새로운 스냅 샷이 이전 상태에 연결된 git
에 추가됩니다.
움직이는 머리
커밋 (hash 또는 ref로 지정)에서 git checkout
을 실행하면 git
이 작업 디렉토리를 스냅 샷을 찍을 때의 모습으로 보이게합니다.
- 작업 디렉토리의 파일을
commit
내tree
와 일치하도록 업데이트합니다. -
HEAD
를 업데이트하여 지정된 해시 또는 참조를 가리 키도록합니다.
심판 이동
git reset --hard
실행하면 지정한 해시 / 참조로 참조가 이동합니다.
MyBranch
를 b8dc53
이동 :
$ 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