일반적으로 우리가 했던 VCS(버전관리시스템)으로 위와 같이 파일이름에 날짜와 버전을 붙이는 방식이다. 그래서 진짜진짜진짜최종이라는 버젼이 생기게 된다. 이런 시스템은 버전이 늘어날 수록 파일수가 계속 늘어나 관리하기가 힘들 것이다.
또한 우리도 글을 쓸 때 내용이 엉키거나 문제가 생겨서 이전의 상태로 되돌릴 때가 많은데 코드를 작성하면 이와 같은 문제가 더더욱 많다. 그렇기에 이전의 코드로 되돌리거나 변경사항을 확인할 때 유용하다.
버전관리는 협업시 유용하다. 여러명이 동시에 한 시스템을 개발할 때 누가 어떤 코드를 언제 수정했는 지의 내역을 확인할 수 있다.
즉 VS의 기능을 정리하면 다음과 같다
VSS의 기능
- 코드 변경 사항 내역 기록 및 관리
- 필요시 이전 상태로 복귀
- 팀단위 개발 시 체계적이고 효과적인 협업
git을 사용해서 파일 버전 관리를 할 때 파일은 다음 3개의 상태중 하나의 상태에 있게 된다.
1) Commited
: 수정사항들이 git에 저장된 상태를 "commited"라고 한다. 이러한 행위가 "commit"이다
2) Modified
: 이름 그대로 수정된 상태이나 아직 "commited"되지 않은 상태의 file을 말한다.
3) Staged
즉 아직 완료는 안되었지만 그래도 중간 상태를 저장할 필요가 있을 때 staging을 사용한다.
1) 소스코드 전체를 다운로드 받습니다 (전문적인 언어로, "git repository를 checkout 한다" 고 합니다).
2) 소스코드 파일들을 수정 합니다. 즉 개발을 한다는 말입니다.
3) 수정한 파일들을 stage 합니다.
4) 그리고 계속 해서 소스코드 파일들을 수정해 나갑니다.
5) 해당 작업이 완료될때까지, 즉 commit 할 준비가 될때까지, 3,4번을 반복합니다.
완료되면 commit 합니다.
git init
: 프로젝트를 git repository로 만들기 위해서 사용하는 명령어이다. 여기서 프로젝트라 함은 개발하고자 하는 소스코드들이 있는 디렉토리를 말한다. git init을 해서 git repo로 만들어야 git으로 버전 관리가 시작된다.
git add
: 수정 사항들, 즉 modified 파일들을 혹은 git repo에 새로 추가된 파일을 staged 상태로 옮기고자 할때 사용하는 명령어 이다. 새로이 추가된 파일들은 "untracked" 파일 이라고 하는데, git에서는 이들도 수정 사항이라고 보기 때문이다.
git commit
: staged 된 파일들을 commit 하고자 할때 사용하는 명령어
git diff
: 어떤 수정사항들이 적용됬는지 보고자 할 때 사용하는 명령어이다. 참고로 staged된 수정사항들은 볼 수 없고 Modified된 파일들만 git diff로 볼 수 있다.
git status
: 현재 상태를 보여주는 명령어이다. 어떤 파일이 modified 어떤 파일이 staged가 되었는지 전체적인 상황을 알려준다.
git log
: commit 내역들을 보여준다. Commit history라고도 한다.
git rm
: 원하는 파일을 git repo에서 삭제한다.
git mv
: 원하는 파일을 git repo상에서 이동 시킬 때 사용한다. 주로 rename할 때 사용
git branch
: branch 생성할 때 사용.
git checkout
어떤 branch를 checkout 할 대 사용되는 명령어.
Git을 사용할 때는 branch 기반으로 개발하기 때문에 git에서 굉장히 중요한 컨셉이다.
Git은 데이터를 단순한 변경사항(diff)으로 저장하지 않고 스냅샷의 연속으로 저장한다.
왜냐면 Git은 빠른 성능을 위해 파일이 달라지지 않았다면 파일을 새로 저장하지 않고 이전 상태의 파일에 대한 링크만 저장한다. 즉 파일의 스냡샷을 시간순으로 저장하는 것이다.
변경사항을 볼 때는 현재 스냅샷과 이전 스냅샷을 비교하여 변경사항을 볼 수 있는 것이다.
이렇게 스냅샷으로 저장되어 있기 때문에 개발자가 central server에서 새로 repo를 checkout 받으면 해당 리포의 어느 특정한 시점의 (일반적으로 가장 최신) 스냡샷을 checkout 받는 것이다.
개발자들이 각자 snapshot을 checkout 받아서 개발하면 어떻게 서로의 변경사항들을 조율할 수 있을까? 어떤 스냅샷을 기준으로 변경사항을 합칠까?
이러한 문제를 해결하기 위해 branch를 쓴다.
이것을 feature branch라고 한다. 각 개발자는 완료 후 commit하면 자신의 feature branch를 다시 master branch로 합하게 된다. 이렇게 합하는 과정을 merge라고 한다.
1) Matser branch를 check out 한다.
2) 자신만의 feature branch를 만든다.
3) Feature branch에서 개발을 한다.
4) 완료되면 commit 한다.
5) Master branch에 feature branch를 merge 한다.