Git
Git은 Version Control System이다. 즉, 소스코드의 변경사항 내역을 관리하는 시스템이다.
기능
- 코드 변경사항 내역 기록 및 관리
- 필요시 이전 상태로 rollback
- 팀 단위로 개발시 체계적이고 효과적인 협업
Basics
- committed: 수정사항들이 git에 저장이 된 상태를 committed이라고 한다.
- modified: 말그대로 수정된 파일, 아직 커밋이 되지 않은 상태의 파일을 말한다.
- staged: staged file은 modified한 후에 곧 커밋될거라고 마크해놓은 상태이다. 이렇게 중간 상태가 있는 이유는, 커밋하기 전에 중간 상태를 저장할 수 있도록 하기 위해서이다. 커밋을 하면 commit history에 남기도 하고, 커밋 후에도 되돌릴 수 있지만 까다롭기 때문에 중간상태를 저장해놓는다. 커밋은 해당개발이 완료됐음을 의미하기 때문에 중간 상태를 저장하기 위해 staging을 사용한다.
flow
- git repository를 checkout한다.
- 소스코드를 수정한다. 즉 개발을 한다.
- 수정한 파일을 stage한다.
- 계속해서 소스코드 파일들을 수정해나간다.
- commit할 준비가 될때까지 반복한다.
- 완료되면 커밋한다.
git commands
- git init: 프로젝트를 git repository로 만들기 위해 사용.
- git add: modified 파일들을 staged상태로 옮기고자 사용. git repo에 새로 추가된 파일들을 staged상태로 옮길때도 사용된다. 새로 추가된 파일들은 untracked 파일이라고 하는데, 깃에서는 이들도 수정사항이라고 본다.
- git diff: 어떤 수정사항들이 적용되었는지 보고자 할때 사용. staged인 상태는 볼 수 없고 modified된 파일만 볼 수 있다.
- git status: 현재 상태를 보여주는 명령어이다.
- git log: commit 내역들을 보여준다. tig 같은 툴도 있다.
- git rm: 원하는 파일을 git repo에서 삭제하고 싶을때 사용.
- git mv: 원하는 파일을 git repo에서 이동시킬때 사용.
- git branch: 브랜치를 새로 생성할때 쓴다.
- git checkout: 브랜치를 체크아웃할때 쓴다.
- 더 많은 명령어는 이곳을 참고:https://www.git-tower.com/blog/git-cheat-sheet
branch & merging
- 깃을 사용할때는 브랜치 기반으로 개발한다.
- 깃은 데이터를 단순히 변경사항으로 저장하지 않는다. 깃은 파일의 스냅샷의 연속으로 저장한다. 새오 커밋이 들어오거나 프로젝트 상태를 저장할때마다 파일이 존재하는 그 순간을 중요하게 여긴다. 그래서 파일이 달라지지 않았으면 깃은 빠른 성능을 위해 파일을 새로 저장하지 않고 이전 상태릐 파일에 대한 링크만 저장한다.
- 스냅샷으로 저장되어 있어서 개발자가 central server에서 새로 레파지코리를 체크아웃해서 받으면, 해당 리포의 어느 특정 시점의 스냅샷을 체크아웃 받는다.
- 기준이 되는 스냅샷은 master branch이다. 개발자들은 master branch를 먼저 체크아웃하고 거기로부터 자신만의 브랜티를 만든다. 이것을 feature branch라고 하고 개발 후에 커밋을 하면 나중에 마스터 브랜치와 합친다. 이것을 merge한다고 한다.