카테고리 없음

백지부터 시작하는 Git & Github(1) - Git 기본

sungw00 2022. 7. 16. 13:46
728x90

1. Git의 역사

- 리눅스를 개발한 리누스 토발즈가 리눅스 커널 프로젝트를 위한 버전 관리 시스템으로 개발
- Git 이전에는 비트키퍼라는 버전관리 시스템을 사용했는데 라이센스가 개정되어 사용할 수 없게 되자 리눅스 커널 프로젝트를 위해 개발됨
- 다양한 버전관리 시스템의 장점을 통합해서 만들었음

2. Git의 초기 목표

- 속도(네트워크 및 파일 처리): 소스 커밋을 위해 반드시 네트워크가 연결되어 있어야 했던 상황이어야만 했는데, Git을 사용함으로써 로컬에 커밋을 할 수 있게 되었음. 이렇게 로컬로 관리하다보니 속도가 빠름, 해시알고리즘을 사용해 파일의 변경 이력을 빠르게 판단하고 변경되지 않은 경우는 이전 파일의 링크만 저장하기 때문에 용량을 적게 차지함
- 동시 다발적인 개발: 신규 기능이 추가되었을 때 전 세계 많은 개발자들이 동시에 여러가지 브랜치를 생성해서 개발하고 이 브랜치들을 지속적으로 머지함으로써 효율적으로 동작함
- 책임성: 라인별로 누가 변경했는지에 대해서까지도 추적이 가능하기때문에 소스를 누가 변경했는지 찾아갈 때 유리함
- 대형 프로젝트를 효율적으로 지원: 리눅스 커널같은 경우 커밋이 65만번인데 이것또한 지원하고 있기 때문에 다른 대형프로젝트도 충분히 수용할 수 있음

3. Git의 동작 원리

1) Git Flow

Git으로 협업하다보면 많은 브랜치가 생성이 되고 그 브랜치가 머지되어 하나의 제품이 만들어짐
Master: Git 저장소 생성 후 첫번째 Commit을 하면 해당 Branch가 Master Branch가 됨
Hotfix: Master에서 파생된 Branch, 중대한 버그가 발견되었을 때 주로 사용하는 Branch
Release: 필요없다와 필요하다로 나뉨, 사용하게 된다면 Develop 브랜치와 같이 사용됨
Develop: 실제적인 개발이 이루어지는 Branch, 신규 기능을 개발하기 위해서는 Feature Branch에서 작업하고 Develop과 Merge하게 됨
주의할 점은 Feature와 Hotfix, Release Branch는 하나만 있지 않고 특히 Hotfix는 여러가지 그룹(폴더)으로 나뉘어지고 여러가지 Hotfix들이 파일로 존재함, Feature Branch도 여러가지 그룹으로 나뉨. 이유는 Develop Branch에서 하나의 기능만 추가하는 것이 아닌 동시에 병렬적으로 여러가지의 기능이 추가되기 때문. 하나의 Branch에서 다른 Branch로 이동하는 것은 Merge했다는 것을 의미함.
Develop에서 Master와 Merge하기 위해서는 Release Branch와 머지해야 함.

 

2) Snapshot

- 데이터를 가져오거나 프로젝트를 저장할 때마다 그 시점의 파일에 대해서 스냅샷을 저장함
- 변경되지 않은 파일은 다시 파일을 저장하지 않고 이전에 지정한 동일한 파일을 링크. 링크한다는 것은 파일을 복사하지 않기때문에 파일이 가진 저장공간을 사용하지 않는다는 뜻. 그러므로 파일 저장공간의 사이즈가 다른 버전관리 시스템보다 작을 수 있게 됨.

 

3) Checksum

- 데이터를 저장하기 전에 파일에 대한 체크섬을 구하고 이 체크섬을 통해 데이터를 관리
- SHA-1 해시(16진수 문자 40개로 구성)를 사용해서 파일 컨텐츠에 대한 해시값을 저장. 파일 이름이 동일해도 내용이 바뀌면 다른 해시값이 나오게 되고, 이 파일이 변경되었는지 추적이 가능함. 하지만 전부 사용하지 않고 앞의 6자리만 사용해서 해당 커밋으로 돌아가거나, 해당 커밋의 내용을 현재 레포지토리에 반영하는것이 가능함.

 

4) Sections
- Git에는 영역이 세가지가 존재함. 로컬저장소, 스테이징영역, 원격저장소
- 원격저장소나 다른 저장소의 프로젝트를 Clone하게 되면 로컬저장소가 생기게됨
- 거기에 파일을 추가하거나 생성하면 로컬저장소에는 스테이징되지 않은 파일 목록에 뜨게 됨. 그 상태에서 관리하는 파일 목록에 추가(add)하면 해당 파일이 스테이징 영역으로 가게 됨. 
- 스테이징 영역에 추가했다고 해서 원격저장소에 해당 파일이 저장되지는 않기 때문에, 특정 영역의 스냅샷을 뜨기 위해선 커밋(commit)을 통해 저장소에 저장해주어야 함. 그렇기 때문에 저장소가 3개(로컬, 스테이징영역, 원격)로 나뉘게 되었음.

728x90