VCS(Version Control System) !?
Git은 VCS(Version Control System)의 플랫폼 중 하나이다. 여기서 VCS는 소스코드(sourcecode)의 변경사항 내역(version)을 관리하는 시스템(system)이다.
VCS의 기능은 다음과 같다
- 코드 변경 사항 내역 기록 및 관리
- 필요시 이전 상태로 rollback
- 팀단위 개발시 체계적이고 효과적인 협업
VCS 종류
많은 사람들이 버전 관리하기 위해 디렉토리로 파일을 복사하는 방법을 사용한다. 디렉토리 또는 파일에 이름과 시간을 넣는다. 하지만 이 방법도 실수로 파일을 잘못 수정할 수도 있고, 잘못 복사할 수도 있어서 디렉토리나 파일관리가 어렵다. 따라서 VCS를 사용하는데 그 사용하는 종류는 크게 3가지로 나누어 진다
로컬 버전 관리

- 로컬 버전 관리 시스템은 간단한 데이터베이스를 사용하여 파일의 변경 정보를 관리한다.
- 로컬VCS로 가장많이 사용하는 도구가 RCS(Revision Control System)이다
- RCS는 기본적으로 Patch Set(파일에서 변경되는 부분)을 관리한다.
- Patch Set은 특별한 형식의 파일로 저장하고, 일련의 Patch Set을 적용해서 모든 파일을 특정 시점으로 되돌릴 수 있다.
중앙집중식 버전 관리(CVCS)

- 여러사람이 한 프로젝트를 진행하다 보면 다른 개발자들과 함께 작업해야하는 경우가 많다. 그때 생기는 문제를 해결하기 위해 CVCS(중앙집중식 VCS)가 개발되었다.
- CVS, Subversion, Perfoce 같은 시스템은 파일을 관리하는 서버가 별도로 있고, 클라이언트가 중앙 서버에서 파일을 받아서 사용(Checkout)gksek.
- 관리자는 누가 무엇을 할지 꼼꼼하게 관리할 수 있다.
- 다만, 중앙 서버에 문제가 발생하면 다른 사람들과 협업할 수 없는 문제가 있다.
- 서버의 데이터베이스 하드디스크에 문제가 있을 경우, 백업할 방법도 없으며 모든 히스토리를 잃어버릴 수 있다.
분산 버전 관리 시스템

- DVCS(분산 버전 관리 시스템)은 Git, Mecurial, Bazaar, Darcs 가 대표적이다
- DVCS에서의 클라이언트는 단순히 파일의 마지막 스냅샷을 Checkout 하지않고, 그냥 저장소를 히스토리와 더불어 전부 각자의 local에 복제한다.
- 서버에 문제가 생기면 이 복제물로 다시 작업을 시작할 수 있다.
- 대부분의 DVCS 환경에서는 다양한 리모트 저장소가 존재하는데, 각각의 사람들은 동시에 다양한 그룹과 다양한 방법으로 협업할 수 있다.
Git

Git은 앞에서 설명했듯이 DVCS(분산버전관리시스템) 중 대표적인 한 시스템으로, Linux개발자인 Linus Torvalds가 개발한 시스템이다.
git의 작업은 local과 github라는 중앙시스템에서 사용가능하며, 폴더는 모두, 전체 기록과 각 기록을 추적할 수 있는 정보를 포함하고 완전한 형태의 저장소를 갖는다.
Git 주요 용어

- Repository : 저장소를 의미하며, 저장소는 히스토리(history), 태그(tag), 소스의 가지치기(branch)에 따라 버전을 저장한다. 저장소를 통해 작업자가 변경한 모든 히스트리를 확인 할 수 있다.


- Remote Repository(원격 저장소) : 파일이 원격 저장소 전용 서버에서 관리되며 여러 사람이 함께 공유하기 위한 저장소.
- Local Repository(로컬 저장소) : 내 PC에 파일이 저장되는 개인 전용 저장소.

- Commit : 현재 변경된 작업 상태를 점검을 마치면, 확정하고 저장소에 저장하는 작업.
- 버그 수정, 기능 추가 등 특별한 의미가 있는 업데이트를 작업 별로 구분해서 각각 커밋하면, 나중에 이력을 보고 특정 변경 사항을 찾기 쉽다.
- commit시 메세지를 꼭 남겨야한다. 메세지가 없으면 실행이 되지 않는다.

- Working Tree : 저장소를 어느 한 시점을 바라보는 작업자의 현재 시점.
- Staging Area : 저장소에 커밋하기 전에 커밋을 준비하는 위치.
- index : commit을 실행하기 전의 저장소와 작업 트리사이에 존재하는 공간.
- stage : commit작업은 작 working tree에 있는 변경 내용을 저장소에 바로 기록하는 것이 아니라 index에 저장하는데, index에 저장할때 파일 상태를 'stage'라 한다.

- push : 내 local repository의 내용을 remote repository에 공유하려면, github로 업로드를 하여야한다. 이것을 Push라 한다.
- clone : remote repository의 내용을 local에 복제하는 것을 clone이라 한다.

- pull : remote repository에 있는 내용을 local repository에 업데이트를 하려면 pull을 실행한다. 원격 저장소의 최신 변경사항 이력을 다운로드하여 내 로컬 저장소에 적용하는 것이다.


- Head : 현재 작업중인 Branch를 가리키는 것.
- Branch : 가지 또는 분기점을 의미하며, 작업을 할때에 현재 상태를 복사하여 Branch에서 작업을 한 후에 완전하다 싶을때 Merge를 하여 작업한다.
- Merge : 다른 Branch의 내용을 현재 Branch로 가져와 합치는 작업을 의미.


- confict : remote repository와 local repository 양쪽에서 동일한 부분을 변경하고 merge한 경우, 두 변경내용중 어느쪽을 저장할 것인지 git은 자동적으로 판별이 되지 않기 때문에 사용자에게 confict(충돌) 라고 알려준다.
Basic Git Commands
git init
- 프로젝트를 git repository로 만들기 위해서 사용하는 명령어
- 프로젝트란 개발하고자 하는 소스코드들이 모여있는 디렉토리
git add
- 소스코드 수정 사항들 즉, modified 파일들을 staged 상태로 옮기고자 할때 사용하는 명령어
- git repo에 새로 추가된 파일들을 staged 상태로 옮길때도 사용
- 새로 추가된 파일들은 'untracked' 파일 이라고 함
git commit
- stated 된 파일들을 commit하고자 할때 사용하는 명령어
git diff
- 어떤 수정사항들이 적용됬는지 보고자 할때 사용하는 명령어
- statged 된 수정사항들은 볼 수 없음.
- modified된 파일들만
git diff
로 볼 수 있음
git status
- 현재 상태를 보여주는 명령어
- 어떠한 파일들이 modified가 되었는지, 어떠한 파일들이 staged가 되었는지 등의 전체적인 상황을 보여줌
git log
- commit 내역들을 보여줌.(Commit history)
tig
추천
git rm
git mv
- 원하는 파일을 git repo 상에서 이동 시킬때 사용.
- 주로 rename할때 사용
git branch
git checkout
- 어떤 Branch를 Checkout 할때 사용되는 명령어.
Branching & Merging

- Matser Branch를 Checkout 한다
- 자신만의 feature branch를 만든다.
- feature branch에서 개발 수정한다.
- 완료되면 commit한다
- master branch에 feature branch를 merge한다
.gitignore
File
git repo에 있는 모든 파일을 전부 commit해야 하는 것은 아니다. 파일들중 commit해야하지 말아야할 파일도 존재한다. 예를들어 개인정보가 들어갈 수 있는 my_settings.py라든지 vim파일이라든지, 또는 csv파일등이 있다. 따라서 이러한 파일들은 commit하지 못하도록 .gitignore 파일을 만들어 미리 지정할 수 있다.