본문 바로가기

CS 학습 정리

git의 내부 동작 방식

728x90
  • VCS 버전관리 시스템

- 분산형 버전 관리 시스템.

- 파일의 변화를  시간에 따라 기록했다가 나중에 특정 시점의 버전을 다시 불러올 수 있는 시스템을 의미함.

- 과거부터 많은 VCS가 있었고 git이 가장 대표적.

  • git

- 속도, 데이터 무결성, Linux 커널과 같은 대규모 프로젝트를 지원하는 능력에 초점을 맞춤. git은 다양한 명령어와 옵션을 제공해 높은 유연성을 제공하지만 배우는데 시간이 걸림

 

작동 구조:

1. 내가 작업한 것들 (로컬 저장소)

2. 원격 저장소로 밀어내거나 -> push 

3. 원격 저장소의 최신 형상을 내 작업 공간으로 당겨온다. -> pull

 

git의 버전 관리 원리

 

1. 어떠한 코드를 각 완성도 마다 버전 관리를 한다고 하자. 간단하게 덧셈하는 프로그램을 만든다.

 

#include <iostream>

using namespace std;

int add(int a, int b){

}

int main(){

}

 

먼저 이 상태를 1번 상태라고 하자. 함수를 채워넣지는 않았다.

#include <iostream>

using namespace std;

int add(int a, int b){
	return a + b;
}

int main(){

}

 

위 상태가 2번상태, 함수를 모두 채웠다.

 

#include <iostream>

using namespace std;

int add(int a, int b){
	return a + b;
}

int main(){
	cout << add(1, 2);
}

 

위 상태가 3번 상태, 프로그램을 완성했다.

 

그럼 저장된 상태는 총 1,2,3 번이 존재한다. 각 작업들의 순서를 매겨줘서 버전 순서를 기억하게 된다. 하지만 git은 숫자로 인덱싱하지 않고 해시값으로 인덱싱을 한다.

 

그러나 해시값으론 순서를 알 수 없기 때문에, 트리 처럼 부모를 각 노드마다 기록해주어 진행 순서를 알 수 있다.

즉,

 

1번 코드 -> 해시값 12BCA , 부모 없음

2번 코드 -> 해시값 ~~~~~, 부모 : 12BCA

3번 코드 -> 해시값 ,,,,@#@#, 부모 : 2번코드해시값

 

그리고 2번을 가져와서 다른 코드를 만들 수 있다. 

#include <iostream>

using namespace std;

int add(int a, int b, int c){
	return a + b + c;
}

int main(){
	
}

 

이 이제 이 코드의 해시값이 AVDE라면 부모는 ~~~~~가 된다. 즉 분기가 나누어졌다. 나뉜 분기를 구분하기 위해 이름을 붙혀준다.

기존 분기는 2add, 새로운 분기는 3add라고 부를 수 있다.

 

  • GitHub

 

  • Repository

스테이지에서 대기하고 있던 파일들을 버전으로 만들어 저장하는 곳. git은 원격 저장소와 로컬저장소 두 종류의 저장소를 제공한다.

 

  • File

로컬 저장소는 내 PC에 파일이 저장되는 개인 전용 저장소다. 스테이지의 내용은 .git/index 파일에 저장되고, 저장소의 내용은 .git/HEAD에 저장된다. 즉, add 명령어를 통해 index 파일에 저장되고 commit 명령어를 통해 HEAD 저장한다.

  • SHA

git은 commit id를 hash로 사용하는데 이 hash함수를 sha1을 사용하게 된다. sha1 알고리즘으로 생성된 hash 값은 2의 80승 분의 1의 확률로 발생한다.

 

  • staged

add 명령어에 의해 인덱스 파일로 들어간 상태

  • tracking

추적되는 파일로 버전 관리 시스템에 의해 관리되고 있는 파일을 의미, 이는 파일이 커밋에 포함되어 있다는 의미임.

  • modified

수정된 파일이라는 의미로 작업 디렉토리에서 변경되었지만 아직 스테이징 영역에 추가되지 않은 파일을 의미.