티스토리 뷰

Git

[Git] Git에 대한 모든 것

잰잰테크 2023. 9. 18. 03:08

Git의 역사

 Git은 리눅스 개발자인 리누스 토르발즈가 2005년에 개발한 시스템이다. 리눅스는 원래 BitKeeper라는 버전 관리 시스템에 의해서 운영되었다. 원래 유로 프로그램이지만, 제작사가 리눅스 커뮤니티에게 무료로 사용할 수 있게 해주었다. 그러나 리눅스 커뮤니티의 한 개발자가 BitKeeper의 이용 약관을 위배하는 일이 생기면서 프로그램을 유료로 이용해야 되는 상황에 봉착하였다. 이에 리누스 토르발즈는 BitKeeper를 유료로 이용하기 보다는 자신이 직접 버전 관리 시스템을 만드는게 낫다고 생각하여서 내놓은 툴이 Git이다.

 

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

 버전 관리 시스템은 파일 변화를 시간에 따라 기록했다가 나중에 특정 시점의 버전을 다시 꺼내올 수 있는 시스템이다. 이를 이용하면 파일들의 삭제와 생성, 수정 등을 추적할 수 있기 때문에 여러 방면에서 파일들을 효과적으로 관리할 수 있다.

버전 관리 시스템은 크게 세 가지 종류로 나누어 볼 수 있다.

 

 버전 관리 시스템은 크게 세 가지 종류로 나누어 볼 수 있다.

 

1) 로컬 버전 관리 시스템

 로컬 버전 관리 시스템은 간단한 데이터베이스를 이용해서 파일의 변경 이력을 관리하는 시스템이다. 대표적으로 RCS(Revision Control System)가 있는데 이 시스템은 기본적으로 파일에서 변경되는 부분인 Patch를 기억함으로써 관리한다. 이를 이용해서 모든 파일을 특정 시점으로 되돌리는 것이 가능하다.

 

2) 중앙 집중식 버전 관리 시스템

 로컬 버전 관리 시스템은 로컬에서만 작동하기 때문에 다른 개발자와 함께 작업을 해야 하는 상황에서는 사용하기가 쉽지 않다. 이 문제를 해결하기 위해서 중앙 집중식 버전 관리 시스템이 등장하였다.

 

 위 그림에서도 볼 수 있듯이 모든 데이터베이스가 중앙 서버에 의해서 관리가 되고, 클라이언트가 중앙 서버에서 파일을 받아서 사용하는 방식이다. 대표적으로 SVN(SubVersion), CVS(Concurrent Versions System)이 있다.

 

 중앙 집중식 버전 관리 시스템은 각각의 클라이언트가 로컬 데이터베이스를 관리하는 것이 아니라 중앙 서버에서 통합된 데이터 베이스를 이용할 수 있다는 장점이 있어서 오래동안 사용되었다. 하지만, 이 시스템에는 치명적인 단점들이 존재한다. 먼저, 모든 버전 관리와 관련된 동작이 서버에서 처리되기 때문에 서버의 부하가 크다. 뿐만 아니라 모든 동작에서 서버를 적어도 한 번 거쳐야 하기 때문에 처리 속도가 느리다. 또한, 최악의 상황에서 중앙 데이터베이스에 문제가 생기면 프로젝트에 대한 모든 기록을 잃게 된다.

 

3) 분산식 버전 관리 시스템

 중앙 집중식 버전 관리 시스템에서 하나의 데이터베이스가 망가지면 모든 시스템에 영향을 주는 문제점을 해결하기 위해서 분산식 버전 관리 시스템이 등장하였다. 대표적으로 Git, Mecurial, Bazaar 등이 있다.

 

 이 시스템은 클라이언트가 마지막 파일에 대한 스냅샷만 저장하는 것이 아니라 서버의 데이터베이스에 대한 백업본을 가져오는 방식이다. 그렇기 때문에 이 시스템에서는 서버에 문제가 생기더라도 백업본을 이용해서 다시 작업을 진행할 수 있다. 대부분의 버전 관리가 로컬에서 이루어지기 때문에 속도도 빠르다는 장점이 있다. 다만, 앞선 방식들에 비해서 시스템이 복잡하고 동기화 문제가 존재한다.

 

Git의 특징

1) 스냅샷

 Git은 코드 히스토리를 델타 방식이 아닌 스냅샷 방식으로 관리한다는 특징이 있다.

 

 델타 방식은 처음에 파일을 저장하고 이후에는 파일에 변화가 생겼을 때 변경된 사항만 기록을 하는 방식이다. 반면, 스냅샷 방식은 변경이 생겼을 때 각 파일의 최종 상태를 저장하는 방식이다.

 

 얼핏 생각하면 변경점만 저장하는 것이 더 효율적이지 않나라고 생각할 수도 있다. 그러나 생각해보면 변경점만 관리하는 경우에는 특정 시점의 파일을 복원하기 위해서는 그 이전 버전들의 변경 사항을 모두 반영해야 되기 때문에 비효율적이다. 따라서 스냅샷 방식은 변경점에 대한 누적이 불필요하기 때문에 속도적인 측면에서 이점이 있다. 그렇다면 매번 최종 상태를 저장하게 되면 용량이 너무 많이 필요하지 않을까라는 의문도 들 수 있다. Git에서는 이 문제를 해결하기 위해서 불필요한 파일들은 수시로 제거를 해주는 최적화 과정을 거친다. 마지막으로 스냅샷 방식은 버전 간의 독립성을 보장하기 때문에 안정성 측면에서도 이점을 가진다.

 

2) 분산 관리

 위의 분산 관리 시스템에 대한 이야기에서도 언급했듯이 Git은 분산식 버전 관리 시스템 방식을 이용하고 있다. 따라서 오프라인 상태에서도 로컬에서 작업을 할 수 있고, 빠른 버전 관리가 가능하다는 장점이 있다. 또한, 중앙에서 데이터베이스를 관리하는 방식이 아니기 때문에 실수로 인한 데이터 유실 가능성도 줄어든다.

 

3) 데이터 보존성

 Git은 데이터 보존성 측면에서 큰 장점을 가진다. Git에서는 .git 폴더가 소실되지 않는 이상 모든 기록이 저장되기 때문이다. 따라서 적절한 작업을 거친다면 대부분의 상황에 대해서는 복구가 가능하기 때문에 파일들을 관리하기에 적합한 시스템이다.

 

Git의 3가지 공간

 Git은 크게 working directory, staging area, repository라는 3가지 공간으로 나눌 수 있다.

 

1) Working directory

 Working directory는 현재 작업하고 있는 공간으로 실제로 파일을 생성하고 수정하는 공간이다. 즉, 작업을 하고 add를 하지 않은 상태의 파일들이 working directory에 존재한다고 생각할 수 있다. 이때 working directory에 있는 파일은 untracked와 tracked라는 두 가지 상태로 나눌 수 있다. 먼저, untracked는 아직 add된 적이 없는 파일이나 ignore된 상태의 파일이다. tracked는 git의 관리 대상에 등록된 파일으로 add된 적이 있고 변경 내역이 있는 파일이다.

 

2) Staging area

 Staging area는 commit을 통해서 repository로 파일을 이동시키기 이전에 임시로 변경 사항들을 저장하는 공간이다. 이때 working directory에서 바로 repository로 옮기는 것이 아니라 staging area를 두는 이유는 작업한 파일 전체가 아니라 일부만 스냅샷으로 저장하고 싶은 상황이 있기 때문이다. 즉, 선별적으로 원하는 부분만 반영시키기 위해서 staging area가 존재한다.

 

3) Repository

 Repository는 최종적으로 commit된 파일들이 저장되는 공간으로 .git 디렉토리에 해당한다. 여기에는 commit된 파일들에 대한 모든 기록이 저장되어 있다.

 


참고자료

https://heekangpark.github.io/git/vcs

https://git-scm.com/book/ko/v2/시작하기-버전-관리란%3F

https://velog.io/@dnrwhddk1/Git-Git-심화-개념SnapShot-분산-버전-관리-Git의-3가지-공간

https://charles098.tistory.com/15

https://heinafantasy.com/253