[Git] Git이란? - #2 Git의 주요 특징

    이전글

    2023.06.26 - [본업/etc.] - [Git] Git이란? - #1


    일단 git book의 문서를 보고 작성한 내용인데 사실상 번역하고 요약한 정도이니 빠르게 읽고 넘어가도 된다.

    '차이'가 아닌 '스냅샷'

    기존의 VCS들은 위 그림과 같이 시간순으로 연대기적으로 파일들의 집합을 관리하며 이를 일반적으로 '델타 기반 버전 관리 시스템(Delta-based VCS)'이라고 한다.

    hot)으로 취급한

    즉, 현재의 프로젝트 상태를 커밋하거나 저장할 때마다 Git은 그 순간에 모든 파일 시스템이 어떻게 생겼는지를 사진으로 찍어 해당 스냅샷의 참조로 저장한다.

    대부분의 작업을 로컬 영역에서 진행 가능

    Git은 DVCS이기 때문에 개발자 본인의 로컬 디스크에 프로젝트의 모든 이력이 존재한다.

    따라서 중앙 서버에 프로젝트를 저장하는 CVCS에 비하면 네트워크 의존도, 명령 처리 속도면에서 굉장항 이점을 가지고 있다.

    VPN등의 네트워크 자체를 사용하지 않고도 로컬에 저장된 파일과 데이터만 가지고 작업을 진행하고 커밋 등의 거의 모든 명령어를 실행할 수 있다.

    무결성 보장

    Git은 데이터를 저장하기 전에 항상 체크썸(check sum; 중복 체크)을 구하고, 그 체크썸으로 데이터를 관리한다.

    즉, Git이 인지하지 못하는 사이에 파일이나 디렉토리의 내용을 변경할 수가 없다.

    체크썸은 Git의 가장 낮은 레벨(lowest-level), 즉 근본적인 수준의 Git에 내장되어 있고 이는 Git의 기본 철학이다.

    Git 없이는 체크썸을 다룰 수 없기 때문에 파일의 상태도 알 수 없으며 전송 중에 데이터가 손상되거나 유실될 수도 없다.

    참고로 Git은 체크썸을 생성할 때 SHA-1 Hash를 사용한다.

    데이터를 추가만 할 뿐, 삭제는 없다

    Git으로 어떤 작업을 하던지 간에 모든 작업은 Git 데이터베이스에 데이터를 추가한다.

    (즉, 되돌리거나 삭제하지 않으며 그렇게 하기도 매우 힘들다)

    여타 VCS와 마찬가지로 Git도 변경 사항을 커밋하지 않으면 유실될 수 있으나, 일단 스냅샷을 한 번 커밋하고 데이터베이스에 저장되고 나면 그 데이터가 유실되기 어렵다.

    세 가지 상태

    공식 문서에서도 이 부분이 굉장히 중요하다고 언급한다.

    Git에는 파일이 취할 수 있는 세 가지 주요 상태가 존재한다.

    • Modified: 수정된 파일이 존재하는데 아직 로컬 데이터베이스에 커밋되지 않음.
    • Satged: 수정된 파일이 존재하는데 곧 커밋할 예정임.
    • Committed: 데이터가 로컬 데이터베이스에 안전하게 저장됨.
    공식 문서에서는 이 '세 가지 상태' 단락에서 곧바로 세 가지 섹션인 Working Directory, Staging Area, Git Repository에 대해 다루지만, 나는 바로 다음에서 별도의 단락으로 따로 다룰 예정이다.

    세 가지 영역

    위 그림에서 설명하고자 하는 Git에서 중요하게 여기는 세 가지 영역(section)이 존재한다.

    Working Directory

    프로젝트의 특정된 하나의 버전을 체크아웃(checkout)한 것으로 작업 영역이라고도 부른다.

    Git이 관리중인 프로젝트의 변경 사항을 감지할 수 있는 영역으로, 일반적으로 소스 코드를 작성하고 수정, 저장하는 프로젝트 폴더 혹은 디렉토리에 위치한다.

    즉, Git의 감시하에 놓여있는 OS상 파일 시스템의 영역이라고 이해하면 편하다.

    HEAD가 가리키고 있는 오브젝트 트리의 상태에 의해 생성된다.

    Staging Area

    워킹 디렉토리에서 작업한 변경 사항들 중에서 Git 디렉토리에 커밋하고자 하는 변경 사항들이 거쳐가는 중간 단게로, 곧 커밋할 파일에 대한 변경 사항을 저장한다.

    개념상으로는 워킹 디렉토리와 Git 디렉토리 사이 중간에 존재하며 물리적으로는 Git 디렉토리(.git) 내부에 저장되어 있다.

    처음 Git을 접하고 배울때는 스테이징 영역이라는 용어로 접하게 되지만, 실질적으로 git을 명령어로 처리하게 되는 실무의 영역에서는 인덱스(index)라는 전문 기술 용어를 사용하게 된다.

    Git Directory(Repository)

    먼저 레포지토리(repository)는 단어 그대로 '저장소'를 뜻하며 OS의 파일 시스템 개념상 폴더(folder) 혹은 디렉토리(directory)에 해당하는 개념이다.

    즉, Git Repository라고 하면 Git이라는 VCS로 관리하는 프로젝트가 저장된 OS 파일 시스템 상의 디렉토리를 의미한다.

    OS의 파일시스템 상에서는 .git와 같은 이름으로 존재하며, 이 디렉토리 안에는 Git 프로젝트의 메타 데이터와 압축된 객체 데이터베이스가 저장된다.

     

    Git 레포지토리는 다음과 같은 경우에 생성된다.

    • 사용자가 해당 디렉토리를 앞으로 Git으로 관리하겠다는 명령어를 입력할 때 → git init
    • 원격 저장소의 프로젝트를 clone할 때 → git clone https://xxxxx...

     

    Git 레포지토리에는 두 가지 종류가 있다.

    Local Repository (로컬 저장소)

    • 가장 기본적인 개념의 Git 저장소
    • 자신의 로컬 디바이스의 HDD 또는 SSD 따위의 저장 장치에 저장되는 저장소
    • 해당 저장소에서 관리되는 내용은 네트워크에 접속하지 않는 한 외부에서 접근할 수 없음

    Remote Repository (원격 저장소)

    • 로컬 저장소의 한계점을 극복한 Git 저장소
    • 자신의 로컬 디바이스가 아닌네트워크 상의 다른 디바이스(일반적으로 서버 컴퓨터)에 저장되는 저장소
    • 네트워크에 연결되어 있는 다른 클라이언트 컴퓨터가 접근할 수 있어 협업 환경에서 많이 사용

     

    Git에서 정의하는 파일의 상태

    Git에서는 워킹 디렉토리의 현재 상태를 확인하고자 git status 명령어를 사용한다. 이를 통해 파일의 상태 또한 파악 가능하다.

    워킹 디렉토리 내에서 존재하는 모든 파일은 Git에서 크게 두 가지 상태로분류된다.

    • Tracked (= 관리대상 혹은 추적)
      • 이미 Git의 관리 영역에 속한 파일로서, Git이 해당 파일의 존재를 인지하고 있음
      • 적어도 한 번은 커밋에 포함되어 스냅샷에 기록된 상태
    • Untracked (= 미관리대상 혹은 미추적)
      • 아직 Git의 관리 영역에 속하지 않은 파일로서, Git은 해당 파일에 대한 정보를 모르는 상태

    더 세부적으로 보았을 때, Tracked 상태의 파일은 다음과 같이 하위 상태를 가질 수 있다.

    • Unmodified (수정되지 않음): Git의 관리 하에 있지만 가장 최근 커밋 이후로 변경된 사항이 없는 파일
    • Modified (수정됨): 가장 최근 커밋 이후에 변경된 사항이 있는 파일
    • Staged (스테이지됨): 변경된 사항이 있는 파일 중, 다음 커밋에 포함될 예정인 파일
      → '인덱스에 스테이지된 상태'라고도 표현함

    댓글

    Designed by JB FACTORY