1. Git의 탄생
Git은 유닉스, 리눅스에서 시작되었다고 볼 수 있다. 유닉스는 대형 컴퓨터만의 OS였다.
리누스 토르발스는 유닉스를 발전시켜서 개인용 컴퓨터(PC) OS를 만들었다. 바로 Linux 다!
토르발스는 리눅스를 윈도우처럼 판매하지 않고, GNU (General Public License)로 풀어버린다.
오픈소스라고 생각하면 될 것 같다. ("GNU's Not Unix!라는 재귀약어 우스갯소리도 있다...)
대신 일반 공중 사용 허가서(GNU General Public License, GNU GPL 또는 GPL)가 있어야만 하는데, GPL이란 오픈 소스 프로그램 개발자 또는 판매자를 위한 라이선스이다. GPL 파생 저작물 조항에 의해 GNU, GPL 라이선스 프로그램을 사용해 만든 프로그램은 의무적으로 공개하도록 만든 것이다.
그러면 GNU에 의해 오픈소스로 풀린 소프트웨어를 어떻게 개발할까?
여러 명의 협업을 통해 개발한다.
Git이 없을 때는 파일을 각자 따로 만들어서 합쳐야만 했다. 장난아니게 많은 시간이 들었을 것이다.
그래서 나온 것이 BitKeeper이다. BitKeeper은 DVCS(Distributed Version Control Systems: 분산 버전 관리 시스템)으로 Git과 비슷한 프로그램이라고 보면 된다.
그런데 이 프로그램을 유료화하려는 움직임을 보이자 리누스 토르발스는 Git을 만들어버린다.
Git은 리눅스에서 만들었기때문에 똑같이 GNU로 배포되었고, 그 어느 분산 버전 관리 시스템보다 많이 쓰이는 소프트웨어가 되었다.
2. Github
깃허브는 개발자들을 위한 공간, 클라우드 저장소이다.
Public 서비스와 Private 서비스가 존재한다.
과거에는 Private은 유료였었지만, 마이크로소프트 사에서 깃허브를 인수하면서 부분 무료로 바뀌었다.
(처음에 인수했을 때는 Public도 유료화할 거라고 생각했지만... 반대의 행보를 보이고 있다.)
Public 서비스는 MIT 라이선스를 따르는데 이 라이선스는 GPL이랑은 다르다. 소스코드를 공개하지만 오픈소스를 업그레이드했을 때 공개할 의무가 없다!
GitHub의 미래가치를 보고 마이크로소프트는 한화 약 8조원을 들여 인수했다.
아마 소스코드 빅데이터를 얻기 위해 인수한 것이라는 생각이 든다.
이것을 이용해 수많은 레포지토리들을 학습시킨 자동 코드 완성 인공지능인 깃허브 코파일럿도 만들었고, 여러 가지 시도를 해볼 것 같다.
깃허브 홈페이지
3. 버전 관리 시스템
VCS(Version Control System)은 버전을 효율적으로 관리해주는 시스템으로 시간과 용량을 아껴줄 수 있다.
버전 관리 시스템의 종류는 3가지로 로컬 VCS, 중앙집중식 버전 관리 시스템(CVCS), 분산 버전 관리 시스템(DVCS)이 있다. 대체로 VCS라고만 하면 로컬 VCS 의미한다.
VCS를 사용하지 않을 때는 파일을 전체 복제해서 새로운 버전을 만들어야했지만,
버전 관리 시스템을 이용하면 부분 변경를 통해 용량을 굉장히 아낄 수 있다.
로컬 VCS의 단점으로는 백업을 해놓지 않았을 때 바이러스에 굉장히 취약할 수 있다는 점, 협업이 안 된다는 점 등이 있다. CVSC(중앙집중식)는 협업이 안된다는 점을 보완할 수 있다. 하지만, 협업이 까다로운 편이고, 바이러스에 취약한 점은 로컬 CVS와 같다. 오류에도 취약한 편이다.
4. 분산 버전 관리 시스템
분산 버전 관리 시스템은 각 로컬에서 모든 버전에 대한 서버의 백업본을 가지고 있다.
그렇기 때문에 서버에 오류가 발생하거나 오프라인이어도 로컬에서 버전 관리가 가능하다.
서버의 내용이 바이러스에 의해 삭제되도 로컬에서 업로드하면 복구가 가능하다!!!!
로컬에서 관리하기 때문에 속도도 빠르다.
5. Git의 실행 원리
순서
- git init 명령어를 통해 로컬저장소화
- Myfile1.java 파일 폴더에 생성, git에서 변경을 감지
- git add 명령, Myfile1.java 파일을 인덱스 영역으로 이동
- git commit을 통해 V1으로 영구히 저장
- Myfile2.java 파일 폴더에 생성
- git add 명령, Myfile2.java 파일을 인덱스 영역으로 이동
- 해시코드로 관리되고 있는 원래 버전은 새로 들어온 입력값과 해쉬코드를 통해 합쳐짐
- git commit 명령, V2 저장
- Myfile2.java를 수정, git에서 modified 감지
- git add 명령, 수정된 파일 인덱스 영역으로 이동, 해쉬코드로 관리
- git commit 명령, V3 저장
** 용어 설명 **
- BLOB는 Binary Large Object의 약자이다. 바이러니 형태의 큰 객체라는 뜻으로 파일이라고 생각하면 된다.
각각 저장될 때마다 폴더(tree) 묶음이 해시코드로 저장되고, 버전별로 해쉬코드로 저장되어있기 때문에 버전을 바꾸는 것도 간단하다. 부분영역과 전체영역이 백업로그로 관리되기때문에 만약 몇 개 버전이 날라간다고 해도 History가 전부 남아있기때문에 무조건 복구가 가능하다.
ex) V3와 V2가 삭제되고 V1만 남았다. ==> V2와 V3 복구 가능