VCS(version control system)
코드 변경 사항 내역을 기록 및 관리할 수 있고 필요시 이전 상태로 돌아갈 수 있다. 팀 단위 개발시에 체계적이고 효과적인 협업이 가능하다. 때문에 많은 사용자가 이용하고있다.
소스코드의 변경사항 내역을 관리하는 시스템. 로컬 저장소 같은 개념.
깃을 인터넷에서 관리할 수 있는 중앙시스템. 원격 저장소 같은 개념.
첫번째로 가장 간단한 방법은 파일 이름을 사용하는 것. 버전별로 파일이름에 날짜나 버젼을 붙이는 방법. ex) sever.js , server2.js, server3.js ...
이럴 경우 버전수가 늘어날 수록 파일 수가 너무 많아지고 복잡한 파일명으로 인해 한눈에 알아보기 힘들어 보관 및 관리가 불편하다. 이러한 문제를 해결하기위해 수정된 버전 파일들 전체를 디렉토리가 아닌 다른공간에 저장하는 것이다.
이렇게 변경 정보들을 따로 저장한 공간을 version database라고 부른다.
그러나 이렇게 한다면 다른 개발자와 협업이 안된다는 단점이 있다. 다른 개발자들과 협업을 하기 위해서는 version database를 서버에 올려놓고 공유하면되는데, 이를 중앙 버전 관리 시스템 서버(Central VSC server)라고 한다. 수정사항 내역 및 meta정보들은 중앙 서버에서 관리하고, 개발자는 각자 컴퓨터에 최신 버젼 코드들만 중앙서버에서 다운받아서 작업하면 되는 것이다.
하지만 이렇게되면 한가지 문제가 더 발생한다. 바로 중앙 버전 관리 시스템 서버가 다운되면 개발팀 전체의 개발진행이 안된다는 점이다. 이를 해결하기위해 분산 버전 관리 시스템(Distributed Version Control System)이 등장한다. 중앙서버 뿐만아니라 각 개발자의 컴퓨터에도 최신 버전의 코드나 수정사항내역, meta정보들을 전부 다 저장하는 방식이다.
이 모든것을 해결할 수 있는 방법이 바로 git 과 github를 사용하는 것이다.
- 소스코드 전체를 다운 - git repository checkout
- 소스코드 파일들을 수정 - 개발을 하는 것
- 수정한 파일들을 stage
- 계속해서 소스코드 파일들을 수정
- 해당 작업이 완료될 때 까지 , 즉 commit 할 준비가 될 때 까지 3,4번 반복
- 완료되면 commit
Git을 사용할 때는 branch 기반으로 개발한다.
깃은 데이터를 단순한 변경사항으로 저장하지않고 스냅샷의 연속으로 저장하는데, 때문에 저장할 때마다 파일이 존재하는 순간을 중요하게 여긴다. 그래서 파일이 달라지지 않았으면 깃은 빠른 성능을 위해 파일을 새로 저장하지않고 이전상태의 파일에 대한 링크만 저장한다. 즉 수정사항만 저장하는게 아니라 파일의 스냅샷을 시간순으로 저장하는 것이다.
이렇게되면 개발자들이 협업시에 각자의 스냅샷을 체크아웃받아서 개발을 하기때문에 변경사항이 조율하기힘들다. 즉 서로의 변경사항들이 합쳐져서 새로운 최신 버전의 스냅샷을 만드는 과정이 필요한 셈이다. 문제는 어떤 스냅샷을 기준으로 변경사항들을 합치느냐 인데, 이 때 branch를 사용하는 것이다. 말 그대로 큰 줄기에 달린 나뭇가지들을 사용한다고 보면 된다.
개발자가 직접 git 중앙서버를 구현하여 운영하면 여러가지 비용과 시간이 걸리기 때문에 github를 사용한다.
깃허브에서는 코드리뷰, 문서생성 및 관리 등 개발프로젝트 운영 외에도 필요한 여러 기능들을 제공한다.
깃허브를 사용해서 집에서 짠 코드를 저장하여 다른 컴퓨터나 다른 시스템에서 확인이 가능하고 수정도 용이하며 프로젝트를 올린 후에 url을 생성하여 직접 사이트로 구현도 가능하다.
깃허브를 사용할 때 레퍼지토리를 프라이빗으로 생성하게되면 url생성을 할 수 없으니 유의하여야한다. 실수로 레퍼지토리를 프라이빗으로 생성하였다고 해도 다시 퍼블릭으로 변경할 수 있다.