본문 바로가기

프로그래밍 독학/Git

Pro git 독학일지 1장 - 버전관리란?

반응형

Pro git 독학일지 1장 - 버전관리란?

 

깃을 처음 시작하는 것은 아니지만, 깃이 뭐냐고 물어보면 정확히 말할 수 없는 내가

깃을 정확하게 설명할 수 있는 사람으로 거듭나기 위해 1장을 정리한다.

 

이 장을 다 읽고 나면 아래와 같은 질문들에 대한 답을 명확하게 말할 수 있을 것이다.

 

1. Git은 어떻게 탄생했나요?

2. Git은 왜 쓰는거에요?

3. Git은 어떻게 쓰는거에요?

 

버전 관리란?

 

버전 관리는 무엇이고 우리는 왜 이것을 알아야 할까??

 

버전관리 시스템은

1. 파일 변화를 시간에 따라 기록했다가

2. 나중에 특정 시점의 버전을 다시 꺼내올 수 있는 시스템이다.

 

버전 관리 시스템의 종류

 

많은 사람은 버전을 관리하기 위해 디렉토리로 파일을 복사하는 방법을 쓴다.

간단하지만 잘못되기 쉽다.

작업하던 디렉토리를 지워버리거나 실수로 파일을 잘못 고칠 수도 있고, 잘못 복사할 수도 있다.

 

이런 이유로 프로그래머들은 오래 전에 로컬 VCS(Version Control System)라는 걸 만들었다.

이 VCS는 아주 간단한 데이터베이스를 사용해서 파일의 변경 정보를 관리했다.

한 시점으로 파일의 스냅샷을 찍어 버전을 저장하고 모든 파일을 특정 시점으로 되돌릴 수 있다.

 

그러다 여러 개발자가 함께 작업하기 위해 중앙집중식 VCS 가 개발됐다.

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

하지만 서버에 문제가 생기면 협업 불가, 백업 불가 상황이 된다. 

중앙 데이터베이스가 있는 하드디스크에 문제가 생기면 프로젝트의 모든 히스토리를 잃는다. 

 

Git은 분산 버전 관리 시스템이다. Git에서 클라이언트는 단순히 파일의 마지막 스냅샷을 사용하지 않는다.

그냥 저장소를 전부 복제한다. 서버에 문제가 생기면 이 복제물로 다시 작업을 시작할 수 있다.

클라이언트 중에서 아무거나 골라도 서버를 복원할 수 있다. 모든 checkout은 모든 데이터를 가진 진정한 백업이다.

 

DVCS 환경에는 리모트 저장소가 존재한다. 사람들은 동시에 다양한 그룹과 협업할 수 있다. 

계층 모델 같은 중앙집중식 시스템으로는 할 수 없는 워크 플로를 다양하게 사용할 수 있다.

 

Git의 핵심은 뭘까?

 

이 질문은 깃을 이해하는데 굉장히 중요하다.

1. Git이 무엇이고

2. 어떻게 동작하는지 이해한다면

-> 쉽게 Git을 효과적으로 사용할 수 있다.

 

차이가 아니라 스냅샷

다른 VCS들과 Git의 가장 큰 차이점은 데이터를 다루는 방법에 있다.

 

큰 틀에서 봤을 때 VCS 시스템 대부분은 관리하는 정보가 파일들의 목록이다.

각 파일의 변화를 시간순으로 관리하면서 파일들의 집합을 관리한다.

 

Git은 이런 식으로 데이터를 저장하지도, 취급하지도 않는다.

대신 Git은 데이터를 파일 시스템 스냅샷으로 취급하고 크기가 아주 작다.

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

파일이 달라지지 않았으면 Git은 성능을 위해서 파일을 새로 저장하지 않는다. 

단지 이전 상태의 파일에 대한 링크만 저장한다. Git은 데이터를 스냅샷의 스트림처럼 취급한다.

 

 

이것이 Git이 다른 VCS와 구분되는 점이다. 

 

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

 

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

대부분의 명령어가 네트워크의 속도에 영향을 받는 CVCS와 비교하면 Git은 Git느님이다. 

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

 

예를 들어 Git은 프로젝트의 히스토리를 조회할 때 서버 없이 조회한다.

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

그래서 눈 깜짝할 사이에 히스토리를 조회할 수 있다.

어떤 파일의 현재 버전과 한 달 전의 상태를 비교해보고 싶을 때도 깃은 그냥 한 달 전의 파일과 지금의 파일을 로컬에서 찾는다.

파일을 비교하기 위해 리모트에 있는 서버에 접근하고 나서 예전 버전을 가져올 필요가 없다.

 

즉 오프라인 상태에서도 막힘없이 일할 수 있다.

비행기나 기차 등에서 작업하고 와이파이가 연결되지 않아도 커밋할 수 있다.

 

Git의 무결성

 

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

그래서 체크섬을 이해하는 Git 없이는 어떠한 파일이나 디렉토리도 변경할 수 없다.

 

체크섬은 Git에서 사용하는 가장 기본적인(Atomic) 데이터 단위이자 Git의 기본 철학이다. 

Git 없이는 체크섬을 다룰 수 없어서 파일의 상태도 알 수 없고 심지어 데이터를 잃어버릴 수도 없다.

 

Git은 SHA-1 해시를 사용하여 체크섬을 만든다. 만든 체크섬은 40자 길이의 16진수 문자열이다.

파일의 내용이나 디렉토리 구조를 이용하여 체크섬을 구한다. 아래와 같이 생겼다.

 

24b9da6552252987aa493b52f8696cd6d3b00373

 

Git은 모든 것을 해시로 식별하기 때문에 이런 값은 여기저기서 보인다.

실제로도 Git은 파일을 이름으로 저장하지 않고 해당 파일의 해시로 저장한다.

 

Git은 데이터를 추가할 뿐

 

Git으로 무얼 하든 Git 데이터베이스에 데이터가 추가된다. 되돌리거나 데이터를 삭제할 방법이 없다.

물론 다른 VCS처럼 Git도 커밋하지 않으면 변경사항을 잃어버릴 수 있다.

하지만, 일단 스냅샷을 커밋하고 나면 데이터를 잃어버리기 어렵다.

 

Git을 사용하면 프로젝트가 심각하게 망가질 걱정 없이 매우 즐겁게 여러 가지 실헝을 해볼 수 있다.

되돌리기을 보면 Git에서 데이터를 어떻게 저장하고 손실을 어떻게 복구하는지 알 수 있다.

 

세가지 상태

 

이 부분은 중요하기에 집중해서 읽어야 한다. Git을 공부하기 위해 반드시 짚고 넘어가야 할 부분이다.

Git은 파일을 Commited, Modified, Staged 이렇게 세 가지 상태로 관리한다.

 

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

Modified는 수정한 파일을 아직 로컬 데이터베이스에 커밋하지 않은 것을 말한다.

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

 

이 세 가지 상태는 Git 프로젝트의 세 가지 단계와 연결돼있다.

Git 디렉토리, 워킹 트리, Staging Area

이렇게 세 가지 단계를 이해하고 넘어가자.

 

Git 디렉토리는 Git이 프로젝트의 메타데이터와 객체 데이터베이스를 저장하는 곳을 말한다.

* 메타데이터(metadata)는 데이터(data)에 대한 데이터이다.

이렇게 흔히들 간단히 정의하지만 엄격하게는, Karen Coyle에 의하면

"어떤 목적을 가지고 만들어진 데이터 (Constructed data with a purpose)"라고도 정의한다.

* 데이터베이스(영어: database, DB)는 여러 사람이 공유하여 사용할 목적으로 체계화해 통합, 관리하는 데이터의 집합이다.

작성된 목록으로써 여러 응용 시스템들의 통합된 정보들을 저장하여 운영할 수 있는 공용 데이터들의 묶음이다.

 

이 Git 디렉토리가 Git의 핵심이다.

다른 컴퓨터에 있는 저장소를 Clone할 때 Git 디렉토리가 만들어진다. 

 

워킹트리는 프로젝트의 특정버전을 Checkout한 것이다.

Git 디렉토리는 지금 작업하는 디스크에 있고 그 디렉토리 안에 압축된 데이터베이스에서 파일을 가져와서 워킹 트리를 만든다.

 

Staging Area는 Git 디렉토리에 있다. 단순한 파일이고 곧 커밋할 파일에 대한 정보를 저장한다. 

종종 Index라고 불리기도 하지만 Staging Area라는 명칭이 표준이 되어가고 있다.

 

Git으로 하는 일은 기본적으로 아래와 같다.

1. 워킹 트리에서 파일을 수정한다.

2. Staging Area에 파일을 Stage해서 커밋할 스냅샷을 만든다,

3. Staging Area에 있는 파일들을 커밋해서 Git 디렉토리에 영구적인 스냅샷으로 저장한다.

 

Git 디렉토리에 있는 파일들은 Committed 상태이다.

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

그리고 Checkout하고 나서 수정했지만, 아직 Staging Area에 추가하지 않았으면 Modified이다.

Git의 기초에서 이 상태에 대해 좀 더 자세히 배운다.

 

CLI

Git은 CLI로도 GUI로도 사용할 수 있다. Git의 모든 기능을 지원하는 것은 CLI 뿐이다. 

 

요약

우리는 Git이 무엇이고 지금까지 사용해온 다른 CVCS와 어떻게 다른지 배웠다. 

다음 장에서는 Git의 사용법을 배운다.

 

 

질문

 

1. Git은 어떻게 탄생했나요?

2. Git은 왜 쓰는거에요?

3. Git은 어떻게 쓰는거에요?

반응형