Git

깃은 컴퓨터 파일의 변경사항을 추적하고 여러 명의 사용자들 간에 해당 파일들의 작업을 조율하기 위한 분산 버전 관리 시스템입니다. 소프트웨어 개발에서 소스 코드 관리에 주로 사용되지만, 어떠한 파일 집합의 변경사항을 지속적으로 추적하기 위해 사용될 수 있습니다. 빠른 수행 속도에 중점을 두고 있고 데이터 무결성, 분산, 비선형 워크플로우를 지원합니다.

DVCS(분산 저장소 방식)

Git은 Distributed Version Control System입니다. 단순히 파일의 마지막 스냅샷을 checkout 하지 않고 저장소를 history와 더불어 전부 복제합니다. 서버에 문제가 생기면 이 복제물로 다시 작업을 시작할 수 있고, 클라이언트 중에서 아무나 골라도 서버를 복원할 수 있습니다. 또한, 많은 수의 원격 저장소를 가질 수 있기 때문에 다양한 방법으로 협업할 수 있습니다.
img1 daumcdn

용어

Git에서 자주 사용하는 용어를 정리해보았습니다.

  • 저장소 관련
    • remote
      • Remote Repository, Local에 위치하지 않은, 다른 곳에 저장되어 있는 저장소이다. 보통 github의 repository를 의미한다.
    • local
      • Local Repository, 현재 사용하는 장치에 존재하는 저장소이다.
    • init
      • Remote repository와 연동하기 위해 가장 먼저 수행되는 초기화 작업이다.
    • clone
      • 복제로, remote repository에 저장되어 있는 모든 데이터를 local로 복사해오는 기능이다.
      • clone이 진행되면, local repository와 remote repository가 연결된다.
  • 상태 관리 관련
    • git repository
      • 저장소로, 파일이나 폴더를 저장해두는 곳이다. Local Repository와 Remote Repository로 나뉜다.
    • staging area
      • Working directory에서 작업한 파일을 local repository에 전달하기 위해 파일들을 분류하는 공간이다.
    • working directory
      • 개발자가 소스코드를 수정하며 개발하는 공간이다.
  • 파일 관련
    • Working Directory의 모든 파일들은 관리대상이 아닌 Untracked와 관리대상인 tracked 파일로 나뉜다.
    • Tracked 파일은 수정하지 않은 Unmodified, 수정한 Modified, commit을 한 Staged 상태로 나뉜다. lifecycle
    • Untracked
      • 관리 대상이 아닌 working directory 파일
    • Tracked
      • Unmodified
        • Clone 직후 또는 마지막 commit 이후 아무것도 수정하지 않은 상태
      • Modified
        • Unmodified 상태의 파일을 수정한 경우
      • Staged
        • Modified 상태의 파일을 commit한 경우
        • Commit을 하게 되면, working directory의 변경 사항이 staging area로 올라가게 된다. 이 때 변경된 파일들은 Staged 상태가 되어 commit되고, commit 직후 unmodified 상태로 변경된다.

Git Object

git init을 하게 되면 해당 폴더에는 .git 폴더가 생깁니다. 이 폴더에는 여러 파일들이 생성되는데, 이 파일들을 통해 파일들의 버전을 관리합니다. data-model-1)

Git의 핵심은 단순한 Key-Value(파일 이름-파일 데이터) 데이터 저장소라는 것입니다. 어떤 형식의 데이터라도 집어넣을 수 있고, 해당 key로 언제든지 데이터를 가져올 수 있습니다.

Git은 가볍고 빠릅니다. Git은 크게 4가지 원소로 설계되었는데, 이는 Commit, Tree, Blob, Tag입니다. Git은 내부적으로 이 4가지 object 원소를 관리합니다. 이 object들은 .git/objects 폴더에 개별적인 파일들로 존재합니다.

Object가 담긴 파일의 이름은 git이 object 컨텐츠의 내용을 참고하여 생성하는 40자리 문자열입니다. Git에 ‘hello.txt’ 파일을 하나 추가한다고 가정합시다. 이때 hello.txt 이름의 object가 아닌 hello.txt 파일의 내용 전부를 hash table에 넣어 40자리의 hash값을 만들어내고, 이를 object 파일 이름으로 사용합니다.

  • Blob(Binary Large OBject)
    • Type: blob type
    • Size: 컨텐츠의 용량을 bytes로 표시한다.
    • Contents: 텍스트, 이미지, 음악, 혹은 단순 이진 파일처럼 다양한 형식의 파일이 저장될 수 있으며, 파일 이름이나 형식은 저장되지 않는다. 파일의 메타 정보를 제외한 파일의 내용 전체만을 저장한다.
  • Tree
    • Type: tree type
    • Size: Tree Object의 용량을 bytes로 표시
    • Tree Object: 하위 디렉토리의 Tree Object를 재귀적으로 참조할 수 있다.
    • Blob Object: 한 디렉토리에 있는 모든 blob을 담고 있다. 객체에 대한 접근 권한, 파일 이름을 관리한다.
  • Commit
    • 작성자, Commit 실행자, Commit 날짜, 로그 메시지 등
    • Tree Object: 해당 commit에서의 디렉토리와 파일의 상태를 알 수 있다.
  • Tag
    • Object 종류, Tag 이름, Tagger, Tag 메시지, PGP 서명 정보 등

참고