ABOUT GITHUB

VCS, Git의 기본작동원리

성지우 2024. 2. 22. 17:54

버전관리시스템 (VCS; Version Control System)

파일 변화를 시간에 따라 기록했다가 나중에 특정 시점의 버전을 다시 꺼내올 수 있는 시스템

VCS를 사용하면 각 파일을 이전 상태로 되돌릴 수 있고 시간에 따라 수정내용을 비교해 볼 수 있고,

파일을 잘 못 고쳤을 때 도 쉽게 복구할 수 있다

 

로컬 버전 관리

 

버전관리 프로그램의 1세대

파일들을 로컬 저장소에서 변경이력을 관리

협업이 매우 힘듬

 

중앙집중식 버전 관리 (CVCS)

 

파일을 관리하는 서버가 별도로 있고 클라이언트가 중앙서버에서 파일을 받아(check out) 사용가능

관리자가 프로젝트에 참여한 사람 중 누가 무엇을 하는지 관리하기 쉬움

중앙서버에 문제 발생하여 다운될 경우 협업 및 백업 불가능

하드디스크에 문제 생기면 모든 히스토리를 잃을 수 있음

대표적으로 subversion이 있음

 

분산 버전 관리 시스템 (DVCS)

 

파일을 저장하는 서버가 있는 것은 동일하지만

수정을 위해 프로젝트 전체를 로컬에 다운 받은 뒤 수정

저장소를 히스토리와 더불어 전부 복제해 작업

중앙서버가 다운되더라고 작업 가능, 서버가 날아가도 다운 받은 내용은 남아있어 가장 안정적

수정시에도 나 혼자 수정하고 있기 때문에 충돌염려없이 수정할 수 있으며 최종적으로 서버에

올릴 때만 신경써서 머지해주면 

대부분은 DVCS환경에서는 리모트 저장소가 존재, 많을수도 있음

동시에 다양한 그룹과 다양한 방법으로 협업 가능

대표적으로 git

 

Git 특징

1. 차이가 아니라 스냅샷

Git의 핵심은 정보를 취급하는 방식이 다르다는 점

subversion과 Git의 가장 큰 차이점은 데이터를 다루는 방법

 

각 파일에 대한 변화를 저장하는 시스템들

VCS 대부분은 관리하는 정보가 파일들의 목록

위와 같이 각 파일의 변화를 시간순으로 관리하면서 파일들의 집합을 관리함 (델타 방식)

* 델타 방식 : 파일에 어떤 변화가 생겼을 때 "변화된 사항"만 기록하는 방식 -> 차이점만 기록

 

Git은 데이터를 파일 시스템 스냅샷의 연속으로 취급하고 크기가 아주 작음

커밋하거나 프로젝트의 상태를 저장할 때마다 파일이 존재하는 그 순간을 중요하게 여김

파일이 달라지지 않았으면 git은 성능을 위해서 파일을 새로 저장하지 않음

시간순으로 프로젝트의 스냅샷을 저장

Git은 데이터를 스냅샷의 스트림처럼 취급

* 스냅샷 방식 : 파일에 변동이 생겼을 때 파일 상태 "전체"를 그대로 저장해 비교 -> 통째로 기록

> 버전별로 차이점을 보고 싶을 때 좋음, 버전관리에 좀 더 용이한 방식

 

2. 거의 모든 명령을 로컬에서 실행

거의 모든 명령이 로컬 파일과 데이터만 사용하기 떄문에 네트워크에 있는 다른 컴퓨터가 필요없음

프로젝트의 모든 히스토리가 로컬 디스크에 있기 때문에 모든 명령이 순식간에 실행됨

프로젝트 히스토리 조회 시 서버없이 조회함

그냥 로컬 데이터베이스에서 히스토리를 읽어보여줌

즉, 오프라인 상태여도 막힘없이 일할 수 있음

네트워크에 접속하고 있지 않아도 커밋할 수 있다

 

3. Git의 무결성

데이터를 저장하기 전에 항상 체크섬을 구하고 그 체크섬으로 데이터를 관리

체크섬 : Git에서 사용하는 가장 기본적인 데이터 단위 , 40자 길이의 16진수 문자열

파일의 내용이나 디렉토리 구조를 이용하여 체크섬을 구함

 

4. Git은 데이터를 추가할뿐

Git으로 무얼 하든 Git데이터베이스에 데이터가 추가된다

되돌리거나 데이터를 삭제할 방법이 없다

 

파일의 3가지 상태

1. Committed : 데이터가 로컬 데이터베이스에 안전하게 저장됐다는 것을 의미

2. Modified : 수정한 파일을 아직 로컬 데이터베이스에 커밋하지 않은 것을 의미

3. Staged : 현재 수정한 파일을 곧 커밋할 것이라고 표시한 상태를 의미

 

 -> 이 3가지 상태는 Git프로젝트의 3가지 단계와 연결되어있다. Git 디렉토리, 워킹트리,Stagin Area

 

 

Git directory 

Git이 프로젝트의 메타데이터와 객체 데이터베이스를 저장하는 곳

Git의 핵심, 다른 컴퓨테어 있는 저장소를 clone할때 Git 디렉토리가 만들어짐

여기 있는 파일들은 committed상태

파일을 수정하고 Staging Area에 추가했다면 Staged

check out하고나서 수정했지만 아직 Staging Area에 추가하지 않았으면 Modified

Working tree

프로젝트의 특정 버전을 checkout한 것

Git 디렉토리는 지금 작업하는 디스크에 있고

그 디렉토리 안에 압축된 데이터 베이스에서 파일을 가져와서 워킹트리를 만듬

 

Staging area

Git디렉토리 안에 있음

단순한 파일이고 곧 커밋할 파일에 대한 정보를 저장

 

Git으로 하는 일

  1. 워킹트리에서 파일을 수정한다
  2. Staging Area에 파일을 Stage해서 커밋할 스냅샷을 만든다,
    모든 파일을 추가할 수도, 선택하여 추가할 수도 있다
  3. Staging Area에 있는 파일들을 커밋해서 Git디렉토리에 영구적인 스냅샷을 저장한다

 


참고 및 출처 : https://git-scm.com/book/ko/v2/%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-%EB%B2%84%EC%A0%84-%EA%B4%80%EB%A6%AC%EB%9E%80%3F , https://namu.wiki/w/%EB%B2%84%EC%A0%84%20%EA%B4%80%EB%A6%AC%20%EC%8B%9C%EC%8A%A4%ED%85%9C , https://nozeroslope.tistory.com/186