Study Programming/Git

Git 개념 및 개요

네모메모 2021. 6. 30. 22:12
반응형

 

 

 

 

 


 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










   
  
  

 
 

반응형