git commit를 해보자
이 명령어는 버전관리되던 파일의 수정이 끝나 확정하는 것과 같다.
$ git commit
// git commit -m "message"
// 보통 이런 형식으로 사용된다
// -m : 다음 부분을 커밋 메세지로 남긴다는 것을 뜻한다.
- 현재 변경된 작업 과정들에 대한 점검을 마친 뒤, 확정하고 저장소에 저장하는 작업
- 이를 통해 버전 관리를 할수 있게 된다.
- 커밋 하나는 하나의 작업을 담고 있는것이 이상적이다.
- 커밋하는 시기를 놓쳐 많은 작업들을 담은 거대한 버전 하나를 만들어야 하는 경우가 발생한 경우 add라는 과정을 통해 커밋 하고자 하는 파일만 커밋을 할 수 있다.
$ git commit
커밋(버전)도 마치 파일의 내용과 같이 objects 디렉토리에 저장된다. 따라서 마찬가지로 objects 디렉토리에 서브디렉토리 3a이 생성되고 93bebce155c1267d9c5151b39b0292cc678e8f라는 이름을 가진 파일이 생성되었다.
objects\3a\93bebce155c1267d9c5151b39b0292cc678e8f
- [commit] 3a93bebce155c1267d9c5151b39b0292cc678e8f
$ git cat-file -t 3a93bebce155c1267d9c5151b39b0292cc678e8f
> commit
// git cat-file -t <object> 명령어를 통해 오브젝트의 타입은 commit이라는 것을 알 수 있다.
- objects라는 디렉토리 안에 있는 93bebce155c1267d9c5151b39b0292cc678e8f은 커밋에 대한 정보를 가지고 있다.
// git cat-file -p <object> 를 통해 해당 오브젝트 타입을 기반으로 <object> 의 내용을 확인
$ git cat-file -p 3a93bebce155c1267d9c5151b39b0292cc678e8f
> tree e42e333fda358e829fd6f5d169037317953ee494
> author : 코드를 처음에 만든 사람, 처음에 코드를 짜고 커밋한 사람
> comitter : 가장 최근에 커밋을 수정한 사람
> message : 버전에 대한 작업 내용
commit 오브젝트의 내용으로 tree, author, comitter, commit message를 포함하고 있음을 확인할 수 있다.
- tree 객체의 해시 값(Key)
- committer와 author : 타임 스탬프, 이름, 이메일 주소
- 커밋 메시지
오브젝트 파일이 가리키는 tree 객체의 해시 값(Key)을 통해 내용을 확인해 보면 index 파일의 내용을 가진 오브젝트 파일임을 알수있다.
// 기존 index의 내용
100644 78981922613b2afb6025042ff6bd878ac1994e85 0 f1.txt
100644 b68025345d5301abad4d9ec9166f455243a0d746 0 f2.txt
100644 78981922613b2afb6025042ff6bd878ac1994e85 0 f3.txt
// tree 객체의 내용
100644 blob 78981922613b2afb6025042ff6bd878ac1994e85 f1.txt
100644 blob b68025345d5301abad4d9ec9166f455243a0d746 f2.txt
100644 blob 78981922613b2afb6025042ff6bd878ac1994e85 f3.txt
- 인덱스에는 하나의 유니크한 tree 객체를 생성하는 데에 필요한 모든 정보가 들어있어 index를 통해 tree 객체를 만들 수 있다.
- git commit 명령을 실행하면 인덱스를 통해 tree 객체를 생성하고, 생성한 tree 객체를 저장하고, 새로운 commit 의 tree object로 사용한다.
- index와 최신 커밋을 비교하면 커밋할 내용이 있는지 알 수 있다.
- 최신 커밋의 트리의 내용과 index의 내용이 일치한다면 현재 커밋할 내용이 없다는 것
이를 통해 커밋을 한다면 commit 객체만이 생성되는 것이 아니라 tree객체 또한 생성 되는 것을 알 수 있다.
두번째 commit
- 파일의 내용을 변경한 뒤 add하면 index의 내용이 변경된걸 알 수 있다.
100644 78981922613b2afb6025042ff6bd878ac1994e85 0 f1.txt
100644 2795c87096b42d4b7b8fda82a67dabded5c72c97 0 f2.txt
100644 78981922613b2afb6025042ff6bd878ac1994e85 0 f3.txt
- 이후 commit을 하면 [commit] c4a78410ac16634358518337b98dbe3c42307701 객체가 생성된다.
$ git cat-file -p c4a78410ac16634358518337b98dbe3c42307701
> tree ededd83490b5e5bd930a42e90b73bdb00511fd72
> patent 3a93bebce155c1267d9c5151b39b0292cc678e8f
> author : 코드를 처음에 만든 사람, 처음에 코드를 짜고 커밋한 사람
> comitter : 가장 최근에 커밋을 수정한 사람
> message : 버전에 대한 작업 내용
- 두번쨰로 생성된 commit 객체는 첫번째 commit 객체와 다르게 parent( 상위 commit의 해시 값 )를 포함하고 있음을 확인할 수 있다.
- commit 객체은 커밋이 일어난 시점의 트리를 가리키고 있음을 확인할 수 있다.
// 첫 번째 commit 객체의 tree
100644 blob 78981922613b2afb6025042ff6bd878ac1994e85 f1.txt
100644 blob b68025345d5301abad4d9ec9166f455243a0d746 f2.txt
100644 blob 78981922613b2afb6025042ff6bd878ac1994e85 f3.txt
// 두 번째 commit 객체의 tree
100644 78981922613b2afb6025042ff6bd878ac1994e85 0 f1.txt
100644 2795c87096b42d4b7b8fda82a67dabded5c72c97 0 f2.txt
100644 78981922613b2afb6025042ff6bd878ac1994e85 0 f3.txt
각각의 버전( commit 객체 )마다 다른 트리를 가리키고 있고 트리에는 파일의 이름과 파일에 담겨있는 내용이 각각 링크가 되어 있기 때문에 버전이 가리키는 트리를 통해서 버전이 만들어진 시점의 상태를 얻어낼 수 있다.(스냅샷)
세번째 commit
- 새로운 디렉토리 d1을 추가하여 f1.txt 파일을 복사하여 저장한 뒤 커밋을 해보면 두번째 commit 객체의 해시 값을 포함 하며 커밋이 일어난 시점이 다르기 때문에 다른 트리를 가리키고 있음을 알 수 있다.
$ git cat-file -p a824c034faae3f7f9a476d286b1cd64dc284926f
> tree 16dacaea08ee7213e65452b29fd052405cde4066
> patent c4a78410ac16634358518337b98dbe3c42307701
> author : 코드를 처음에 만든 사람, 처음에 코드를 짜고 커밋한 사람
> comitter : 가장 최근에 커밋을 수정한 사람
> message : 버전에 대한 작업 내용
- 트리의 내용을 확인해 보면 d1의 이름과 내용에 의해 생성된 tree 객체를 확인할 수있는데 tree의 내용을 확인해 보면 d1 디렉토리에 담겨있는 파일의 이름과 파일의 내용이 담겨있는 정보( blob )가 tree 라는 형태로 링크되어 있음을 알 수있다.
$ git cat-file -p 16dacaea08ee7213e65452b29fd052405cde4066
> 040000 tree 9f8df35e4932276dd841530fab6b1c2ee3fdb37c d1
> 100644 blob 78981922613b2afb6025042ff6bd878ac1994e85 f1.txt
> 100644 blob 2795c87096b42d4b7b8fda82a67dabded5c72c97 f2.txt
> 100644 blob 78981922613b2afb6025042ff6bd878ac1994e85 f3.txt
$ git cat-file -p 9f8df35e4932276dd841530fab6b1c2ee3fdb37c
> 100644 blob 78981922613b2afb6025042ff6bd878ac1994e85 f1.txt
이처럼 깃은 버전 관리에 필요한 데이터를 객체(오브젝트)라는 개념으로 표현하고 objects 디렉토리에서 관리한다.
깃의 객체(Git Object)
객체 | 설명 |
blob(Binary Large OBject) | 파일 정보가 들어 있는 객체 각 버전의 파일이 blob으로 표현될 수 있다. 바이너리 파일로 SHA-1에 의해 이름이 정해진다. |
tree | Git의 디렉토리 정보가 들어 있는 객체 blob이나 다른 tree(하위)를 참조한다. |
commit | 커밋 정보가 들어 있는 객체 tree 객체를 가리킨다. tree, parrent, author, comitter, commit message에 대한 정보를 가진다. |
tag | annotated tag 정보가 들어 있는 객체 |
'Git' 카테고리의 다른 글
[Git] 커밋 취소/되돌리기/덮어쓰기(reset / revert / amend) (0) | 2024.06.04 |
---|---|
[Git] 태그(tag)의 기초와 사용법 (0) | 2024.06.02 |
[Git] 깃(Git)의 원리(2, commit)와 깃 객체(Git Object) (0) | 2024.06.02 |
[Git] 깃(Git)의 원리(1, add) (0) | 2024.04.11 |
[GIT] 버전 관리 시스템 깃(Git)이란? (0) | 2024.03.20 |