Git 이 뭐야?
컴퓨터 파일의 변경사항을 추적하고 여러 명의 사용자들 간에 해당 파일들의 작업을 조율하기 위한 분산 버전 관리 시스템(DVCS)이다.
즉, 스코드를 효과적으로 관리하기 위해 개발된 '분산형 버전 관리 시스템'.
# 분산 버전 관리 시스템(DVCS) ??
각 개발자가 중앙 서버에 접속하지 않은 상태에서도 코드 작업을 할 수 있는 특징이 있는 "소프트웨어 버전 관리 시스템(VCS)"방법 중 하나.
- DVCS 종류
1) 로컬 버전 관리 (=Local VCS) : 간단한 데이터베이스를 사용해서 "파일의 변경 정보"를 관리
▶ 대표 Ex) VCS 도구 중에 RCS(Revision Control System)는 Patch Set(파일에서 변경되는 부분)을 특별한 형식의 파일로 저장 & 일련의 Patch Set을 적용해서 모든 파일을 특정 시점으로 되돌릴 수 있다.
2) 중앙집중식 버전 관리(CVCS) : 파일을 관리하는 중앙 서버가 있고, 각각의 클라이언트들은 이 중앙 서버에서 파일을 받아서 사용(Checkout)하고 저장한다.
▶ 다른 개발자와 함께 작업해야 하는 경우 생기는 문제를 해결하기 위해 개발됐다.
▶ 장점 : 로컬 버전 관리 관리는 쉽다. / 단점 : 중앙 서버 문제 시 협업/백업/히스토리 등도 문제가 생긴다.
▶ 대표 Ex) CVS, Subversion, Perforce 시스템
3) 분산 버전 관리 시스템 (DVCS) : CVCS처럼 각각의 클라이언트들이 원격 저장소에서 파일의 최신 형상(스냅샷)을 받아서 사용(Checkout)하는 것이 아니라
원격 저장소를 히스토리와 더불어 전부 복제(Clone)해와서 내 로컬 저장소에서 수정 후 원격 저장소에 반영하거나 내 로컬이 원격 저장소가 될 수도 있다.
▶ 장점1 : 서버에 문제가 생기면 이 복제물로 다시 작업을 시작할 수 있다. 클라이언트 중에서 아무거나 골라도 서버를 복원할 수 있다. Clone은 모든 데이터를 가진 진정한 백업이다.
▶ 장점2 : 원격 저장소가 많을 수도 있다. 그래서 사람들은 동시에 다양한 그룹과 다양한 방법으로 협업할 수 있다. 계층 모델 같은 중앙집중식 시스템으로는 할 수 없는 워크플로를 다양하게 사용할 수 있다.
▶ 대표 Ex) Git, Mecurial, Bazaar, Darcs
# 소프트웨어 '버전 관리 시스템(VCS)' ??
'버전관리(VC)'는 보통 여러 학문 분야에서 '동일한 정보에 대한 여러 버전을 관리하는 것'을 말하는데
소프트웨어 공학에서 '버전관리' 즉, 소프트웨어 버전관리 시스템(Software VCS)는
"주로 팀 단위로 개발 중인 소스 코드들을 관리하는데 사용되는 것"을 말한다.
- 버전 관리 소프트웨어 도구들은 거의 모든 소프트웨어 개발 프로젝트에서 필수적인 요소이다.
- 버전 관리(= VC = version control = revision control = 소스 관리(source control) = 소스 코드 관리(source code management = SCM)
Git 이 왜 특별해?
더 좋으니까 더 빠르고 복잡한 소스코드일수록 더 관리하기 쉽고 ..
Git은 미친 듯이 빨라서 대형 프로젝트에 사용하기도 좋고 동시다발적인 브랜치에도 끄떡없는 슈퍼 울트라 브랜칭 시스템이다.
개발자들은 소스 코드가 변경된 이력을 쉽게 확인할 수 있고, 특정 시점에 저장된 버전과 비교하거나 특정 시점으로 되돌아갈 수도 있다.
대략 이런 장점들을 갖고 있다.
- 빠른 속도 (저장용량도 적고 아래 특징으로 명령도 빠르게 실행가능)
- 거의 모든 명령을 로컬에서 실행가능
-> Git은 프로젝트와 히스토리까지 로컬 디스크에 있기 때문에 모든 명령이 순식간에 실행된다.
즉, 서버없이도 히스토리 조회 & 오프라인 상태나 VPN에 연결하지 못할 때도 커밋 등을 막힘 없이 할 수 있다.
cf) 다른 VCS 시스템에서는 서버에 연결할 수 없을 때 할 수 있는 일이 별로 없다.
매우 사소해 보이지만 실제로 이 상황에 부닥쳐보면 느껴지는 차이가 매우 크다. (<< 맞아요..실제로 회사 svn서버가 자주 다운되었는데 진짜 일을 쌓여있고 고칠 때까지 할 수 있는 게 없어 퇴근이 늦어지는ㅠㅠㅠㅠㅠ) - 단순한 구조
- 비선형적인 개발(수천 개의 동시 다발적인 브랜치)
- 완벽한 분산
- Linux 커널 같은 대형 프로젝트에도 유용할 것(속도나 데이터 크기 면에서)
+) Git의 무결성
- Git은 데이터를 저장하기 전에 항상 체크섬(Checksum)을 구하고 그 체크섬으로 데이터를 관리한다.
그래서 체크섬을 이해하는 Git 없이는 어떠한 파일이나 디렉토리도 변경할 수 없다. << 무결성
- '체크섬(Checksum)'은 Git에서 사용하는 가장 기본적인(Atomic) 데이터 단위이자 Git의 기본 철학.
- SHA-1 해시를 사용하여 체크섬을 만들고 이는 40자 길이의 16진수 문자열이다.
파일의 내용이나 디렉토리 구조를 이용하여 체크섬을 구한다. SHA-1은 아래처럼 생겼다고 한다.
3b2b49da6e5225a2987a4952fc8696d6d3b00865
- Git은 모든 것을 해시로 식별하기 때문에 이런 값은 여기저기서 보인다. -> 파일을 이름이 아닌 해당 파일의 "해시"로 저장
VCS vs Git (= Diff between VCS and Git ??)
Git은 Subversion(svn)이나 Perforce 같은 다른 VCS과 미묘하게 달라서 다른 VCS에서 쓰던 개념으로는 헷갈린다.
(svn 고인물이였던 내 경험상 진짜 헷갈린다...)
정확히는 사용자 인터페이스는 매우 비슷한데 "정보를 취급하는 방식"이 다르다.
VCS 시스템은 (큰 틀에서 봤을 때) 대부분은 관리하는 정보가 "파일들의 목록"
-> 각 파일의 변화를 시간순으로 관리하면서 파일들의 집합을 관리한다(보통 델타 기반 버전관리 시스템이라 함).
v1 | v2 | v3 | v4 | ◀▼ 표 Ex) 현재 버전 v1에 파일 a,b,c,d가 있고, 이 파일들이 한 시간마다 아래와 같이 변해 새로운 버전이 만들어진다고 가정하자. - file a : v1시점부터 짝수 시간지날 때 수정됨 - file b : v1시점부터 홀수 시간지날 때 수정됨 - file c : v1시점부터 1,2시간 지날 때만 수정 후 유지됨 - file d : v1시점부터 항상 유지됨 |
|
file a | a ----------------> a1 ----------> | ||||
file b | b -----> b1 ---------------> b2 | ||||
file c | c -----> c1 ------> c2 ---------> | ||||
file d | d ---------------------------------> | ||||
각 파일에 대한 변화를 저장 |
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ VS ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
Git은 데이터를 "파일 시스템 스냅샷의 연속(=스트림)"으로 취급하고, "저장할 때 파일이 존재하는 그 순간(=스냅샷)"을 관리 (크기↓)
-> 커밋하거나 프로젝트의 상태를 저장할 때 파일이 존재하는 그 순간을 중요하게 여기므로 파일이 달라지지 않았으면 새로 저장하지 않고(성능↑) 단지 이전 상태의 파일에 대한 링크만 저장한다.
v1 | v2 | v3 | v4 | |
file a | a | (link a) | a1 | (link a1) |
file b | b | b1 | (link b1) | b2 |
file c | c | c1 | c2 | (link c2) |
file d | d | (link d) | (link d) | (link d) |
시간순으로 프로젝트의 스냅샷을 저장 |
그러므로 Git으로 무얼 하든 Git 데이터베이스에 데이터가 추가되므로 되돌리거나 데이터를 삭제할 방법이 없다.
일단 스냅샷을 커밋하고 나면 데이터를 잃어버리기 어렵다. Git은 데이터를 추가할 뿐~~
END!
스터디 도움 참조 블로그 (References)
- 버전 관리(VC) 위키백과 https://ko.wikipedia.org/wiki/%EB%B2%84%EC%A0%84_%EA%B4%80%EB%A6%AC - 분산 버전 관리(DVCS) 위키백과 https://ko.wikipedia.org/wiki/%EB%B6%84%EC%82%B0_%EB%B2%84%EC%A0%84_%EA%B4%80%EB%A6%AC - 깃(소프트웨어) = Git 위키백과 https://ko.wikipedia.org/wiki/%EA%B9%83_(%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4) - 누구나 쉽게 이해할 수 있는 Git 입문 https://backlog.com/git-tutorial/kr/ /입문편/Git의 기본/시작하기 https://backlog.com/git-tutorial/kr/intro/intro1_1.html - git--distributed-even-if-your-workflow-isnt (Pro Git Book) https://git-scm.com/book/en/v2 |